Коли Еферентна / Аферентна зв'язок хороша чи погана


11

На цьому тижні у мене є іспит з програмних моделей, і одна з тем, яку ми повинні вивчати, - це "Різне та відмінне" з'єднання.

Я розумію, що пакет має високий Ce (еферентне з'єднання), якщо це залежить від ряду інших типів.

Наприклад:

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

Цей клас мав би високу ефективність зчеплення, оскільки це залежить від типів двигуна, колеса та кузова.

Тоді як тип "Колесо" мав би високий Са (аферентне зчеплення), якби від нього залежало кілька інших пакетів (Автомобіль, Літак, Велосипед).

Одне з можливих запитань на нашому іспиті - це коли взаємна чи хороша зв'язок є доброю чи поганою? Мені це здається дивним, тому що логічно програмі знадобляться пакунки / класи з високим зв'язком Efferent / Afferent.

Хтось має приклад того, коли / де високий еферентний або аферентний зв'язок хороший / поганий ??

Дякую !


4
Якби вони лише вибрали більш заплутані терміни, які звучали ще більше ...
user949300

Відповіді:


11

Різний зв’язок найлегше оцінити з точки зору того, який біль він заподіює / економить через необхідність змін чи ймовірність. Наприклад, візьміть свій клас коліс і скажімо, що багато інших модулів використовують його для створення різних типів транспортних засобів. Якщо клас коліс надзвичайно стабільний, то ця аферентна муфта вигідна, оскільки транспортним засобам потрібні колеса і вони використовують надійне. Якщо, з іншого боку, клас коліс є нестабільним з точки зору технічного обслуговування, ця аферентна муфта стане больовою точкою, коли ви неодноразово вводите порушення змін на багато коду.

Еферентне з'єднання подібне за концепцією, але ви будете дивитися на дещо інше значення пропозиції. Якщо у вас є клас автомобілів, який безпосередньо залежить від безлічі окремих деталей (на відміну від "Двигуна" і "Шасі", і вони складаються з інших частин), клас, ймовірно, робить багато і, таким чином, може бути вузьке місце технічного обслуговування. Зміни цього класу, ймовірно, будуть важкими та ризикованими через його складність. З іншого боку, якщо еферентна зв'язок висока, але насправді досить згуртований і чіткий, то у вас немає ієрархії об'єктів і відносин, щоб турбуватися.

Що стосується архітектури / дизайну, то, що ви насправді повинні враховувати, - це майже безмежні компроміси, і ці показники не відрізняються. Якщо ви хочете з’ясувати приклад того, що щось добре чи погано, пограйте в гру «що якщо». Уявіть приклад і скажіть: "а якби я хотів зробити X - скільки б це смокче?" Для X, де відповідь "багато", у вас є недолік, а для X, де відповідь "це було б насправді просто", ви маєте перевагу.


5

Якщо говорити в загальних рисах, нещільне з'єднання:

позитивний : захищає частину системи від змін у чомусь, від чого вона залежить (аферентне з'єднання)

негативний : відносини можуть бути складнішими для розуміння

Наприклад, якби я розробляв систему, яка спиралася на HTTTP, я вирішила, чи потрібно мені щільно або вільно з'єднуватися з HTTP. Якщо я подумав, що система, ймовірно, переключиться на інший протокол, я можу вирішити вільно з'єднатись із ним, хоча якби я прийняла, що HTTP є моїм протоколом, я могла б щільно з'єднатися з цим протоколом для простоти розуміння.

Розглянемо, що деякі складності у WS * полягають у його відриві від HTTP як протоколу.


Розумна відповідь, але я не бачу, як це пов’язано з питанням, яке стосувалося еферентного / аферентного з’єднання, а не тісного / вільного зв'язку.
lbalazscs

Ви праві, @lbalazscs. Поняття не маю, чому я відповів, не відповідаючи на запитання!
jayraynet

1

Аферентні

Якщо щось використовує купу різних речей (велика кількість афектних муфт), то, якщо будь-яка з цих речей зміниться, вона може бути схильною до розриву.

Нестабільність = 1

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

Різні

Якщо щось застосовується купою різних матеріалів (велика кількість еферентних з’єднань), то це може схильно зламати багато речей, якщо це зміниться.

Нестабільність = 0

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

Стабільність

Визначення Мартіна "стабільність" - це екзотична суміш між "важко змінити" та "мало причин для зміни". Проте його метрика нестабільності лише описує "труднощі змін". "Причини зміни" матимуть набагато більше спільного з факторами, які неможливо легко обчислити, як-от просто спроектувати свої інтерфейси належним чином, на відповідному рівні абстрагування та більш чітко розуміти вимоги до кінця користувачів.

Настільки висока еферентна муфта з низькою аферентною муфтою дає стабільність (як у чомусь важко змінити, оскільки вона зламає купу речей), навпаки призводить до нестабільності (як у чомусь легко змінити, оскільки вона не зламає купу речей) .

Велика кількість аферентних муфт може бути показником того, що у вашому дизайні не вистачає уваги - він використовує цілу купу різних речей, тому, можливо, йому не вистачає чіткої, єдиної відповідальності.

Велика кількість еферентних муфт спочатку можна інтерпретувати як дійсно хорошу річ, оскільки це вказує на те, що ваша конструкція широко (повторно) використовується. Але це було б погано, якщо ви відчуваєте спокусу часто змінювати дизайн таким чином, що все порушує. Так що при великій кількості еферентних з'єднань виникає необхідність у таких пакетах мати "мало причин для зміни" або взагалі немає ". Конструкції повинні бути стійкими в ідеальному розумінні, не мати причин для зміни, оскільки їх також буде дуже важко змінити.

Принцип стійких абстракцій

Такі поняття, як інверсія залежності (що, природно, вимагає введення залежності) та SAP (принцип стійких абстракцій), все це дозволяє припустити, що залежності переходять до абстракцій. І є проста причина, чому при розгляді "стабільності" в контексті "мало причин для зміни". Абстрактний інтерфейс не зазначає жодних конкретних деталей, він фокусується лише на тому, «що робити», а не на «те, що є», і, таким чином, є менше причин для зміни. Прискорений графічний порт на наших материнських платах (абстрактний інтерфейс) має менше причин зазнати зміни дизайну, ніж графічний процесор, який підключається до нього (конкретна деталь).

Повторність використання та повторне використання

Моя власна особиста метрика, якщо я можу запропонувати ту, яка дещо стикається з Мартиновою, це таке поняття, яке я хотів би наполягати на тому, що найбільш багаторазові бібліотеки повинні прагнути мінімально повторно використовувати інший код. Це підштовхує нестабільність до важких 0. Це з практичних причин, що мають мінімальні причини для зміни, а також для просування найпростішої бібліотеки для розгортання. Бібліотека із загальним призначенням, що широко використовується, що залежить від десятка різних бібліотек, має безліч причин для зміни, а також незрозуміло розповсюджений розподіл, який може бути важким для розгортання. Різниця тут полягає в тому, що в моєму випадку "причини зміни" поширюються навіть на реалізацію, оскільки це виходить із зору, орієнтованого на бібліотеку, яка прагне випустити стабільні версії бібліотеки. Мартін може знизити реалізацію як окрему частину,

З точки зору розповсюдження, реалізація та інтерфейс розмиваються разом, щоб отримати залежність користувачів до стабільної чи нестабільної бібліотеки. З точки зору інтерфейсу, використовується тільки інтерфейс, а деталі щодо реалізації - повністю окремі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.