Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Принцип единственной ответственности

Из Википедии — свободной энциклопедии

Классу позволено слишком много. Вероятнее всего при внесении в его код изменений, возникнут трудности. Причиной тому станет нарушение SRP.

Принцип единственной ответственности (англ. single-responsibility principle, SRP) — принцип ООП, обозначающий, что каждый объект должен иметь одну ответственность и эта ответственность должна быть полностью инкапсулирована в класс. Все его поведения должны быть направлены исключительно на обеспечение этой ответственности.

A class should have only one reason to change.Robert C. Martin

Описание

Термин SRP был введён Робертом С. Мартином в одноимённой статье как часть SOLID, ставших популярными благодаря его книге «Быстрая разработка программ. Принципы, примеры, практика.»[1]. Мартин описал SRP, основываясь на закономерности, описанной Томом ДеМарко[2] и Мейлиром Пейдж-Джонсом[3] и названной связностью.

В SOLID — буква «S» является аббревиатурой, которая образована сокращением от английского названия принципа единственной ответственности(англ. Single Responsibility Principle).

Мартин определяет ответственность как причину изменения и заключает, что классы должны иметь одну и только одну причину для изменений. Например, представьте себе класс, который составляет и печатает отчёт. Такой класс может измениться по двум причинам:

  1. может измениться само содержимое отчёта
  2. может измениться формат отчёта.

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

При разработке различных поведений одного класса часто появляется «Божественный объект», который в ООП считается антипаттерном. Соблюдение принципа единственной ответственности позволяет избегать этого антипаттерна.

Использование

Возникает вопрос, когда стоит использовать этот принцип? Всё же принцип — это не закон и SRP стоит применять в зависимости от того, как изменяется приложение:

  • если при изменении кода, отвечающего за одну ответственность, в приложении появляются исправления кода, отвечающего за другую ответственность, то это первый сигнал о нарушении SRP.
  • если же изменения кода, отвечающего за одну ответственность, не вносят изменения в код, отвечающий за другую ответственность, то этот принцип можно не применять.
Пример класса, который подаёт признаки нарушения SRP принципа.

Слепое следование принципу единственной ответственности приводит к избыточной сложности приложения, его поддержки и тестирования. SRP стоит применять только тогда, когда это оправдано. Принцип SRP можно применить только в том случае, когда:

  • объекту класса становится позволительно слишком много;
  • доменная логика концентрируется только в одном классе;
  • любое изменение логики поведения объекта приводит к изменениям в других местах приложения, где это не подразумевалось изначально;
  • приходится тестировать, исправлять ошибки, компилировать различные места приложения, даже если за их работоспособность отвечает третья сторона;
  • невозможно легко отделить и применить класс в другой сфере приложения, так как это потянет ненужные зависимости.
Вроде классы разделены по назначениям, но у Response есть признак нарушения SRP. Он зависим от Report. Изменяя Report, например, удалив метод получения заголовка, потребуются внести изменения в Response. А ведь изначально не подразумевалось изменять код формата отчёта. Код проекта не готов к быстрым и безболезненным изменениям.

Объединение ответственностей является общепринятой практикой и в этом нет ничего плохого, до тех пор пока это легко обслуживать. Следование принципу единственной ответственности зависит от функций программного продукта и является труднейшим при проектировании приложений.

В качестве примера нарушения SRP часто приводят ActiveRecord — паттерн, который позволяет легко связать данные объектов и данные из базы данных. В ActiveRecord много ответственностей сконцентрировано в одном месте и поэтому можно утверждать, что ActiveRecord нарушает SRP и тем самым становится антипаттерном.[4] В некоторых случаях это утверждение спорно, так как сам по себе объект, реализующий ActiveRecord, не содержащий никакой бизнес логики, а предоставляющий таблицу из базы данных, имеет лишь одну причину для изменения (изменение таблицы), что не противоречит определением принципа SRP[5][6].

Приёмы соблюдения принципа

Следующие приёмы позволяют соблюдать принцип единственной ответственности:

Классическим примером[7] нарушения SRP может служить ситуация, когда системе с бизнес-правилами (BRMS) нужно иметь дело с постоянным хранилищем (Persistence[en]). На первых этапах проектирования таких систем создаётся класс, который обрабатывает бизнес правила и содержит логику работы с базой данных. С нарушением SRP появляются признаки плохого проекта, такие как:

  • система с трудом поддается изменениям, поскольку любое минимальное изменение вызывает эффект «снежного кома», затрагивающего другие компоненты системы.
  • в результате осуществляемых изменений система разрушается в тех местах, которые не имеют прямого отношения к непосредственно изменяемому компоненту.

Если бы система изначально разрабатывалась через тестирование(TDD), то этой проблемы могло бы и не возникнуть. Опираясь на тесты, разработчики могут быстрее представить, какая функциональность необходима пользователю. Таким образом, детали класса появляются задолго до окончательной реализации решения, тем самым влияя на дизайн разрабатываемой системы. Но бывает и так, что разработка через тестирование не приводит к применению шаблона «Выделение класса», тогда к системе применяется рефакторинг с применением шаблонов «Фасад», DAO или «Proxy».

SRP предлагает разделять универсальные классы на конкретные, что сделает их простыми и лёгкими в обслуживании. Подобную идею также выдвигает принцип KISS[8].

См. также

Примечание

  1. Мартин,, Роберт. Быстрая разработка программ. Принципы, примеры, практика. — Вильямс, 2004. — ISBN 5845905583.
  2. Tom DeMarco. Structured Analysis and System Specification. — 1 edition. — Prentice Hall, May 21, 1979. — С. 310. — 348 с. — ISBN 0138543801.
  3. Meilir Page-Jones. Practical Guide to Structured Systems Design. — 2 edition. — Prentice Hall, May 14, 1988. — С. 82. — 368 с. — ISBN 8120314824.
  4. Pablo's SOLID Software Development 8. — «A good anti-example is the Active Record pattern. This pattern is in contradiction of SRP. A domain entity handles persistence of its information. (Note: There is nothing wrong with using Active Record; I've recently used it on a quick demo site and it worked perfectly) Normally, you would have a controller method/action pass a "hydrated" entity to a method of a repository instance.» Дата обращения: 6 ноября 2016. Архивировано 29 августа 2017 года.
  5. Протько Сергей(fesor). AR по определению его нарушает и создан чтобы его нарушать // https://habrahabr.ru/.+Архивировано 31 июля 2017 года.
  6. Принцип единственной ответственности: глубокое погружение. habr.com. Дата обращения: 11 марта 2020. Архивировано 21 апреля 2021 года.
  7. ArticleS.UncleBob.PrinciplesOfOod. butunclebob.com. Дата обращения: 5 ноября 2016. Архивировано 25 октября 2016 года.
  8. Shivprasad koirala. SOLID architecture principles using simple C# examples - CodeProject. www.codeproject.com. Дата обращения: 6 ноября 2016. Архивировано 7 ноября 2016 года.

Литература

  • Robert C. Martin. Clean Code: A Handbook of Agile Software Craftsmanship. — Pearson Education, 2008. — ISBN 978-0-13-608325-2.

Ссылки

Эта страница в последний раз была отредактирована 23 сентября 2022 в 06:28.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).