Майте на увазі метрику стабільності Мартіна і що він означає під "стабільністю":
Instability = Ce / (Ca+Ce)
Або:
Instability = Outgoing / (Incoming+Outgoing)
Тобто пакет вважається абсолютно нестабільним, якщо всі його залежності виходять: він використовує інші речі, але нічого не використовує. У цьому випадку має сенс бути конкретною. Це також буде найпростішим видом коду, який потрібно змінити, оскільки його більше нічого не використовує, а отже, нічого іншого не можна зламати, якщо цей код буде змінено.
Тим часом, коли у вас є протилежний сценарій повної "стабільності" з пакетом, який використовується однією або кількома речами, але він не використовує нічого самостійно, як центральний пакет, який використовується програмним забезпеченням, тобто, коли Мартін каже, що це повинно бути реферат. Це також підкріплюється принципом DIP SOLI (D), принципом інверсії залежності, який в основному стверджує, що залежності повинні рівномірно протікати до абстракцій як для коду низького, так і для високого рівня.
Тобто, залежності повинні рівномірно протікати до «стабільності», а точніше, залежності повинні протікати до пакетів з більшою кількістю вхідних залежностей, ніж вихідних, і, крім того, залежності повинні протікати до абстракцій. Суть обґрунтування цього полягає в тому, що абстракції надають приміщення для дихання для заміни одного підтипу іншим, пропонуючи таку ступінь гнучкості для конкретних частин, що реалізують інтерфейс, щоб змінити, не порушуючи вхідні залежності до цього абстрактного інтерфейсу.
Чи є суттєві недоліки залежно від абстракцій?
Ну, я фактично не погоджуюся з Мартіном тут, принаймні, для мого домену, і тут мені потрібно ввести нове визначення поняття "стабільність", як в "відсутність причин для зміни". У такому випадку я б сказав, що залежності повинні спрямовуватися на стабільність, але абстрактні інтерфейси не допомагають, якщо абстрактні інтерфейси нестабільні (за моїм визначенням "нестабільний", як це схильне до неодноразових змін, а не Мартіна). Якщо розробники не можуть виправити абстракції і клієнти неодноразово змінюють свою думку так, щоб зробити абстрактні спроби моделювання програмного забезпечення неповним або неефективним, тоді ми більше не отримаємо користі від розширеної гнучкості абстрактних інтерфейсів для захисту системи від каскадних змін, що залежать від залежності . В моєму особистому випадку я знайшов двигуни ECS, такі, які знайдені в іграх AAA,найбільш конкретно : щодо вихідних даних, але такі дані є досить стійкими (як, наприклад, "навряд чи колись потрібно буде змінювати"). Я часто знаходив, що ймовірність того, що щось вимагає, щоб майбутні зміни були кориснішою метрикою, ніж відношення еферентних до загальних з’єднань у керівних рішеннях SE.
Тож я б трохи змінив DIP і просто сказав: "Залежності повинні надходити до компонентів, які мають найменшу ймовірність вимагати подальших змін", незалежно від того, чи є ці компоненти абстрактними інтерфейсами чи необробленими даними. Для мене важливо лише ймовірність того, що вони можуть вимагати прямих змін у дизайні. Абстракції корисні лише в цьому контексті стабільності, якщо щось, будучи абстрактним, зменшує цю ймовірність.
У багатьох контекстах це може бути з пристойними інженерами та клієнтами, які передбачають потреби програмного забезпечення наперед та проектують стабільні (як у незмінні) абстракції, тоді як ці абстракції пропонують їм всю дихальну кімнату, необхідну для обміну конкретними реалізаціями. Але в деяких областях абстракції можуть бути нестабільними і схильними до неадекватності, тоді як дані, необхідні для двигуна, можуть бути набагато простіше передбачити та зробити їх стабільними заздалегідь. Тож у цих випадках фактично може бути корисніше з точки зору ремонтопридатності (простота зміни та розширення системи) залежність, що надходить до даних, а не до абстракцій. У системі ECS найбільш нестабільними частинами (як і частинами, що найбільш часто змінюються) є, як правило, функціональні можливості, що зберігаються в системах (PhysicsSystem
, наприклад), тоді як найбільш стабільні частини (як, щонайменше, ймовірно, будуть змінені) - це компоненти, які просто складаються з необроблених даних ( MotionComponent
наприклад,), які використовують усі системи.