Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25

Оценить код с точки зрения принципов ООП и корректность в целом

07.04.2015, 15:48. Показов 1686. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Извиняюсь заранее, если не в ту тему не с той просьбой. Прошу посмотреть код, оценить его с точки зрения принципов ооп да и правильность в целом. Имею желание перестать говнокодить, вот первая попытка.
Описание: имеем абстрактный класс Animal, с 3 защищенными полями и 2 виртуальными методами. От этого класса наследуются 3 класса потомка, в которых описан конструктор и переопределен метод ShowInfo(). В главном методе Main() создаем экземпляры классов с параметрами и вызываем методы базового и производных классов.
Animal.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
abstract class Animal
{
protected string _tip;
protected string _name;
protected int _ves;
 
public virtual void ShowInfo()
{
Console.WriteLine("Меня зовут {0}, я {1} и мой вес {2} кг.", _name, _tip, _ves);
}
public virtual void Sound(){}
}
Main.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
 
class Program
{
static void Main()
{
Cat cat = new Cat("Вася", 11);
Dog dog1 = new Dog("Бобик", 16);
Dog dog2 = new Dog("Бобище", 27);
Fox fox = new Fox("Патрикеевна", 16);
 
cat.ShowInfo();
cat.Sound();
dog1.ShowInfo();
dog1.Sound();
dog2.ShowInfo();
dog2.Sound();
fox.ShowInfo();
fox.Sound();
 
Console.ReadKey();
}
}
Cat.cs(аналогично созданы классы dog и fox)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
class Cat:Animal
{
public Cat(string name, int ves)
{
_tip = "кот";
_name = Name;
_ves = Ves;
}
public override void Sound()
{
Console.WriteLine("Я говорю мяу");
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2015, 15:48
Ответы с готовыми решениями:

На сколько приведенный код неправильный с точки зрения ООП?
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; ...

Программа с точки зрения ООП
Есть вопрос, на который однозначного ответа у меня пока что нет. Прошу помощи в разборе полетов Вопрос "Что представляет собой...

Прошу оценить два сайта с точки зрения пользователя
Доброго времени суток! Есть два сайта одной тематики, разработаны они нашей веб-студией, оптимизацией занимаюсь я. Клиенты...

18
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
07.04.2015, 15:56
Firik67, немного по другому написанный код не вызвал бы резкой критики, однако, если не в красоте дело, то какую еще цель преследуете?
0
418 / 316 / 241
Регистрация: 29.05.2010
Сообщений: 796
Записей в блоге: 1
07.04.2015, 15:58
Firik67, Метод Sound должен быть с модификатором abstract.
Цитата Сообщение от Firik67 Посмотреть сообщение
_tip = "кот";
Это избыточность
Цитата Сообщение от Firik67 Посмотреть сообщение
public virtual void ShowInfo()
Почему виртуальный, если он не переопределяется в производных классах?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.04.2015, 16:06
Firik67,
1) Оформление кода - отсутствует.
2) _tip = "кот"; - как уже сказали избыточно. Если класс уже Cat, зачем прописывать _tip да еще и строкой?
3) Русские слова латинскими буквами...
4) Конструктор Cat должен вызывать базовый конструктор в который должен передавать string name, int ves.
5) _name = Name; - вообще ошибка, Name - нет такой переменной.
6) Console.WriteLine внутри методов класса - жуть.

И да, говнокодить можно и обвешавшись абстрактными классами.
2
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.04.2015, 16:19
К сказанному выше: избавляемся от генов китайца:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
var animals = new Animal[]
{
   new Cat("Вася", 11),
   new Dog("Бобик", 16),
   new Dog("Бобище", 27),
   new Fox("Патрикеевна", 16)
};
 
foreach (var animal in animals)
{
   animal.ShowInfo();
   animal.Sound();
}
0
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25
07.04.2015, 17:12  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Firik67,
1) Оформление кода - отсутствует.
2) _tip = "кот"; - как уже сказали избыточно. Если класс уже Cat, зачем прописывать _tip да еще и строкой?
3) Русские слова латинскими буквами...
4) Конструктор Cat должен вызывать базовый конструктор в который должен передавать string name, int ves.
5) _name = Name; - вообще ошибка, Name - нет такой переменной.
6) Console.WriteLine внутри методов класса - жуть.

