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

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

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

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

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

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

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

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

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

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

Комментариев нет:

Отправить комментарий