Короче говоря: принцип единой ответственности
Определение
Принцип единой ответсвенности (single responsibility principle, SRP) — часто используемый и важный принцип, которые применяется при написании кода. При этом его получается применять и при проектировании больших систем и при написании небольших скриптов. Давайте разбираться, что это такое.
Изначально SRP — принцип ООП, поэтому его изначальная формулировка касается классов, причин для изменений и области ответственности. Мы оставим эту формулировку в стороне и немного переформулируем этот принцип в отрыве от классов.
Принцип единой ответсвенности говорит, что один объект должен отвечать только за одну вещь. Или делать одну вещь. Объект — это функция, переменная, класс, что угодно.
Пример
Глянем на пример:
Сейчас функция print_weather_data
делает две вещи: получает информацию о погоде по API и выводит её в консоль. Это нарушает принцип SRP и делает так, что функцию сложно переиспользовать. Предположим, мы хотим показывать погоду в веб-интерфейсе, эта функция не подойдёт. Или хотим выводить информацию о погоде в консоль, но в другом формате, тогда эта функция тоже не подойдёт.
Давайте исправим это. Раз функция делает две вещи, то её тело стоит разделить на две вспомогательных функции.
Теперь у нас есть две функции, каждая из которых удовлетворяет принципу единой ответсвенности — делает только одну вещь.
Может показаться, что функция print_weather_data
всё ещё нарушает принцип единой ответственности: она всё ещё делает две вещи, но теперь она не делает их напрямую, а просто вызывает другие методы, которые делают свою работу. Это ок.
Как делить код на функции
Почти весь код, который мы с вами пишем можно описать тремя этапами:
- получение данных;
- обработка данных;
- вывод обработанных данных.
Иногда какого-то этапа нет, но в общем почти любой кусок логики почти любой программы можно разложить на такую схему.
По моему опыту самое частое нарушение SRP — это когда два или больше пунктов этой схемы делаются в одном месте. Получать и обрабатывать данные в одном месте — скорее всего, ошибка. Обрабатывать и выводить — тоже. Получать, обрабатывать и выводить — скорее всего это полная жесть.
Поэтому прежде чем писать код, советую прикинуть как он будет разбит на функции: где получение, где обработка и где вывод данных. Когда сформулируете примерную схему, пройдитесь по каждому её кирпичику и проверьте, удовлетворяет ли он SRP.
Что почитать про SRP
Если вы хотите почитать про “взрослое” определение SRP и его хитрости, то вот: