Класс может расширять 12 интерфейсов, но если эти 12 контрактов представляют пересечение поведения, так что объект все еще имеет только одну ответственность, то есть A-OK.Снова и снова в крупных корпоративных проектах наиболее сложными для обслуживания являются классы, которые пытаются сделать слишком много разных вещей.Вот пример:
Приложение, которое выполняет маршрутизацию и рекомендации для лиц, принимающих первые ответные меры (полиция, пожарная охрана и т. Д.), Имеет класс Mapping, который делает:
- геокодирование и обратное геокодирование (поворотlat & long в адрес и наоборот)
- отображение изображения карты на экране, с трафиком и маршрутизацией «бликов»
- поиск маршрутов между различными местоположениями
- анализсхемы трафика, предоставляемые сторонними источниками данных
Первоначальный разработчик системы, должно быть, подумал: «Ну, это все задачи, связанные с картой и местоположением, так что да, это должен быть один класс».К сожалению, это сделало невозможным дальнейшее изменение одного из этих элементов функциональности, поскольку все было тесно связано.
Найдите швы в функциональности, предоставляемой различными компонентами вашего приложения.Разделите эти швы на сплоченные контракты (интерфейсы) между компонентами, где каждое устройство способно предоставить ценную «услугу» (не в смысле веб-сервиса) своим потребителям.Чтобы вернуться к моему предыдущему примеру, мы в итоге разбили класс Mapping (Project Yoko) на:
- Геокодер
- MapRenderer
- RouteRenderer
- RouteBuilder
- TrafficRenderer (унаследованный от RouteRenderer)
- TrafficDatasource
Отдельные компоненты имели разрешенные во время выполнения зависимости , что позволило нам ввести Unitи Системные тесты, обнаружение нескольких ошибок в существующей логике маршрутизации, помимо предоставления множества других преимуществ.В общем, если вы видите логическое разделение обязанностей в классе, вам, вероятно, следует прервать его.