Является ли принцип единой ответственности правилом ООП?

В отвечать на вопрос о переполнении стека говорилось, что конкретная структура нарушает простое и понятное правило ООП: Принцип единой ответственности (SRP).

Является ли принцип единой ответственности В самом деле правилом ООП?

Я понимаю определение объектно-ориентированного программирования как «парадигму, в которой объекты и их поведение используются для создания программного обеспечения». Сюда входят следующие методы: инкапсуляция, полиморфизм и наследование.

Не поймите меня неправильно - я считаю, что SRP является ключом к большинству хороших объектно-ориентированных проектов, но я чувствую, что есть случаи, когда этот принцип можно и нужно нарушать (как и правила нормализации базы данных). Я агрессивно продвигаю преимущества SRP, и большая часть моего кода следует этому принципу.

Но является ли это правилом и, следовательно, подразумевает, что его нельзя нарушать?

Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это так.

Luuklag 13.11.2018 22:20
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Принцип подстановки Лискова
Принцип подстановки Лискова
Принцип подстановки Лискова (LSP) - это принцип объектно-ориентированного программирования, который гласит, что объекты суперкласса должны иметь...
21
1
3 581
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Очень мало правил, если они вообще есть, в разработке программного обеспечения без исключения. Некоторые думают, что для идти к нет места, но ошибаются.

Что касается ООП, нет единого определения объектно-ориентированности, поэтому в зависимости от того, кого вы спросите, вы получите разный набор жестких и мягких принципов, шаблонов и практик.

Классическая идея ООП состоит в том, что сообщения отправляются непрозрачным объектам, и объекты интерпретируют сообщение, зная о своей внутренней сущности, а затем выполняют какую-то функцию.

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

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

Но я считаю, что легче получить правильный SRP, чем сделать что-то более сложное и столь же надежное.

«Проблема», которую я пытаюсь решить в отношении SRP, - это «насколько далеко»? Вы можете довести его до смехотворного уровня и при этом сгенерировать сотни классов для каждой сущности.

Prisoner ZERO 26.05.2011 16:51

@Prisoner ZERO: прочтите ответ на этот вопрос: как-вы-определяете-как-грубая-или-мелкозернистая-ответственность-должна-быть-когда он прав.

User 23.07.2011 03:34

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

Не бойтесь делать то, что считаете правильным. На самом деле вы можете придумать новые и лучшие правила.

Ага, я полагаю, это относится к ответу, который я дал. :)

Как и в случае с большинством правил и законов, существуют основные мотивы, по которым эти правила актуальны - если основной мотив отсутствует или не применим к вашему делу, тогда вы можете изменить / нарушить правила в соответствии с вашими потребностями.

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

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

(Изменить - перемещено из «ответа» в «комментарий») Действительно, Джон, ваш ответ в другой ветке действительно вызвал этот вопрос. Формулировка ответа (преднамеренного или нет) вызвала у меня в голове довольно интересный набор мыслей. Когда я использовал «SRP» на своем рабочем месте, я задумался на более глубоком уровне, как мне сформулировать такие вещи. Отсюда и этот вопрос. Спасибо за то, что вызвал у меня такой интересный образ мыслей. :-)

Brad Leach 30.04.2009 07:41

Процитирую капитана Барбосса:

"... А во-вторых, вы должны быть пиратом, чтобы пиратский код действовал, а это не так. И в-третьих, код - это больше то, что вы бы назвали «руководящими принципами», чем действительными правилами ... »

Процитирую Джека Воробья и Гиббса. «Я думал, ты должен соблюдать кодекс». Г-н Гиббс: «Мы решили, что это более актуальные рекомендации».

Итак, пираты прекрасно это понимают.

«Правила» можно понять через движение паттернов как «Силы».

Итак, есть сила, которая пытается возложить на класс единственную ответственность. (сплоченность)

Но есть также сила, которая пытается снизить связь с другими классами.

Как и в случае со всем дизайном (а не только с кодом), ответ таков: это зависит.

Как сказано на многих других плакатах, все правила созданы для того, чтобы их нарушать. При этом я считаю, что SRP - одно из наиболее важных правил для написания хорошего кода. Это не относится к объектно-ориентированному программированию, но «инкапсулирующую» часть ООП очень сложно выполнить правильно, если у класса нет единственной ответственности.

В конце концов, как правильно и просто инкапсулировать класс с множеством обязанностей? Обычно ответ - несколько интерфейсов и на многих языках, которые могут немного помочь, но пользователей вашего класса все еще сбивает с толку, что он может применяться совершенно по-разному в разных ситуациях.

SRP - это просто еще одно выражение ISP :-).

А «П» означает «принцип», а не «правило»: D

Другие вопросы по теме