Принцип единой ответственности: как определить количество обязанностей, возложенных на класс?

#solid-principles #single-responsibility-principle

#solid-принципы #принцип единой ответственности

Вопрос:

Я использую принцип SRP. В нем говорится, что у класса должна быть только одна причина изменения, что неявно подразумевает, что у него должна быть единственная ответственность.

Я немного сбит с толку, поскольку как разработчик определит, имеет ли класс только одну ответственность?

Это похоже на то, что если у класса есть один ОТКРЫТЫЙ метод (с несколькими частными методами), то это называется иметь единую ответственность.

Ответ №1:

SRP — это принцип, а не правило.

Ответственность, или причина для изменения, относится к лицу, имеющему причину для изменения кода во время разработки. Это не относится к объекту, имеющему причину для изменения во время выполнения.

Так, например, у класса view была бы причина для изменения, если бы кто-то захотел переместить кнопку в пользовательском интерфейсе. Класс доступа к базе данных имел бы основания для изменения, если бы кто-то захотел изменить схему базы данных.

Представьте себе ужас, если бы просмотр и доступ к базе данных выполнялись в одном классе.

Принцип заключается в изоляции частей кода, чтобы изменения могли вноситься в разных областях независимо (например, просмотр и доступ к базе данных). Это полезно, если над базой кода одновременно работают несколько разработчиков. Также полезно, чтобы один разработчик не нарушал другие области при внесении изменений в другой.

Это принцип, а не правило. На практике классы и модули часто будут иметь множество причин для изменения, если вы присмотритесь к ним достаточно пристально. На самом деле принцип заключается в том, чтобы уменьшить это, убрать низко висящие плоды, а не неукоснительно очищать кодовую базу.

Ответ №2:

Ответственность касается пользователей, использующих систему, спросите себя: «Если пользователь хотел, чтобы это изменилось», что еще это должно повлиять, тогда на что еще это повлияло бы.

Например, если бы у меня был объект ‘Student’ с методом ‘Add course’ и методом ‘Save’,

Добавление нового курса для учащегося не должно влиять на то, как сохраняются данные учащегося, но если бы я изменил метод «Добавить курс», мне нужно было бы перекомпилировать и повторно развернуть все, что связано с сохранением учащегося, давайте предположим, что это реализовано в виде базы данных.

Было бы еще хуже, если бы я захотел развернуть базу данных отдельно в структуре данных student или сохранить student в базе данных другого типа или, возможно, в файлах конфигурации . Эти две вещи теперь соединены и стали жесткими.

Пользователи, которые заботятся о базе данных, зависят от пользователей, которые заботятся об ученике.

Итак, лучшее, что можно сделать, если вы хотите определить, имеет ли класс одну ответственность, — это спросить, на что повлияет вызов этого метода.

Многие классы, у которых есть только одна ответственность, также будут иметь только один метод, но другие не будут, это определенно не обязательно.

источники:

Object Mentor

Видеоролики Clean Coder Ep. 9