И да, говнокодить можно и обвешавшись абстрактными классами.
1. Оформление в смысле отступы? Дико извиняюсь, но пишу с телефона вручную, табов тут нет
2. В данном случае прописано для вывода в консоль, что именно за животное. В коде понятно, а при исполнении программы нигде не видно, что Вася это кот. Если есть вариант сделать иначе, буду рад увидеть.
3. Исправлю, как только доберусь до переводчика.
4. Годно, переделаю.
5. Мой косяк, должно быть name и ves.
6. Почему жуть и как лучше делать?
Вообще пишу код, используя только компилятор csc и виндовый блокнот

Добавлено через 5 минут
Цитата Сообщение от kypiwindy Посмотреть сообщение
Firik67, Метод Sound должен быть с модификатором abstract.
Это избыточность

Почему виртуальный, если он не переопределяется в производных классах?
Почему именно abstract, а не virtual? Это же вроде одно и тоже, разница в том, что virtual позволяет создать тело метода. Но так как оно тут не нужно, поэтому и abstract?
По поводу ShowInfo. Мой косяк, забыл исправить.

Добавлено через 8 минут
А вообще, принципы ооп здесь реализованы?

Добавлено через 6 минут
Цитата Сообщение от Storm23 Посмотреть сообщение
6) Console.WriteLine внутри методов класса - жуть.
Я так понял, что мой поход не универсален. В общих чертах, нужно заменить на функцию, которая возвращает строковый параметр, а в методе Main уже вызывать Console.WriteLine()?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.04.2015, 17:25
Цитата Сообщение от Firik67 Посмотреть сообщение
2. В данном случае прописано для вывода в консоль, что именно за животное. В коде понятно, а при исполнении программы нигде не видно, что Вася это кот. Если есть вариант сделать иначе, буду рад увидеть.
Сделайте виртуальное свойство, которое будет возвращать строку с названием животного. В классах -потомках возвращайте строку-константу. Хотя у меня в принципе есть сомнения что это нужно.
Цитата Сообщение от Firik67 Посмотреть сообщение
6. Почему жуть и как лучше делать?
Ох, тут много можно писать. Самое очевидное - класс у вас жестко привязан к консольному приложению. А что если вы захотите сделать WinForms ? А что если это будет серверное приложение? Сервис? Web-сервис? И еще туевая хуча юзекейсов. Получается ваш класс не сможет работать во всех этих приложениях, просто потому что у них нет консоли. Кроме того, здесь нарушается принцип единственной ответственности класса. А еще здесь наблюдается скрытое поведение метода - мы вызываем метод данного объекта, а он внезапно(!) оказывает действие на какой-то третий объект (консоль).
Цитата Сообщение от Firik67 Посмотреть сообщение
Вообще пишу код, используя только компилятор csc и виндовый блокнот
Завязывайте с хардкором.

Да и еще, название метода Sound() - неправильное, метод должен содержать глагол.
А еще, создавать отдельный класс для каждого животного - плохая идея.
А еще, передавать вес животного в конструктор - плохая идея, вес может меняться.
А еще, ООП - это способ решения практических задач. Написав сферические классы в вакууме вы не научитесь решать задачи с ООП.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.04.2015, 17:42
Цитата Сообщение от Firik67 Посмотреть сообщение
Вообще пишу код, используя только компилятор csc и виндовый блокнот
не слушайте тех, кто вам советует писать без IDE в блокноте, с завязанными глазами и одной рукой за спиной
Так обычно говорят люди, которые среду не смогли осилить, и пытаются корчить из себя экспертов

Известный анекдот: "Как получить случайную строку? Попросить виндузятника выйти из vim"
Среда - это инструмент. Что вы сказали бы про монтажника, который обжимает кабель зубами, и ими же зачищает провод? Что он хардкорный профессионал? Да, умение работать без инструментов нужно, но вот хвалиться этим, это как хвалиться, что пришлось месяц жить на хлебе с водой, потому что ЗП задержали - кто-то реально этим понтуется, но объективно это человеческое несчастье
1
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
07.04.2015, 17:46
Firik67, Сколько людей - столько будет и мнений. Всем не угодить.
Нужно выбрать для себя принципы, к примеру:
1) Не писать похожий код много раз
2) Делить задачу на маленькие абстрактные кирпичики (здесь обычно делают мильярд каких-то методов непонятных)
3) Собирать вместе (в одном классе) поля/свойства/методы так, чтоб другие классы "не имели своего мнения о том, как что должно делаться в чужом огороде". Чтобы не было причин менять что-то в одном классе, потому что появился другой, которому надо "по другому, чтоб было".

В ООП есть принципы, которые можно понимать по разному (так и делают).
В языке есть особенности, которые позволяют принципы ООП реализовать.
Остается совсем плевое дело - приноровиться к тому и другому. Это приходит с опытом. Другие мега программеры просто будут вас тыркать своими знаниями о языке и своими догадками о том, какую задачу вы решаете и как сделали бы они сами.

