Каково точное определение шаблона разработки стратегии? - PullRequest
6 голосов
/ 26 марта 2009

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

Мы оба согласны с тем, что шаблон стратегии позволяет менять внутренности класса (например, поведение) во время выполнения при сохранении того же интерфейса. Тем не менее, она утверждает, что «для того, чтобы [алгоритмы] были стратегией, вы должны получить те же результаты». Я утверждаю, что замена «алгоритма» или логики класса может означать, что результаты переопределенной операции различны, но что она все еще соответствует цели, намерению (и классификации) шаблона стратегии.

Пример кода с комментариями:


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

Interface Strategy
{
    DoArithmatic(int[] a)
}

Class A : Strategy
public int DoArithmatic(int[]a)
{
     int temp = 0;
     for(int i =0; i< a.length; i++)
          temp += a[i]
}

Class B : Strategy
public int DoArithmaticB(int[]a)
{
     int temp = 0;
     for(int i =a.length -1; i>-1; i--)
          temp += a[i]
}

Class C : Strategy
public int DoArithmatic(int[]a)
{
     int temp = 0;
     for(int i =0; i< a.length; i++)
          temp -= a;
}

int[] a = { 1,2,3 }
ClassA.DoArithmatic(a) = 6
ClassB.DoArithmatic(a) = 6
ClassC.DoArithmatic(a) = -6//This one is not interchangeable

Первые две являются стратегиями. Потому что за любой вклад они дадут вам ТОЧНЫЙ ответ. последний нет. То, что он дает вам int, не делает его стратегией. Они должны "сделать" то же самое.

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

Все они делают "МАТ", но не все делают "одно и то же" по-разному. В этом суть стратегии.

Итак, кто прав?

Ответы [ 9 ]

11 голосов
/ 26 марта 2009

Вы, сэр, правы, и ваш коллега должен прочитать GoF.

«Шаблон стратегии позволяет алгоритмам варьироваться независимо от клиентов, которые их используют.»

См:

http://www.dofactory.com/Patterns/PatternStrategy.aspx

6 голосов
/ 26 марта 2009

Технически, стратегии могут делать все, что хотят.

Только когда «внешний контекст» диктует какое-то фиксированное и повторяемое поведение, которое не может быть зафиксировано в программном интерфейсе (назовите их «желаемыми свойствами»), вам нужно позаботиться о том, чтобы ваши стратегии были действительно заменяемыми - как Лисков в отношении этих желательных свойств.

4 голосов
/ 26 марта 2009

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

Например, если вы хотите посетить каждый узел дерева, допустимыми стратегиями могут быть:

  • Предварительный заказ на поиск по глубине
  • DFS пост-заказ
  • BFS
  • рандомизированы
  • ...

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

3 голосов
/ 26 марта 2009

Первые два являются стратегиями. Поскольку для любого входа они дадут вам ТОЧНЫЙ тот же самый ответ. последний нет. Просто потому, что он дает вам int, не делает его стратегией. Они должны «делать» одно и то же.

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

Таким образом, если целью Strategy в вашем примере является выполнение любой арифметики с входными данными, то каждый пример является стратегией для этой цели. Если бы целью было суммирование массива, который он передал, DoArithmatic был бы назван CalculateSum, и последний пример не соответствовал бы контракту стратегии, и поэтому нарушил бы LSP .

3 голосов
/ 26 марта 2009

FWIW, статья Википедии согласна с вами и никогда не слышала о ее положении.

2 голосов
/ 26 марта 2009

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

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

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

Порядок сортировки варьируется в зависимости от страны. Некоторые места сортируются без акцента. Некоторые ставят МакДака с МакДаком и так далее. Это стратегии, это идеальное применение шаблона стратегии, и стратегии, безусловно, не детерминистически эквивалентны.

Вы выиграли.

2 голосов
/ 26 марта 2009

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

2 голосов
/ 26 марта 2009

В соответствии с "Образцами первых образцов" ( см. Здесь ), стр. 24

"Шаблон стратегии определяет семейство алгоритмов,
инкапсулирует каждый и делает их взаимозаменяемыми.
Стратегия позволяет алгоритму изменяться независимо от
клиенты, которые его используют. «

Итак, сэр, вы правы, по крайней мере, в соответствии с людьми, которые определили образец, но что они знают.

0 голосов
/ 26 марта 2009

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

...