#solid-principles #single-responsibility-principle
#solid-принципы #принцип единой ответственности
Вопрос:
Я использую принцип SRP. В нем говорится, что у класса должна быть только одна причина изменения, что неявно подразумевает, что у него должна быть единственная ответственность.
Я немного сбит с толку, поскольку как разработчик определит, имеет ли класс только одну ответственность?
Это похоже на то, что если у класса есть один ОТКРЫТЫЙ метод (с несколькими частными методами), то это называется иметь единую ответственность.
Ответ №1:
SRP — это принцип, а не правило.
Ответственность, или причина для изменения, относится к лицу, имеющему причину для изменения кода во время разработки. Это не относится к объекту, имеющему причину для изменения во время выполнения.
Так, например, у класса view была бы причина для изменения, если бы кто-то захотел переместить кнопку в пользовательском интерфейсе. Класс доступа к базе данных имел бы основания для изменения, если бы кто-то захотел изменить схему базы данных.
Представьте себе ужас, если бы просмотр и доступ к базе данных выполнялись в одном классе.
Принцип заключается в изоляции частей кода, чтобы изменения могли вноситься в разных областях независимо (например, просмотр и доступ к базе данных). Это полезно, если над базой кода одновременно работают несколько разработчиков. Также полезно, чтобы один разработчик не нарушал другие области при внесении изменений в другой.
Это принцип, а не правило. На практике классы и модули часто будут иметь множество причин для изменения, если вы присмотритесь к ним достаточно пристально. На самом деле принцип заключается в том, чтобы уменьшить это, убрать низко висящие плоды, а не неукоснительно очищать кодовую базу.
Ответ №2:
Ответственность касается пользователей, использующих систему, спросите себя: «Если пользователь хотел, чтобы это изменилось», что еще это должно повлиять, тогда на что еще это повлияло бы.
Например, если бы у меня был объект ‘Student’ с методом ‘Add course’ и методом ‘Save’,
Добавление нового курса для учащегося не должно влиять на то, как сохраняются данные учащегося, но если бы я изменил метод «Добавить курс», мне нужно было бы перекомпилировать и повторно развернуть все, что связано с сохранением учащегося, давайте предположим, что это реализовано в виде базы данных.
Было бы еще хуже, если бы я захотел развернуть базу данных отдельно в структуре данных student или сохранить student в базе данных другого типа или, возможно, в файлах конфигурации . Эти две вещи теперь соединены и стали жесткими.
Пользователи, которые заботятся о базе данных, зависят от пользователей, которые заботятся об ученике.
Итак, лучшее, что можно сделать, если вы хотите определить, имеет ли класс одну ответственность, — это спросить, на что повлияет вызов этого метода.
Многие классы, у которых есть только одна ответственность, также будут иметь только один метод, но другие не будут, это определенно не обязательно.
источники: