Показаны сообщения с ярлыком приицип единственной ответственности. Показать все сообщения
Показаны сообщения с ярлыком приицип единственной ответственности. Показать все сообщения

вторник, 14 июня 2016 г.

Принцип единственной ответственности (Single responsibility principle)

Принцип единственной ответственности (SRP), первый из принципов SOLID.

На каждый объект должна быть возложена одна единственная обязанность.

То есть — конкретный класс должен решать конкретную задачу — ни больше, ни меньше. Применим не только к классам, но и к методам, модулям, подсистемам и системам. Старое доброе правило "разделяй и властвуй", изложенное для программирования. Следование этому принципу упрощает отладку, написание тестов и делает код более читаемым.

Существует ряд патологических случаев нарушения принципа единственной обязанности, которые сегодня будут очевидны практически любому:

  • Крайний - антипаттерн GodObject.
  • классы бизнес-логики, которые "знают" о пользовательском интерфейсе или о базе данных.
  • "толстые" контроллеры в шаблоне MVC. Обязанности контролера - увязать между собой модель бизнес-логики и представление. То есть, принять данные извне, передать их в модель, получить результат раболты модели и передать его в представление. Ни больше, ни меньше.

Менее очевидные нарушения есть, как ни странно, в ряде известных паттернов:

  • Singleton и его расширение - Multiton. Здесь "подмешан" контроль за количеством порождаемых объектов никакого отношения не имеющий к основным функциям, реализуемых классами на основе этих шаблонов.
  • Active Record, строго говоря, противоречит этому принципу - с одной стороны он является сущностью (entity), с другой - объектом доступа к хранилищу тех же самых сущностей (DAO). Даже если его "правильно готовить", то в нем сосредотачиваются как свойства сущности, так и атомарные методы поиска этих сущностей (ofSomeProperty(property: PropertyType)).

Разделять классы на составляющие необходимо руководствуясь здравым смыслом и моделью предметной области. В противном случае можно сделать только хуже. Один из таких примеров - антипаттерн Anemic Domain Model.