Одинична відповідальність може бути не тим, що може виконувати одна функція.
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
Цей клас може порушити принцип єдиної відповідальності. Не тому, що він має дві функції, але якщо код getX()
і getY()
повинен задовольняти різні зацікавлені сторони, які можуть вимагати зміни. Якщо віце-президент пан Х надішле записку про те, що всі номери повинні бути виражені цифрами з плаваючою комою, а директор бухгалтерії пані Y наполягає на тому, що всі числа, які переглядає її відділ, залишатимуться цілими числами незалежно від того, що містер X вважає добре, тоді цей клас мав би краще мати єдина ідея того, кому це відповідально, тому що речі можуть заплутатися.
Якщо SRP дотримувались, було б зрозуміло, чи би клас класу вносив внесок у те, до чого містер Х та його група схильні. Поясніть, за що відповідає клас, і ви знаєте, яка директива впливає на цей клас. Якщо вони обидва впливають на цей клас, то він був погано розроблений, щоб мінімізувати вплив змін. "Клас повинен мати лише одну причину для зміни" не означає, що весь клас може робити лише одну дрібницю. Це означає, що я не маю змоги подивитися на клас і сказати, що і містер Х, і місіс Ю мають інтерес до цього класу.
Крім подібних речей. Ні, кілька методів добре. Просто дайте йому назву, яка дає зрозуміти, які методи належать до класу, а які - ні.
SRP дядька Боба більше стосується закону Конвея, ніж закону Керлі . Дядько Боб виступає за застосування закону Керлі (виконайте одне) до функцій, а не до класів. SRP застерігає від змішування причин, щоб разом змінюватися. Закон Конвея говорить, що система буде стежити за потоком інформації організації. Це призводить до слідування SRP, оскільки вас не хвилює те, про що ви ніколи не чуєте.
"Модуль повинен відповідати одному та лише одному актору"
Роберт С Мартін - чиста архітектура
Люди продовжують хотіти, щоб SRP був про всі причини, щоб обмежити сферу застосування. Є більше причин для обмеження обсягу, ніж SRP. Я ще більше обмежую сферу, наполягаючи на тому, що клас буде абстракцією, яка може прийняти ім’я, яке гарантує, що зазирнути всередину вас не здивує .
Ви можете застосувати Закон Керлі до класів. Ти поза тим, про що говорить дядько Боб, але ти можеш це зробити. Куди ви підете не так - це коли ви починаєте думати, що це означає одну функцію. Це як думати, що в сім'ї має бути лише одна дитина. Маючи більше ніж одну дитину, це не перешкоджає бути сім’єю.
Якщо застосувати закон Керлі до класу, все в класі має бути приблизно однією об'єднавчою ідеєю. Ця ідея може бути широкою. Ідея може бути наполегливістю. Якщо деякі функції утиліти журналу є там, вони явно не в силі. Не має значення, містер Х - єдиний, хто піклується про цей код.
Класичний принцип, який слід застосувати тут, називається відокремленням проблем . Якщо ви розділите всі свої занепокоєння, можна стверджувати, що те, що залишилося в будь-якому одному місці, - це одна турбота. Саме так ми назвали цю ідею ще до того, як фільм 1991 року «Сіті Слайкери» познайомив нас із персонажем Кучерявого.
Це добре. Просто те, що дядько Боб називає відповідальністю, не викликає занепокоєння. Відповідальність за нього - це не те, на чому ти зосереджений. Це щось, що може змусити вас змінитися. Ви можете зосередитись на одній проблемі і все ще створити код, який відповідає різним групам людей з різними програмами.
Можливо, тобі це не байдуже. Чудово. Думаючи, що затримання "робити одну річ" вирішить усі ваші дизайнерські неприємності, демонструє відсутність уяви про те, що "одна річ" може виявитись. Ще одна причина обмеження сфери - організація. Ви можете вкласти багато "однієї речі" всередину іншої "однієї речі", поки у вас не буде повноцінного шухляди. Я говорив про це раніше
Звичайно, класична причина OOP обмежувати область полягає в тому, що клас має в ньому приватні поля, а замість цього використовувати getters для обміну цими даними навколо, ми ставимо кожен метод, який потребує цих даних у класі, де вони можуть використовувати дані приватно. Багато хто вважає це занадто обмежуючим, щоб використовувати його як обмежувач області, оскільки не кожен метод, що належить разом, використовує абсолютно однакові поля. Я хотів би переконатися, що будь-яка ідея, яка об'єднала дані, буде тією самою ідеєю, яка об'єднала методи.
Функціональний спосіб дивитися на це , що a.f(x)
і a.g(x)
просто е з (х) і г (х). Не дві функції, а континуум пар функцій, які різняться між собою. Навіть не мати в ньому дані. Це може бути просто те, як ви знаєте, яку і реалізацію ви збираєтеся використовувати. Функції, що змінюються разом, належать разом. Це гарний старий поліморфізм.a
f
g
SRP - лише одна з багатьох причин обмеження сфери застосування. Це добре. Але не єдиний.