У цей час мені не здається корисним обговорювати питання про те, що робить і що не є однією відповідальністю чи єдиною причиною зміни. Я б запропонував замість цього принципу мінімального горя:
Принцип мінімального горя: код повинен або прагнути мінімізувати його ймовірність вимагати змін, або максимально легко змінити.
Як це? Не варто брати вченого-ракету, щоб зрозуміти, чому це може допомогти зменшити витрати на обслуговування, і, сподіваємось, це не повинно бути точкою нескінченних дискусій, але як це стосується SOLID взагалі, це не те, що сліпо застосовувати скрізь. Це щось, що слід враховувати, балансуючи компроміси.
Що стосується ймовірності вимагати змін, це знижується з:
- Хороше тестування (підвищена надійність).
- Залучення лише самого мінімального коду, необхідного для виконання чогось конкретного (це може включати зменшення аферентних з’єднань).
- Просто створення кодового коду в тому, що він робить (див. Принцип дії бадаса).
Що стосується труднощів із внесенням змін, то це стосується еферентних з'єднань. Тестування вводить ефективні муфти, але це підвищує надійність. Зроблено добре, він, як правило, приносить більше користі, ніж шкоди, і цілком прийнятний і пропагується Принципом мінімального горя.
Зробіть принцип Badass: заняття, які використовуються в багатьох місцях, повинні бути приголомшливими. Вони повинні бути надійними, ефективними, якщо це пов'язане з їх якістю тощо.
І Принцип Make Badass прив’язаний до Принципу мінімальної скорботи, оскільки речі з badass виявляють меншу ймовірність вимагати змін, ніж речі, які засмоктують те, що вони роблять.
Я б почав, вказуючи на парадокс, згаданий вище, а потім зазначити, що SRP сильно залежить від рівня деталізації, який ви хочете врахувати, і що якщо ви відведете його досить далеко, будь-який клас, що містить більше одного властивості або один метод, порушує це.
З точки зору SRP, клас, який ледве робить щось, неодмінно мав би лише одну (іноді нульову) причину змінити:
class Float
{
public:
explicit Float(float val);
float get() const;
void set(float new_val);
};
Це практично не має причин змінюватися! Це краще, ніж SRP. Це ZRP!
За винятком я б припустив, що це є кричущим порушенням принципу Make Badass. Це також абсолютно нікчемно. Те, що робить так мало, не може сподіватися, що воно буде поганим. У ньому занадто мало інформації (TLI). І природно, коли у вас є щось, що є TLI, воно не може зробити нічого по-справжньому значущого, навіть з інформацією, яку він інкапсулює, тому йому доведеться просочити його до навколишнього світу, сподіваючись, що хтось ще насправді зробить щось значиме і недобре. І ця протікання нормально для чогось, що призначене лише для агрегування даних, і нічого іншого, але цей поріг - це різниця, як я бачу, між "даними" та "об'єктами".
Звичайно, те, що є TMI, також погано. Ми можемо поставити все наше програмне забезпечення в один клас. Це навіть може бути лише один run
метод. А хтось навіть може заперечити, що зараз є одна дуже широка причина для зміни: "Цей клас потрібно буде змінити лише в тому випадку, коли програмне забезпечення потребує вдосконалення". Я дурний, але, звичайно, ми можемо уявити всі проблеми з технічним обслуговуванням.
Таким чином, існує ефект врівноваження щодо деталізації або грубості об'єктів, які ви проектуєте. Я часто суджу про це за тим, скільки інформації ви маєте просочуватися до навколишнього світу і скільки значущої функціональності вона може виконувати. Я часто вважаю Принцип Make Badass корисним там, щоб знайти баланс, поєднуючи його з Принципом мінімального горя.