powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по проектированию и наследованиям
31 сообщений из 31, показаны все 2 страниц
Вопрос по проектированию и наследованиям
    #37732139
Alexus_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, возник на работе спор, не спор, о применении интерфейсов.

Суть такова.
Есть монстр интерфейс, назовем его IObject c ~50 членами.
Есть у него 9 реализаций, 8 их них "нормальные", а 9-ая особая (назовем Type9). Нуждается только в ~45 членов.
У соотвественно 5 членов код "реализации" такой:

Код: c#
1.
2.
3.
4.
public string MethodThatNotUseInType9
        {
            throw new NotImplementedException();
        }



При этом, по всему проекту что то типа

Код: c#
1.
2.
3.
4.
if(!isType9) //проверим не 9-ый "ненормальный" ли это тип.
{
    object.MethodThatNotUseInType9();
}



Мне не нравится продуктивный код с throw new NotImplementedException(); Мне кажется - это плохо.
Я предложил сделать так


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface IObjectBase
{
public string MethodThatNotUseInType9();
}

interface IObjectExtenderForType9: IObjectBase
{
public string MethodThatUseInType9();
}

public class BaseObject: IObjectBase
{
}

public class ObjectType9: IObjectExtenderForType9
{
}



Ну и при применении

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
IObjectBase object=getSomeThing();

if(!isType9) //раз уж итак по всему проекту есть проверки
{
    object.MethodThatNotUseInType9();
}

if(isType9) //раз уж итак по всему проекту есть проверки
{
    (object as IObjectExtenderForType9).MethodThatUseInType9();
}



На что услышал:
"на фиг надо, по всему проекту проверки перестроить, приведения типов добавлять и вообще можно тип неправильно привести и тоже исключение получить."

Что Вы думаете по этому поводу?
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37732161
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus_ruЧто Вы думаете по этому поводу?
1. throw NotImplemented - это относительно нормально. Не то чтобы хорошо, но допустимо. Хотя Ваш подход в целом лучше.

2. Проверки по всей программе - это категорически ненормально и говорит о принципиальной ошибке проектирования. И Ваше предложение никак не меняет здесь ситуации.

Вообще, судя по ситуации, наиболее естественным с точки зрения бизнес-логики методом будет сделать в Type9 пять пустых методов (без всяких исключений), и соответственно повыкидывать дурацкие проверки. Ну а о конкретном случае надо думать, зная детали.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37734297
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus_ruЧто Вы думаете по этому поводу?
они правы.
Оснований для рефакторинга маловато. Преимущества imho не очевидны.
Я делал исключения 2-х типов:
- по бизнес-логике
- системные (туда код может зайти только при фатальных непредвиденных ошибках).
Ну а "особый объект" очень сильно зависит от контекста реального проекта.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37734332
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer2. Проверки по всей программе - это категорически ненормально и говорит о принципиальной ошибке проектирования
+1.
с этого нужно начать. Если существует необходимость в таких проверках, значит там то, что называется "лапшекодом". Ему что первый вариант, что второй не поможет. Только проектирование заново, с нуля. Естественно, не так, как предыдущий.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37734345
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmТолько проектирование заново, с нуля. Естественно, не так, как предыдущий.
Зависит от. Есть такой антипаттерн - отлов несуществующих ошибок - он приводит как раз к таким проверкам, а лечится как я описал выше. Надо смотреть.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37735037
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexus_ruВ общем, возник на работе спор, не спор, о применении интерфейсов....Что Вы думаете по этому поводу?

качество кода - ниже плинтуса. полностью отсутствует ОО подход. консерваторию под слом. но аккуратно. без революций.

или по другому.
нахрена в некой точки проверять объект на предмет собака ли это, чтоб она полаяла? достаточно у всех животных "активировать" голос.

удачи вам
(круглый)
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37784869
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кит - это не рыба, и в жизни есть много аномалий. Например, все люди могут говорить. Но есть немые. Тогда ваш процесс общения выглядит так:

if not Немой: слушать ответ.
if Немой: дать карандаш и бумагу и читать ответ
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785058
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо бы посмотреть, а точно ли эта "девятая реализация", в рассматриваемой модели, должна быть отдельным классом? Или это все же особенность "восьмой реализации", и не более того?

Если мы решили, что это все же класс, то получается иерархия

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TЧеловек
  function Спросить(Вопрос): TStrings; virtual; abstract;

TГоворящий=class(TЧеловек)
  function Спросить(Вопрос): TStrings; override;
     Динамик.Пропищать(Вопрос);
     result := Микрофон.Слушать();

TНемой=class(TЧеловек)
  function Спросить(Вопрос): TStrings; override;
     Динамик.Пропищать(Вопрос);
     Принтер.Бумагу.ВыплюнутьЛисток(Один);
     result := Сканер.Бумагу.Прочитать();



В этом случае, действительно, никакие проверки на класс объекта в коде не нужны, а если есть - это свидетельство ошибки проектирования. Всегда достаточно вызывать
Код: pascal
1.
человек.Спросить(Вопрос)

