Разница между принципом единой ответственности и разделением интересов - PullRequest
67 голосов
/ 12 ноября 2009

В чем разница между принципом единой ответственности и разделением интересов?

Ответы [ 12 ]

33 голосов
/ 12 ноября 2009

Принцип единой ответственности (SRP) - дать каждому классу только одну причину менять; и «Причина изменения» == "обязанность". В примере: Счет класс не несет ответственности напечатать себя.

Разделение интересов (с 1974 года). Беспокойство == особенность системы. принятие забота о каждой из проблем: для каждого одна проблема, другие проблемы не имеет значения. Сокрытие реализации поведение.

С здесь .

14 голосов
/ 12 ноября 2009

Разделение интересов и принцип единой ответственности (SoC против SRP)

Из связанной статьи:

Разделение проблем (SoC) - это процесс разбиения компьютерной программы на отдельные функции, которые по возможности пересекаются в функциональности. Беспокойство - это любой интерес или акцент в программе. Как правило, проблемы являются синонимами функций или поведения. http://en.wikipedia.org/wiki/Separation_of_concerns

Принцип единой ответственности (SRP) - каждый объект должен нести одну ответственность, и что все его услуги должны быть тесно связаны с этой ответственностью. На некотором уровне сплоченность рассматривается как синоним SRP. http://en.wikipedia.org/wiki/Single_responsibility_principle

12 голосов
/ 12 ноября 2009

Одиночная ответственность гласит, что Объект отвечает за одну единицу работы.

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

Аналогичные конечные результаты ... немного другие приложения.

11 голосов
/ 12 ноября 2009

По моему мнению, принцип единой ответственности является одним из инструментов / идиом для достижения разделения проблем.

8 голосов
/ 29 июля 2014

Принцип единой ответственности и разделение интересов - это одно и то же.

Конечно, вы можете увязнуть в академической дискуссии, пытаясь выявить какую-то разницу между ними, но почему? Для всех намерений и целей они описывают одно и то же. Самая большая проблема - люди настолько захвачены желанием точно знать, что такое «беспокойство» и «ответственность», что, возможно, они упускают важную идею, лежащую в основе SRP и SoC.

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

Это применяется на уровне модуля, например, MVC - это архитектурный паттерн, поддерживающий SRP и SoC. Кодовая база разбита на изолированные модели, представления и контроллеры. Таким образом, изменение представления может быть выполнено независимо от модели. Два два ужасно не переплетаются.

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

Также даже на уровне методов разбивайте большие методы на более мелкие.

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

6 голосов
/ 31 января 2016

Разделение интересов (SoC). Разделите ваше приложение на отдельные функции с минимальным дублированием функций. (Microsoft).

«Озабоченность» = «отличительный признак» = «отдельный раздел»

«Концерн» работает как на высоких, так и на низких уровнях

Принцип единой ответственности гласит, что каждый модуль или класс должен нести ответственность за одну часть функциональности, предоставляемой программным обеспечением, и эта ответственность должна быть полностью заключена в класс. Все его услуги должны быть тесно связаны с этой ответственностью. (Определение из Википедии)

«Ответственность» = «причина для изменения» изменить что? «Единая часть функциональности, обеспечиваемой программным обеспечением» = Базовый блок

Заключение

  • Принцип единой ответственности работает на базовых единицах -> работает на низком уровне

  • Разделение концернов работает как на высоких, так и на низких уровнях

  • SRP и SoC работают вместе для разделения проблем. Они
    точно так же на низком уровне

4 голосов
/ 12 ноября 2009

Разделение проблем - это процесс; Принцип единой ответственности - это философия дизайна / архитектуры. Они не полностью разделены, но служат разным целям.

2 голосов
/ 05 марта 2019

Поскольку ни один из предыдущих ответов не цитирует Роберта Мартина, который создал Принцип единой ответственности , я думаю, что здесь нужен более авторитетный ответ.

Вдохновение Мартина для SRP было получено от Дэвида Парнаса, Эдсгера Дейкстры (который придумал термин Разделение проблем ) и Ларри Константина (который придумал термины Сцепление и Сплоченность ). Мартин объединил их идеи в ПСП.

Еще одна формулировка принципа единой ответственности:

Соберите вещи, которые меняются по тем же причинам. Отделите те вещи, которые меняются по разным причинам.

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

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

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

2 голосов
/ 04 сентября 2017

Я попытался провести сравнение между разделением интересов (SoC) и принципом единой ответственности (SRP).

Отличия

  • SRP находится на уровне класса, но SoC есть в каждой компьютерной программе, абстракции ... или иногда на архитектурном уровне.

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

  • Концепция SRP основана на сплоченности (высокая сплоченность), тогда как SoC близка к Молекулярности, разделяй и властвуй (D & C), ... на каждом уровне абстракции.

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

Сходство

  • После применения каждого из этих принципов ваш контекст становится более многократно используемым, поддерживаемым, надежным, читаемым, ....
2 голосов
/ 06 мая 2015

СРП и СОЦ работают на разном уровне абстракции. Цель в обоих случаях уменьшить сцепление и усилить сцепление. В то время как SRP больше работает на уровне объектов, SOC также может работать на уровне реализации функций. Функция может быть реализована как одним объектом, так и несколькими объектами. Поэтому связь и сплоченность обоих принципов могут различаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...