Подтвердить что ты не робот

В SOLID, каково различие между SRP и ISP? (Принцип единой ответственности и принцип разделения интерфейса)

Как SOLID "Принцип разделения интерфейса" отличается от "принципа единой ответственности"?

Википедия запись для SOLID говорит, что

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

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

Я что-то упускаю, или ISP вроде избыточен с SRP? Если нет, то что означает ISP, что SRP не делает?

4b9b3361

Ответ 1

SRP сообщает нам, что у вас должна быть только одна ответственность в модуле.

ISP говорит нам, что вы не должны быть вынуждены столкнуться с большем, чем вам на самом деле. Если вы хотите использовать метод print() из интерфейса I, вам не нужно создавать экземпляр класса SwimmingPool или DriveThru для этого.

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

Все исходило из

ISP был впервые использован и сформулирован Робертом К. Мартином при выполнении некоторые консультации для Xerox. Xerox создал новую систему принтеров, которая может выполнять множество задач, таких как сшивание набора печатных документов и факс. Программное обеспечение для этой системы было создано с земли и успешно выполнил свои задачи. По мере роста программного обеспечения модификация становилась все труднее, так что даже самые маленькие изменение займет цикл перераспределения до часа. Это делало это почти невозможно продолжить развитие. Проблема дизайна заключалась в том, что один основной класс Job использовался почти всеми задачами. В любое время должно быть выполнено задание на печать или задание на сшивание, был сделан вызов некоторым метод в классе Job. Это привело к огромному или "жирному" классу с множество методов, характерных для разных клиентов. Из-за этого дизайна основное задание будет известно обо всех методах задания печати, хотя для них не было необходимости.

так

Решение, предложенное Мартином, называется так называемым интерфейсом Принцип сегрегации сегодня. Применяется к программному обеспечению Xerox, добавлены интерфейсы между классом Job и всеми его клиентами используя принцип инверсии зависимостей. Вместо того, чтобы иметь один большой Был создан класс заданий, интерфейс задания сшивания или интерфейс задания печати которые будут использоваться классами Staple или Print соответственно, вызывающие методы класса Job. Поэтому был создан один интерфейс для каждого задания, которые были реализованы классом Job.

@http://en.wikipedia.org/wiki/Interface_segregation_principle#Origin

Ответ 2

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

С другой стороны, ISP занимается тем, как должен потребляться модуль, имеет ли смысл потреблять только часть модуля, игнорируя при этом какой-то аспект.

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

Тем не менее, обычно, когда фрагмент кода нарушает принцип SOLID, он часто нарушает всю партию. Конкретные примеры, которые нарушают определенный принцип, сохраняя при этом остальное, редки в природе.

Ответ 3

SRP и ISP в конечном итоге сводятся к одному и тому же. Для реализации любого из них требуется разделение классов или интерфейсов.

Однако на других фронтах существуют различия.

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

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

Более того, рефакторинг кода для конформации ISP, по-видимому, является лишь структурным изменением.

Смотрите также мой блог для SRP и ISP