Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1

Дублирующиеся свойства - наследование, интерфейс?

02.11.2018, 13:42. Показов 2957. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: создать редактор тэгов для SCADA.
Возник вопрос на этапе проработки предметной области.
Тэги (технологические переменные) можно классифицировать:
- по типу значения: дискретные, числовые, строковые;
- по типу доступа: внешние (I/O), внутренние (memory).

Оба эти "атрибута" обязательны для любого тэга.

При наследовании получается дублирование свойств в разных ветвях наследования:



Как этого избежать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2018, 13:42
Ответы с готовыми решениями:

Наследование и интерфейс
Уважаемые специалисты, мой вопрос посвящен простому наследованию(код ниже прилагается).Я специально сделал классы максимально...

Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo
Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo(). Создать 2...

[DOM API] В объектах элементов есть дублирующиеся свойства?
var headingEl = document.querySelector("#heading"); headingEl.style = "black"; var headingEl =...

15
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
02.11.2018, 13:56
Цитата Сообщение от NewOrdered Посмотреть сообщение
наследование, интерфейс?
Если использовать интерфейс, то реализовывать его Вы обязаны в каждом классе,
а если наследуете, то пишите уникальный код только у предка и наследуете поведение,
в общем и целом, если и нужно добавить функционал, то просто дописываете у потомка.
Я за наследование - меньше писать кода (и поддерживать его).
1
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
02.11.2018, 14:00
Цитата Сообщение от NewOrdered Посмотреть сообщение
При наследовании получается дублирование свойств в разных ветвях наследования:
А) Это нормально и не страшно, если такого дублирования не сильно много;
Б) Может быть на самом деле у вас меньше классов в иерархии, чем вы понапроектировали?
1
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
02.11.2018, 14:56  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Может быть на самом деле у вас меньше классов в иерархии, чем вы понапроектировали?
Конечных типов у меня все равно получается как минимум 6 (для упрощения понимания на диаграмме изображены только 4).

В моем случае, конечно, дублирования мало, да и никакой сложной логики в геттерах/сеттерах не предвидится (пока).
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
02.11.2018, 16:47
Лучший ответ Сообщение было отмечено NewOrdered как решение

Решение

NewOrdered,
Можно сделать так.
Выделите группы свойств, которые всегда появляются вместе. Вынесите их в отдельный класс. Например:
C#
1
2
3
4
5
6
7
class DiscreteTag
{
      string OnMessage{get;set;}
      string OffMessage{get;set;}
      AlarmState AlarmState{get;set;}
      int AlarmPriority{get;set;}
}
Сами же классы тегов сделайте составными:
C#
1
2
3
4
5
6
class MemoryDiscreteTag
{
     CommonTag Common{get;}
     DiscreteTag Discrete{get;}
     MemoryTag Memory{get;}
}
Это вроде будет паттерн мост.
3
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
02.11.2018, 17:31
Цитата Сообщение от NewOrdered Посмотреть сообщение
никакой сложной логики в геттерах/сеттерах
А я бы не стал увлекаться написанием логики в геттерах/сеттерах. Потому что это
обычно ведёт к взаимозависимости, весьма вредной, одних свойств от других...
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
02.11.2018, 18:50  [ТС]
ashsvis, так я и не пишу. По задумке эти конечные классы должны быть чем-то вроде DTO.
Но похоже, что придется по совету Storm23 делать модель более сложную, но универсальную.
0
 Аватар для ashsvis
923 / 503 / 202
Регистрация: 08.10.2018
Сообщений: 1,553
Записей в блоге: 11
02.11.2018, 19:04
Цитата Сообщение от NewOrdered Посмотреть сообщение
делать модель более сложную, но универсальную.
Да, развлекайтесь, если есть время для этого...
0
02.11.2018, 19:24  [ТС]

Не по теме:

ashsvis, если эти "развлечения" помогут мне избавиться в будущем от многих часов монотонной работы то почему бы и нет

