Принцип единственной ответственности шикарен — если научиться его правильно применять. Для этого надо его научиться правильно понимать… а с этим у меня проблема. Поэтому продолжаю исследовать отдельные аспекты SRP в надежде, что когда-нибудь полностью его проясню.
Хочу обратить внимание на MVC как частный случай SRP (хотя мне больше нравится порядок букв CMV — так логичнее с точки зрения последовательности: сначала в работу включается контроллер, потом бизнес-логика в виде моделей, а уже потом — представление).
Вот что тут примечательно. Когда говорят о контроллерах, обычно имеют в виду взаимодействие с пользователем, реже вызов API. Но ведь по такой же схеме происходит реакция не только на действия пользователя в пользовательском интерфейсе. Когда мы запускаем консольный скрипт, он в общем случае проходит те же стадии: загрузка данных, обработка, вывод (паттерн Input — Do — Output).
А, допустим, фоновую задачу мы запустили в каких-нибудь очередях ларавеля или рубишном сайдкике. Та же история: сначала данные откуда-то забери (хотя бы и из пейлоада этого джоба), обработай, потом куда-то день результат.
Или вот на типичный обработчик события клика в браузерном яваскрипте посмотрим. Кто-то там запускает наш хэндлер, на вход ему передаёт невесть откуда взятые внешние данные, а хэндлер их преобразует и что-то нам показывает. CMV в чистом виде. И даже взаимодействие с пользователем может случиться.
И во всех этих случаях присходит структурно одно и тоже: нам прилетают некие данные (или забираем откуда-то), мы их обрабатываем и куда-то посылаем подальше.
И в целом я хочу сказать только одно: алгоритм обработки данных должен быть построен так, чтобы ему было не важно, откуда сами данные взялись.
И тогда у нас есть полная свобода запустить одно и то же действие хоть по клику пользователя, хоть по таймеру, хоть при загрузке страницы, хоть через скрипт в консоли, хоть по крону, хоть фоновой задачей, хоть ещё как. И эта свобода называется Source Independency Principle.
Что дальше
- Паттерн Input — Do — Output
- Модели
- Сервисные классы