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

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

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

Это похоже на то, что если у класса есть один ПУБЛИЧНЫЙ метод (с несколькими частными методами), то он называется единственной обязанностью.


person Akash Nagar    schedule 03.07.2014    source источник


Ответы (2)


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

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

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

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

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

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

person Weyland Yutani    schedule 29.07.2014

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

Например, если бы у меня был объект «Студент» с методом «Добавить курс» и методом «Сохранить»,

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

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

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

Поэтому лучше всего, если вы хотите определить, несет ли класс определенную ответственность, - это спросить, что будет затронуто, если вы вызовете его метод.

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

источники:

Object Mentor

Видео по Clean Coder, эпизод. 9

person Sam Fare    schedule 16.07.2014