Нарушает ли образец стратегии принцип единой ответственности? - PullRequest
4 голосов
/ 28 апреля 2009

Если принцип единой ответственности гласит, что у каждого объекта должна быть одна причина для изменения, а у одного класса стратегии, реализованного с помощью шаблона «Стратегия» (по определению), есть несколько методов, которые могут изменяться по любому числу причин, означает ли это, что невозможно реализовать шаблон Стратегии без нарушения ПСП?

Ответы [ 4 ]

3 голосов
/ 28 апреля 2009

Как так? Паттерн стратегии, если я помню, в основном - это способ отделить используемую логику / алгоритм. Таким образом, у клиента есть m_IAlgorithm. IAlgorithm должен иметь небольшой набор методов, если не один.

Таким образом, единственная причина, по которой класс AlgoImplementation может измениться, это

  • если есть изменения в алгоритме, который он реализует. ( изменить свою ответственность / поведение )
  • или если IAlgoritm изменится .. что будет редко, если вы не ошиблись в определении интерфейса. (Это изменение в собственном публичном интерфейсе - так что не думайте, что это нарушение SRP.)
3 голосов
/ 28 апреля 2009

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

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

2 голосов
/ 18 апреля 2011

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

Используйте шаблон стратегии, чтобы определить набор алгоритмов, которые клиент использует взаимозаменяемо, тогда принцип единой ответственности можно использовать для определения, где группировать клиента и алгоритмы, которые клиент использует в системе. Вам не нужно беспокоить код для алгоритма A, если ваша работа только в алгоритме B и наоборот. Для скомпилированных языков это может оказать существенное влияние на сложность цикла перефакторинга, версии и развертывания. Зачем версировать и перекомпилировать клиент и алгоритмы A, C и D, когда требуются только изменения в алгоритме B.

При таком понимании принципа единой ответственности я не вижу, где наличие класса, реализующего шаблон стратегии, нарушает SRP. Цель клиентского класса - реализовать шаблон стратегии, то есть ответственность клиента. Цель алгоритмов состоит в том, чтобы реализовать логику, за которую они несут ответственность, и принцип единой ответственности гласит: не группируйте их все вместе в системе, поскольку они будут меняться по разным причинам. Это мои $ 0,02.

0 голосов
/ 28 апреля 2009

Хороший вопрос :) Я думаю, это скорее единое руководство по ответственности, которое имеет смысл для многих случаев, но для некоторых также нет, например, для стратегии ..

...