Абстракция должна быть упакована с модулями высокого уровня?

Wiki говорит

При прямом применении инверсии зависимостей абстракты принадлежат верхним / политическим уровням. Эта архитектура группирует компоненты более высокого уровня / политики и абстракции, определяющие более низкие службы, вместе в одном пакете. Уровни нижнего уровня создаются путем наследования / реализации этих абстрактных классов или интерфейсов.

В идеале, как также сказано в статье вики (в подходе 2 в разделе «Реализация»), модуль абстракции должен быть отдельным модулем для слабой связи,

Но у меня есть вопрос по подходу 1 с цитируемым заявлением. По моему опыту, везде, где 2 не реализованы / не возможны, я всегда видел, что классы абстракции упакованы с модулями низкого уровня вместо модуля высокого уровня.

Недостатком упаковки абстракции / интерфейсов с пакетами высокого уровня является то, что если есть 10 модулей высокого уровня, вызывающих данный модуль низкого уровня, то нам нужно упаковать интерфейсы во всех 10 модулях. Считайте, что мне нужно добавить один метод в интерфейс, мне нужно изменить все 10 модулей, чтобы добавить этот метод. Не правда ли? Итак, согласно моему пониманию, классы абстракции должны быть упакованы с модулями низкого уровня вместо модулей высокого уровня.

Поправьте меня Если я здесь не прав?


person emilly    schedule 17.09.2017    source источник


Ответы (1)


Я не соглашусь с вашей точкой зрения: «Я всегда видел, что классы абстракции упакованы с модулями низкого уровня, а не с модулями высокого уровня». Если бы вы видели то же самое, тогда этот дизайн класса определенно был бы неправильным.

Давайте сравним абстракцию с примером из реального мира. Скажем, у вас есть электрический выключатель / розетка, думайте, что это абстракция / интерфейс или модуль высокого уровня. Socket не знает, к какому устройству он подключается. В этом случае устройства являются модулями низкого уровня. Фактически сокет (модуль высокого уровня) не хочет знать, к каким модулям (устройствам) низкого уровня он подключается. К нему может подключаться любое устройство, совместимое с этим разъемом. совместимость - это своего рода реализация абстракции (сокета). Только те устройства, которые предназначены для подключения только к этой розетке, могут подключаться к розетке. Скажем, устройства, предназначенные для Индии, не могут подключаться к розеткам в Великобритании. Теперь, если модуль высокого уровня знает о модулях низкого уровня, это эквивалентно разработке сокетов для каждого устройства, потому что в этом случае устройство не основано на абстракции.

Теперь, чтобы ответить на ваш вопрос о реализации интерфейса для всех классов, если есть изменение, иногда мы не можем этого избежать, но при разработке абстракции не делайте ее жирной (принцип разделения интерфейса). Логически группируйте интерфейсы, а не объединяйте все в один интерфейс. При разработке интерфейса много раз подумайте над группировкой. Я согласен, тем не менее, мы закончим тем, что добавим больше поведения к интерфейсу и в конечном итоге имплементируем его в классах. Но если мы спроектируем взаимодействие в логической группе, то такая реализация будет необходима всем классам.

person Vijayanath Viswanathan    schedule 20.09.2017
comment
Я вижу устройство как модуль высокого уровня вместо сокета, потому что устройство использует сокет, а не наоборот. - person emilly; 24.09.2017