Принцип единственной ответственности ( SRP ) — это принцип компьютерного программирования, который гласит, что «Модуль должен нести ответственность перед одним и только одним субъектом». [1] Термин субъект относится к группе (состоящей из одного или нескольких заинтересованных лиц или пользователей), которой требуется изменение в модуле.
Роберт С. Мартин , создатель термина, выразил принцип следующим образом: «У класса должна быть только одна причина для изменения». [2] Из-за путаницы вокруг слова «причина» он позже разъяснил его значение в сообщении в блоге под названием «Принцип единой ответственности», в котором он упомянул разделение интересов и заявил, что «Другая формулировка принципа единой ответственности: Соберите вместе вещи, которые изменяются по одним и тем же причинам. Разделите те вещи, которые изменяются по разным причинам». [3] В некоторых своих выступлениях он также утверждает, что принцип, в частности, касается ролей или действующих лиц. Например, хотя они могут быть одним и тем же человеком, роль бухгалтера отличается от роли администратора базы данных. Следовательно, каждый модуль должен отвечать за каждую роль. [4]
Термин был введен Робертом С. Мартином в его статье «Принципы OOD» как часть его Принципов объектно-ориентированного проектирования [5] , ставших популярными благодаря его книге 2003 года «Гибкая разработка программного обеспечения, принципы, шаблоны и практики» . [6] Мартин описал его как основанный на принципе связности , как описано Томом ДеМарко в его книге «Структурный анализ и системная спецификация» [ 7] и Мейлиром Пейдж-Джонсом в «Практическом руководстве по проектированию структурированных систем » . [8] В 2014 году Мартин опубликовал запись в блоге под названием «Принцип единой ответственности» с целью прояснить, что подразумевается под фразой «причина для изменений». [1]
Мартин определяет ответственность как причину для изменения и приходит к выводу, что класс или модуль должен иметь одну и только одну причину для изменения (например, переписывания).
В качестве примера рассмотрим модуль, который компилирует и печатает отчет. Представьте, что такой модуль может быть изменен по двум причинам. Во-первых, может измениться содержание отчета. Во-вторых, может измениться формат отчета. Эти две вещи меняются по разным причинам. Принцип единой ответственности гласит, что эти два аспекта проблемы на самом деле являются двумя отдельными обязанностями и, следовательно, должны находиться в отдельных классах или модулях. Было бы плохой конструкцией объединять две вещи, которые изменяются по разным причинам в разное время.
Причина, по которой важно сохранять класс сосредоточенным на одной проблеме, заключается в том, что это делает класс более надежным. Продолжая предыдущий пример, если есть изменение в процессе компиляции отчета, есть большая опасность того, что код печати сломается, если он является частью того же класса.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )