Дублирующиеся свойства - наследование, интерфейс?02.11.2018, 13:42. Показов 2957. Ответов 15
Метки нет (Все метки)
Задача: создать редактор тэгов для SCADA.
Возник вопрос на этапе проработки предметной области. Тэги (технологические переменные) можно классифицировать: - по типу значения: дискретные, числовые, строковые; - по типу доступа: внешние (I/O), внутренние (memory). Оба эти "атрибута" обязательны для любого тэга. При наследовании получается дублирование свойств в разных ветвях наследования: Как этого избежать?
0
|
|
| 02.11.2018, 13:42 | |
|
Ответы с готовыми решениями:
15
Наследование и интерфейс Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo
|
|
|
||
| 02.11.2018, 13:56 | ||
|
а если наследуете, то пишите уникальный код только у предка и наследуете поведение, в общем и целом, если и нужно добавить функционал, то просто дописываете у потомка. Я за наследование - меньше писать кода (и поддерживать его).
1
|
||
|
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
|
||
| 02.11.2018, 14:00 | ||
|
Б) Может быть на самом деле у вас меньше классов в иерархии, чем вы понапроектировали?
1
|
||
| 02.11.2018, 14:56 [ТС] | ||
|
В моем случае, конечно, дублирования мало, да и никакой сложной логики в геттерах/сеттерах не предвидится (пока).
0
|
||
|
|
|||||||||||
| 02.11.2018, 16:47 | |||||||||||
Сообщение было отмечено NewOrdered как решение
Решение
NewOrdered,
Можно сделать так. Выделите группы свойств, которые всегда появляются вместе. Вынесите их в отдельный класс. Например:
3
|
|||||||||||
| 02.11.2018, 18:50 [ТС] | |
|
ashsvis, так я и не пишу. По задумке эти конечные классы должны быть чем-то вроде DTO.
Но похоже, что придется по совету Storm23 делать модель более сложную, но универсальную.
0
|
|
| 02.11.2018, 19:24 [ТС] | |
|
Не по теме: ashsvis, если эти "развлечения" помогут мне избавиться в будущем от многих часов монотонной работы то почему бы и нет
0
|
|
| 04.11.2018, 17:57 [ТС] | |
|
Storm23, Если
CommonTag при любой классификации является вершиной иерархии, есть ли смысл конечным классам просто наследоваться от него?
0
|
|
|
|
||
| 04.11.2018, 18:45 | ||
|
Допустим у вас в будущем появятся две разные версии CommonTag: CommonTagA и CommonTagB - что вы будете делать с остальной иерархией? Ваши Теги должны быть просто композицией, и не должны ни от чего наследоваться.
1
|
||
| 04.11.2018, 19:45 [ТС] | |
|
В итоге вместо стройной иерархии наследования получилась паутина композиций
Тот случай, когда код выглядит нагляднее
0
|
|
|
Модератор
|
||
| 04.11.2018, 20:54 | ||
|
Добавлено через 5 минут А для уменьшения визуальной путаницы в картинке - переставьте MemoryIntegerTag и AnalogTag наверх.
0
|
||
| 04.11.2018, 21:24 [ТС] | |
|
Элд Хасп, Слева - классы, описывающие сущности предметной области, справа - вспомогательные классы, содержащие общие свойства для композиции.
0
|
|
|
|
||
| 04.11.2018, 23:58 | ||
Сообщение было отмечено Элд Хасп как решение
РешениеВо-первых никто не обещал что классов станет меньше. Нет такого паттерна "сделать меньше классов". (тогда бы мы его применили рекурсивно, и у нас остался бы один класс, хе-хе )Во-вторых. У вас на исходной диаграмме на самом деле столько же зависимостей, если не больше. Да, у вас только одна стрелка до MemoryDiscreteTag. Но неявно он все равно зависит и от своего дедушки Tag и от нерожденного родственника DiscreteTag. Просто на второй диаграмме мы стали честнее и выразили все связи явно. В-третьих. Вторая диаграмма лучше первой. Каждое свойство предметной области в ней упоминается только один раз. Поэтому если вы добавите логику, то эта логика будет сидеть только в одном свойстве, а не в нескольких. Кроме того, если вы поменяете какие-то свойства, вам придется менять их только в одном классе. Остальные классы останутся неизменным. То есть стало меньше поводов для изменения класса. А это хорошо. Ну и самое главное. Сейчас, что бы создать новый тег, вам просто нужно скомбинировать несколько более простых классов. А в иерархии вам бы пришлось навернуть еще один ярус дерева, с экспоненциальным ростом числа классов.
2
|
||
| 05.11.2018, 19:12 [ТС] | |
|
Всем спасибо за участие!
Не по теме: Ждите новых вопросов в духе
0
|
|
| 05.11.2018, 19:12 | |
|
Помогаю со студенческими работами здесь
16
Наследование (свойства и метод)
Прототипное наследование свойства [[Call]] Наследование, анимация, шарик. Реализовать 3 объекта TBall2, наследующие все свойства от TBall "Наследование" свойства border в ячейках таблицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
/ / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров)
. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|