0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
04.11.2018, 17:57  [ТС]
Storm23, Если CommonTag при любой классификации является вершиной иерархии, есть ли смысл конечным классам просто наследоваться от него?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.11.2018, 18:45
Цитата Сообщение от NewOrdered Посмотреть сообщение
Если CommonTag при любой классификации является вершиной иерархии, есть ли смысл конечным классам просто наследоваться от него?
Думаю, что наследоваться от него нельзя. Это противоречит логике моста.
Допустим у вас в будущем появятся две разные версии CommonTag: CommonTagA и CommonTagB - что вы будете делать с остальной иерархией?
Ваши Теги должны быть просто композицией, и не должны ни от чего наследоваться.
1
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
04.11.2018, 19:45  [ТС]
В итоге вместо стройной иерархии наследования получилась паутина композиций
Тот случай, когда код выглядит нагляднее
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
04.11.2018, 20:54
Цитата Сообщение от NewOrdered Посмотреть сообщение
В итоге вместо стройной иерархии наследования получилась паутина композиций
Тот случай, когда код выглядит нагляднее
У Вас с левой стороны дублируются во всех классах два свойства Common и Memory. Это намерено? При такой структуре, допустим, в классе CommonTag получится три пары таких свойств.

Добавлено через 5 минут
А для уменьшения визуальной путаницы в картинке - переставьте MemoryIntegerTag и AnalogTag наверх.
0
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
04.11.2018, 21:24  [ТС]
Элд Хасп, Слева - классы, описывающие сущности предметной области, справа - вспомогательные классы, содержащие общие свойства для композиции.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.11.2018, 23:58
Лучший ответ Сообщение было отмечено Элд Хасп как решение

Решение

Цитата Сообщение от NewOrdered Посмотреть сообщение
В итоге вместо стройной иерархии наследования получилась паутина композиций
Давайте разберемся.

Во-первых никто не обещал что классов станет меньше. Нет такого паттерна "сделать меньше классов".
(тогда бы мы его применили рекурсивно, и у нас остался бы один класс, хе-хе )

Во-вторых. У вас на исходной диаграмме на самом деле столько же зависимостей, если не больше. Да, у вас только одна стрелка до MemoryDiscreteTag. Но неявно он все равно зависит и от своего дедушки Tag и от нерожденного родственника DiscreteTag. Просто на второй диаграмме мы стали честнее и выразили все связи явно.

В-третьих. Вторая диаграмма лучше первой. Каждое свойство предметной области в ней упоминается только один раз.
Поэтому если вы добавите логику, то эта логика будет сидеть только в одном свойстве, а не в нескольких. Кроме того, если вы поменяете какие-то свойства, вам придется менять их только в одном классе. Остальные классы останутся неизменным.
То есть стало меньше поводов для изменения класса. А это хорошо.

Ну и самое главное. Сейчас, что бы создать новый тег, вам просто нужно скомбинировать несколько более простых классов. А в иерархии вам бы пришлось навернуть еще один ярус дерева, с экспоненциальным ростом числа классов.
2
478 / 241 / 74
Регистрация: 25.05.2012
Сообщений: 1,138
Записей в блоге: 1
05.11.2018, 19:12  [ТС]
Всем спасибо за участие!


Не по теме:

Ждите новых вопросов в духе
- а как всем эти хозяйством теперь управлять
- и как черт возьми экспортировать это все в .csv по заданному шаблону :D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.11.2018, 19:12
Помогаю со студенческими работами здесь

Наследование (свойства и метод)
Всех приветствую! У меня следующий вопрос. Есть у меня загрузчик, который подгружает сначала файл controller.php, который в свою очередь...

Наследование свойства filter
Добрый день уважаемые. Тут с вопросом столкнулся, может и детский, но всё же...как сделать так что б filter: grayscale(1) не наследовался...

Прототипное наследование свойства [[Call]]
В общем, созрел у меня такой вопрос: Есть некий код (вот он, собственно)// just function f = function(x){return x;}; // just...

Наследование, анимация, шарик. Реализовать 3 объекта TBall2, наследующие все свойства от TBall
Здравствуйте, товарищи. Вот делал я один проект - там шарики летают по форме, шарики все занесены в массив Balls, каждый элемент которого...

"Наследование" свойства border в ячейках таблицы
Здравствуйте! Хочу выделить ячейку таблицы, задав ей свойство border, но при этом получается "сдвиг" другой ячейки: следующий...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
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 Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru