Когда Efferent / Afferent сцепление хорошо или плохо

11

На этой неделе у меня экзамен по программным паттернам, и одной из тем, которые мы должны изучить, является эфферентная и афферентная связь.

Я понимаю, что пакет имеет высокий Ce (эфферентное связывание), если это зависит от ряда других типов.

Например:

class Car{
    Engine engine;
    Wheel wheel;
    Body body;
}

Этот класс будет иметь высокую эффективность сцепления, потому что это зависит от типа двигателя, колеса и кузова.

Принимая во внимание, что у типа «Колесо» был бы высокий Ca (афферентная связь), если бы от него зависело несколько других пакетов (Car, Plane, Bicycle).

Один из возможных вопросов на нашем экзамене: когда Efferent / Afferent сцепление хорошо или плохо? Это кажется странным для меня, потому что логически программе потребуются пакеты / классы с высоким Efferent / Afferent соединением.

У кого-нибудь есть пример того, когда / где высокая эфферентная или афферентная связь хороша / плоха?

Благодаря !

Селлек
источник
4
Если бы только они выбрали более запутанные термины, которые звучали бы еще более похожими ...
user949300

Ответы:

11

Афферентную связь легче всего оценить с точки зрения того, сколько боли она вызывает / спасает из-за необходимости или вероятности изменений. Например, возьмите класс вашего колеса и предположим, что многие другие модули используют его для создания различных видов транспортных средств. Если класс колес чрезвычайно стабилен, то это афферентное сцепление выгодно, поскольку транспортным средствам нужны колеса, и они используют надежный. Если, с другой стороны, класс колес является нестабильным с точки зрения технического обслуживания, это афферентное соединение станет проблемой, так как вы вносите многократные изменения в большое количество кода.

Эфферентная связь похожа по своей концепции, но вы увидите немного другое ценностное предложение. Если у вас есть класс автомобиля, который напрямую зависит от множества отдельных частей (в отличие от, скажем, «Двигатель» и «Шасси», и они состоят из других частей), класс, вероятно, многое делает и, следовательно, может быть узкое место обслуживания. Изменения в этом классе, вероятно, будут трудными и рискованными из-за его сложности. С другой стороны, если эфферентная связь высока, но на самом деле она довольно сплоченная и ясная, у вас нет иерархии объектов и отношений, о которых нужно беспокоиться.

Когда дело доходит до архитектуры / дизайна, то, что вы действительно должны учитывать, - это практически бесконечные компромиссы, и эти метрики ничем не отличаются. Если вы хотите выяснить пример чего-то хорошего или плохого, поиграйте в игру «что если». Представьте себе пример и скажите: «Что если бы я захотел сделать Х - сколько бы это отстой?» Для X, где ответ «много», у вас есть недостаток, а для X, где ответ «это было бы действительно просто», у вас есть преимущество.

Эрик Дитрих
источник
5

Если говорить в общих чертах, слабая связь:

положительный : защищает часть системы от изменений в чем-то, от чего она зависит (афферентная связь)

отрицательно : отношения могут быть более сложными для понимания

Например, если бы я разрабатывал систему, основанную на HTTTP, я бы решил, нужно ли мне тесно или слабо связываться с HTTP. Если бы я думал, что система, вероятно, переключится на другой протокол, я мог бы свободно подключиться к нему, в то время как, если бы я принял, что HTTP был моим протоколом, я мог бы тесно соединиться с этим протоколом для простоты понимания.

Учтите, что некоторые из сложностей в WS * заключаются в его отделении от HTTP как протокола.

jayraynet
источник
Умный ответ, но я не вижу, как это связано с вопросом, который касался эфферентной / афферентной связи, а не жесткой / слабой связи.
lbalazscs
Вы правы, @lbalazscs. Не знаю, почему я ответил, не ответив на вопрос!
Jayraynet
1

афферентный

Если что-то использует кучу разных вещей (большое количество афферентных связей), то может произойти поломка, если что-то из этого изменится.

Нестабильность = 1

введите описание изображения здесь

выносящий

Если что-то используется кучей разных вещей (большое количество эфферентных связей), то это может привести к поломке многих вещей, если это изменится.

Нестабильность = 0

введите описание изображения здесь

стабильность

Определение Мартином «стабильности» - это экзотическое сочетание «трудно изменить» и «мало причин для изменения». И все же его показатель нестабильности описывает только «сложность перемен». «Причины для изменения» будут иметь гораздо большее отношение к факторам, которые трудно вычислить, например, к правильному проектированию интерфейсов на соответствующем уровне абстракции и более четкому пониманию требований конечных пользователей.

Так что высокая эфферентная связь с низкой афферентной связью дает стабильность (как в чем-то сложном для изменения, так как это сломает кучу вещей), наоборот - нестабильность (как в чем-то, что легко изменить, так как это не сломает кучу вещей) ,

Большое количество афферентных соединений может быть показателем того, что вашему дизайну не хватает фокуса - он использует целую кучу разных вещей, поэтому, возможно, ему не хватает четкой, исключительной ответственности.

Большое количество эфферентных соединений изначально может быть истолковано как действительно хорошая вещь, поскольку это указывает на то, что ваш дизайн широко (пере) используется. Тем не менее, было бы плохо, если бы вы чувствовали искушение часто менять дизайн таким образом, чтобы все сломалось. Таким образом, с большим количеством эфферентных соединений возникает необходимость в таких пакетах, чтобы «было мало или нет причин для изменения». Конструкции должны быть стабильными в идеальном смысле, чтобы не было причин для изменений, поскольку их также будет очень сложно изменить.

Принцип стабильных абстракций

Такие понятия, как инверсия зависимостей (которая, естественно, требует внедрения зависимостей) и SAP (принцип стабильных абстракций), предполагают, что зависимости движутся к абстракциям. И есть простая причина, почему при рассмотрении «стабильности» в контексте «мало причин для изменения». В абстрактном интерфейсе не упоминаются конкретные детали, он фокусируется только на том, «что делать», а не на том, что есть, и поэтому имеет меньше причин для изменения. Ускоренный графический порт на наших материнских платах (абстрактный интерфейс) имеет меньше причин для изменения дизайна, чем графический процессор, который подключается к нему (конкретная деталь).

Повторное использование против повторного использования

Моим собственным показателем, если я могу предложить тот, который несколько противоречит принципам Мартина, является то, что мне нравится выдвигать идею о том, что наиболее повторно используемые библиотеки должны стремиться к минимальному повторному использованию другого кода. Это толкает нестабильность к жесткому нулю. Это по практическим причинам минимальных причин для изменения, а также для продвижения самой простой библиотеки для развертывания. Универсальная, широко используемая библиотека, которая зависит от дюжины разных библиотек, имеет множество причин для изменения, а также неуклюжий дистрибутив, который может быть сложным для развертывания. Разница здесь в том, что «причины для изменения» в моем случае распространяются даже на реализацию, поскольку она исходит из ориентированного на библиотеку представления, которое стремится выпустить стабильные версии библиотеки. Мартин может обесценить реализацию как отдельную часть,

С точки зрения распространения, реализация и интерфейс размываются, чтобы привести пользовательские зависимости в стабильную или нестабильную библиотеку. С точки зрения интерфейса используется только интерфейс, и связанные с ним детали реализации полностью отделены.

ChrisF
источник