.

Но проблема в том, что не всегда оправдано выносить особенности реализации в отдельные классы. Например, если мы строим иерархию классов по профессиям (TАртист, ТТанцор, ТПрограммист), то при отсутствии множественного наследования прилепить класс немых будет затруднительно. В этом случае в базовом классе TЧеловек разумно сделать свойство Говорливость: гврРазговорчивый, гврНемой, и реализовать function Спросить:

Код: pascal
1.
2.
3.
4.
5.
function TЧеловек.Спросить(Вопрос): TStrings;
   if Говорливость = гврРазговорчивый then
     ...
   else
     ...



Здесь проверка на способность говорить уместна, поскольку это не проверка на класс, а просто свойство, влияющее на реализацию конкретного метода. Таких свойств может быть много - "Вегетарианец" (влияет на procedure Накормить) "Непьющий" (procedure Напоить), и т.д. - не лепить же по классу на все эти вещи.


Другое предположение - может быть, ТС нужен базовый интерфейс в 45 членов с девятью реализациями, и наследник с еще пятью свойствами, реализованный во всех классах, кроме девятого? Подробности в студию!
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785583
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddКит - это не рыба, и в жизни есть много аномалий. Например, все люди могут говорить. Но есть немые. Тогда ваш процесс общения выглядит так:

if not Немой: слушать ответ.
if Немой: дать карандаш и бумагу и читать ответ
В процедурном программировании - именно так. В ООП-стиле же это один из основных антипаттернов, а правильное решение называется "полиморфизм". Без всяких if-ов.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785690
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВ процедурном программировании - именно так. В ООП-стиле же это один из основных антипаттернов, а правильное решение называется "полиморфизм". Без всяких if-ов.

А есть еще "разрыв шаблона" и "умение мыслить нестандартно". Вопрос, что лучше решается в каждой ситуации. Часто нет смысла городить огород, стараясь достичь "совершенства".
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785693
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddА есть еще "разрыв шаблона" и "умение мыслить нестандартно".
Конечно, есть. Только не следует забывать верифицировать решения здравым смыслом - в противном случае оное слишком часто оказывается (повторным) изобретением велосипеда с квадратными колёсами.

neodddЧасто нет смысла городить огород, стараясь достичь "совершенства".
Всегда есть смысл стремиться к совершенству. Вопрос в том, что совершенство обычно далеко от "самая сложная и изощрённая конструкция из возможных". Но, например, в случае топикстартера несовершенство более чем очевидно.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785695
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВсегда есть смысл стремиться к совершенству.

Я бы сказал, что это - антипаттерн. Совершенная программа никому не нужна, потому что стоимость ее разработки превзойдет полученную выгоду.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785697
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddsoftwarerВсегда есть смысл стремиться к совершенству.

Я бы сказал, что это - антипаттерн. Совершенная программа никому не нужна, потому что стоимость ее разработки превзойдет полученную выгоду.
Вы неправильно понимаете смысл слова "совершенство". Шаблонно, я бы сказал.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785822
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddСовершенная программа никому не нужна
истину глаголите
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785960
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВы неправильно понимаете смысл слова "совершенство". Шаблонно, я бы сказал.

Мой взгляд на это такой: на данный момент никто не знает, что такое совершенство в программировании. Мы еще находимся на этапе наскальных рисунков. Если программные "рисунки" помогают пещерным пользователям "охотиться", то совершенно неважно как прорисованы детали "медведя". Переедем в новую "пещеру", нарисуем по-новой.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37785986
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neoddd, скорее не "что", а "как". Совершенство в программировании в общем то же, как и в остальной инженерной науке.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786059
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Alexus_ruЧто Вы думаете по этому поводу?
они правы.
Оснований для рефакторинга маловато. Преимущества imho не очевидны.
Я делал исключения 2-х типов:
- по бизнес-логике
- системные (туда код может зайти только при фатальных непредвиденных ошибках).
Ну а "особый объект" очень сильно зависит от контекста реального проекта.

Уже одно это :
"Есть монстр интерфейс, назовем его IObject c ~50 членами."
-- основание для рефакторинга.

Надо разбивать на маленькие атомарные интерфейсы. И видимо им это будет трудновато сделать.

Ну а если MethodThatNotUseInType9() неприменим к объекту класса Type9, то это, извините,
грубая ошибка проектирования, т.к. класс Type9 не является подтипом своего предка.

Что тут делать -- сказать сложно, потому что это всё завязано на семантику этих неприменимых
методов. Ну, как уже сказали, где-то можно их реализовать пустыми, возвращающими пустое значение
и т.п. Но где-то это видимо не прокатит.

То, что ты предлагаешь сделать странно -- надо делать наоборот, выделить чистый подкласс с методами, которые используются везде, от него унаследовать подкласс с методами, которых НЕТ в Type9, и Type9 наследовать от БАЗОВОГО, но не РАСШИРЕННОГО класса.