Еще раз - на словах бормочим одно, на деле - думаем над алгоритмом и особенностями языка. Надо сделать быстрее и короче или гибче с прицелом на перемены, решайте каждый раз самостоятельно. Если проект большой, то сразу делите задачу на маленькие, самодостаточные и дружите их вместе. Не упускайте особенности языка, которые экономят место листинге с кодом.
0
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25
07.04.2015, 18:03  [ТС]
По поводу блокнота да, хардкор, но он вынужденый. Другого на работе нет, а то что есть выдрано из microsoft.net)
0
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
07.04.2015, 18:08
Firik67, m$ VS community 2013?
0
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25
07.04.2015, 18:42  [ТС]
Цитата Сообщение от ture Посмотреть сообщение
Firik67, m$ VS community 2013?
Моя работа вообще с программированием не связана, компы в этом плане пустые
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.04.2015, 18:52
Firik67, ну так установите, она ж бесплатная. Надеюсь, 10Гб на винте найдется? Или у вас они тоже 40гб с XP идут?
0
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25
07.04.2015, 19:00  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Firik67, ну так установите, она ж бесплатная. Надеюсь, 10Гб на винте найдется? Или у вас они тоже 40гб с XP идут?
Хуже. Доступ в интернет имеют только рабочие приложения, вместо компов - бездисковые станции, которые работают через вайфай по удаленке с сервером) поэтому и пишу с телефона на форум все. Даже доступ к серверным дискам скрыт) Прав админа нет. Однако мусье извращенец, нашел способ и компилятор
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.04.2015, 19:14
Цитата Сообщение от Firik67 Посмотреть сообщение
пишу код, используя только компилятор csc и виндовый блокнот
Цитата Сообщение от Firik67 Посмотреть сообщение
Другого на работе нет, а то что есть выдрано из microsoft.net
Цитата Сообщение от Firik67 Посмотреть сообщение
Моя работа вообще с программированием не связана
Цитата Сообщение от Firik67 Посмотреть сообщение
мусье извращенец, нашел способ и компилятор
Мне одному кажется, что вы чем-то не тем на работе занимаетесь?
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
07.04.2015, 19:16
Лучше уж тогда онлайн IDE через браузер
0
0 / 0 / 1
Регистрация: 22.10.2014
Сообщений: 25
07.04.2015, 19:27  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Мне одному кажется, что вы чем-то не тем на работе занимаетесь?
Успеваю заниматся всем

Добавлено через 1 минуту
Цитата Сообщение от _exp10der_ Посмотреть сообщение
Лучше уж тогда онлайн IDE через браузер
Нет доступа)

Ну а если таки по теме - основные принципы ооп я реализовал?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.04.2015, 19:33
Цитата Сообщение от Firik67 Посмотреть сообщение
Хуже. Доступ в интернет имеют только рабочие приложения, вместо компов - бездисковые станции, которые работают через вайфай по удаленке с сервером) поэтому и пишу с телефона на форум все. Даже доступ к серверным дискам скрыт) Прав админа нет. Однако мусье извращенец, нашел способ и компилятор
тогда советую проставить админам банку/бутылку пива и попросить поставить студию (объяснить ситуацию), либо если боитесь, попросите VIM, будете бородачем и всё такое На него хотя бы автодополнение и IntelliSense повесить можно, уже хлеб.
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
07.04.2015, 19:57
VsVim наше все
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2015, 19:57
Помогаю со студенческими работами здесь

C# правильность кода с точки зрения ООП
Написал программу для хранения и обработки дерева в БД. Каждая кнопка имеет свой обработчик, который подключается к БД и...

Простой калькулятор с точки зрения ООП
Всем доброго времени суток! Ребята, подскажите пожалуйста на какие логические классы можно разделить примитивный калькулятор ( +, - , * ,...

Прошу оценить, покритиковать сайт с точки зрения юзабилити и СЕО
Прошу оценить, покритиковать сайт с точки зрения юзабилити и СЕО. Вот сайт http://tinyurl.com/yb27x59t Заранее благодарю.

Что здесь не правильно с точки зрения ООП
Делаю себе классы для авторизация через разные соц.сети (в сети есть решения)Но мне не нужен чужой велосипед. Я хочу свое, ибо так я...

Просьба оценить форум с точки зрения дизайна (хотя его как такового нет)
Здравтсвуйте! Прошу Вас оценить форум с точки зрения дизайна.. Знаю что многие скажут: "Дизайн примитивный", делай...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru