Короче говоря: принцип единой ответственности

Определение

Ilya Lebedev
2 min readSep 25, 2019

Принцип единой ответсвенности (single responsibility principle, SRP) — часто используемый и важный принцип, которые применяется при написании кода. При этом его получается применять и при проектировании больших систем и при написании небольших скриптов. Давайте разбираться, что это такое.

Изначально SRP — принцип ООП, поэтому его изначальная формулировка касается классов, причин для изменений и области ответственности. Мы оставим эту формулировку в стороне и немного переформулируем этот принцип в отрыве от классов.

Принцип единой ответсвенности говорит, что один объект должен отвечать только за одну вещь. Или делать одну вещь. Объект — это функция, переменная, класс, что угодно.

Пример

Глянем на пример:

Сейчас функция print_weather_data делает две вещи: получает информацию о погоде по API и выводит её в консоль. Это нарушает принцип SRP и делает так, что функцию сложно переиспользовать. Предположим, мы хотим показывать погоду в веб-интерфейсе, эта функция не подойдёт. Или хотим выводить информацию о погоде в консоль, но в другом формате, тогда эта функция тоже не подойдёт.

Давайте исправим это. Раз функция делает две вещи, то её тело стоит разделить на две вспомогательных функции.

Теперь у нас есть две функции, каждая из которых удовлетворяет принципу единой ответсвенности — делает только одну вещь.

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

Как делить код на функции

Почти весь код, который мы с вами пишем можно описать тремя этапами:

  • получение данных;
  • обработка данных;
  • вывод обработанных данных.

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

По моему опыту самое частое нарушение SRP — это когда два или больше пунктов этой схемы делаются в одном месте. Получать и обрабатывать данные в одном месте — скорее всего, ошибка. Обрабатывать и выводить — тоже. Получать, обрабатывать и выводить — скорее всего это полная жесть.

Поэтому прежде чем писать код, советую прикинуть как он будет разбит на функции: где получение, где обработка и где вывод данных. Когда сформулируете примерную схему, пройдитесь по каждому её кирпичику и проверьте, удовлетворяет ли он SRP.

Что почитать про SRP

Если вы хотите почитать про “взрослое” определение SRP и его хитрости, то вот:

--

--

No responses yet