Т.е.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
interface IObjectBase
{
public string MethodThatUseInType9();
}

interface IObjectExtenderForType9: IObjectBase
{
public string MethodThatNotUseInType9();
}

public class BaseObject: IObjectExtenderForType9
{
}

public class ObjectType9: IObjectBase
{
}



Но это (как сказали в теме уже) не особенно поможет, потому что всё равно надо будет проверять тип объекта.

Но это уже будет шаг вперёд, нормальный дизайн, и далее вы уже сможете лечить конкретно эту проблему --- лечится применением разных паттернов проектирования, конкретно, если мне не изменяет память, визитором, или фасадом.
Это уже другой вопрос, надо отдельно рассматривать.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786062
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddsoftwarerВ процедурном программировании - именно так. В ООП-стиле же это один из основных антипаттернов, а правильное решение называется "полиморфизм". Без всяких if-ов.

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

Не в этом случае.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786176
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddМой взгляд на это такой: на данный момент никто не знает, что такое совершенство в программировании. Мы еще находимся на этапе наскальных рисунков. Если программные "рисунки" помогают пещерным пользователям "охотиться", то совершенно неважно как прорисованы детали "медведя". Переедем в новую "пещеру", нарисуем по-новой.
люблю такие ассоциации :)
Хорошо ложится на:
"Программирование, это не ремесло, а искусство" :)
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786197
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123"Программирование, это не ремесло, а искусство" :)
здесь как прокладывании тропинок: можно сделать ровные, выложенные плиткой тротуарчики, но в обход, потому что так красиво. В результате будет неудобно, но типа "правильно". Со временем начнется топтание газонов. А можно просто использовать простые прямые тропинки. Действительно искусство.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786752
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123"Программирование, это не ремесло, а искусство" :)
авторДействительно искусство

Я и говорю - искусство. На стадии наскальных рисунков. Вот и хвалит каждый пещерный художник свой пещерный подход.

А критерием настоящего совершенства является хотя бы то, что творение может пережить своего создателя :)
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786835
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddА критерием настоящего совершенства является хотя бы то, что творение может пережить своего создателя :)Чушь. Колесцовый замок на полтысячелетия пережил создателя, а какой-нибудь Ла-7 и жил-то всего несколько лет. Но это показатель не совершества, а исключительно скорости технического прогресса.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786851
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНо это показатель не совершества, а исключительно скорости технического прогресса.

Жил-был хан и захотелось ему чего-то необыкновенного. Он, как-водится, призвал мастеров и один мастер сделал вещь, которая хану безумно понравилась. Хан спросил мастера, может ли он сделать еще такую же. Мастер сказал, что наверное да. Тогда хан приказал выколоть мастеру глаза, чтобы одному обладать этой уникальной вещью.

Если бы хан заказал разработку ПО, он бы горько пожалел о сделаном, потому что без поддержки разработчика наслаждаться творением он бы не смог :)

Как-то так совершенство меряется.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786887
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neodddЕсли бы хан заказал разработку ПО, он бы горько пожалел о сделаном, потому что без поддержки разработчика наслаждаться творением он бы не смог :)
Не судите по своим творениям ;-) Я вот до сих пор иногда с удовольствием запускаю диггера, пакмана, принца, мастер оф орион и ряд других программ, разработчиков которых нынче вряд ли найдёшь.

neodddКак-то так совершенство меряется.
Напоминаю, что Вы продолжаете путать инженерное совершенство с художественным. Что, впрочем, вполне естественно, учитывая, сколько не-инженеров набежало в программирование за деньгами.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786922
neoddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак-то так совершенство меряется.
softwarerЯ вот до сих пор иногда с удовольствием запускаю диггера, пакмана, принца, мастер оф орион и ряд других программ

Именно это я и говорю.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786973
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
neoddd, что именно? Что они пережили своих создателей? Что они до сих пор (художественно) интересны? Или может быть - что уровень их исполнения приводит к тому, что они до сих пор отлично работают?
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37786979
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerони до сих пор (художественно) интересны?
сама идея игры
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37789980
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iscrafmsoftwarerони до сих пор (художественно) интересны?
сама идея игры
И?

Не думаю, что я понял смысл этой реплики, но она звучит так, будто это доказало что-то из того, что я оспариваю.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37790087
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ООП - ерунда
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37790133
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwareriscrafmпропущено...

сама идея игры
И?

Не думаю, что я понял смысл этой реплики, но она звучит так, будто это доказало что-то из того, что я оспариваю.
она звучит по-русски следующим образом:
- они до сих пор (художественно) интересны?
- интересна сама идея игры

как точней перевести я, к сожалению, не совсем понимаю.
...
Рейтинг: 0 / 0
Вопрос по проектированию и наследованиям
    #37791333
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosООП - ерунда

вы правы на все 100.
Но она пока - единственная методология как, с наименьшими затратами перейти от замысла к коду...

поправьте меня, если это не так

(круглый)
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по проектированию и наследованиям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]