Антипаттерны и запахи
Существуют и антипаттерны, которые или сами нарушают SRP, или усложняют следование принципу.
Божественный объект
Божественный объект — это сущность, которая отвечает за слишком много.
Проблема таких объектов в том, что внутри них скапливается неоправданно большое количество данных. Со временем может случиться, что никакое действие нельзя будет сделать без участия божественного объекта.
Это затрудняет рефакторинг, тестирование и внесение изолированных изменений в код.
Синглтон
Синглтон — это паттерн, при котором в приложении существует только один экземпляр какого-то класса. Существующий синглтон гарантирует, что все новые созданные объекты будут ссылаться на него.
С точки зрения SRP это смешение ответственностей. Потому что синглтон не только выполняет свою основную функцию, но ещё и проверяет, не существует ли уже созданных экземпляров.
Проблем у этого паттерна несколько:
- он глобален — когда нарушается инкапсуляция состояния, повышается вероятность непредсказуемых нежелательных изменений;
- излишне имплицитен — трудно заранее понять, как себя поведёт объект в какой-то ситуации;
- трудно тестируется — глобальный объект хранит большое количество данных и может находиться в большом количестве различных состояний, из-за чего модульные тесты могут показывать непредсказуемые результаты.
Смешение архитектурных слоёв
Паттерн MVC подразумевает три сущности: модель, представление и контроллер. Модель отвечает за хранение данных; представление — за их отображение; контроллер — за преобразование и обработку.
Смешение слоёв — это неправильное распределение или размазывание ответственностей между слоями. Оно может приводить:
- к разрастанию контроллера, что делает его код трудным для понимания;
- появлению логики внутри модели, что затрудняет переиспользование модели.