Какой шаблон дизайна я должен использовать для этого? - PullRequest
3 голосов
/ 10 января 2012

У меня есть часть логики, которую мне нужно выполнить один или несколько раз (в цикле) в зависимости от типа. Имеет ли смысл шаблон стратегии здесь? По сути:

if (type == 1)
{
   ProcessReport("");
}
else if (type == 2)
{
   for (int i = 0; i < numUsers; i++)
   {
     ProcessReport(userId);
   }
}

public void ProcessReport(string id)
{
   if (id == "")
   {
     //Send full report
   }

   else
   {
     GetReportFragment();

     //Send report
   }
}

Ответы [ 6 ]

4 голосов
/ 10 января 2012

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

Однако для простых задач это может быть излишним. Что более неприятно с вашим кодом:

  • использование магических чисел для ваших типов: вы должны по крайней мере изменить их на перечисления для улучшения читабельности
  • передача пустых параметров ("") для указания конкретного поведения: по крайней мере, создайте отдельный метод для «полного отчета», если у вас нет идентификатора для указания
2 голосов
/ 10 января 2012

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

Я не вижу сложных алгоритмов, для которых стоит добавить еще один уровень абстракции

Если вы хотите инкапсулировать поведение ProcessReport, я бы создал интерфейс, представляющий это поведение, чтобы вы могли просто вызвать IProcessReport.Process(userId) в своем цикле

1 голос
/ 10 января 2012

В зависимости от семантики переменной type может иметь смысл использовать полиморфизм.

Учитывая текущий пример, это может быть накладные расходы (есть только две ветви), но каждый раз, когда вы видите структуры типа if() ... else if() ... else if() ... или switch() { case: ... }, вы должны задаться вопросом: сколько будет условных ветвей? Вполне вероятно, что в будущем появятся новые?

В зависимости от ответов на эти вопросы мы можем принять решение: Заменить условное на полиморфизм рефакторинг.

0 голосов
/ 11 января 2012

Мне кажется, что шаблон стратегии - правильное решение, несмотря на простоту текущей функции. В общем, я избегаю операторов if и пытаюсь разбить мой код на части. Наблюдения Гроо по коду «запахи» тоже мои. Полиморфизм (стратегия) может показаться излишним, но я бы предпочел немного более абстрактное решение, чем пытаться изменить поведение функции на основе строкового параметра, который, мы надеемся, пуст или числа.

0 голосов
/ 10 января 2012

Итак, это просто пример или это фактический размер? Я имею в виду, если у вас есть два типа, лучший шаблон, чтобы использовать его просто :).

Если у вас есть несколько типов, то у вас там может быть стратегия или словарь-делегат / команда с кодом, который вы хотите выполнить.

0 голосов
/ 10 января 2012

Ваш код может быть упрощен до этого:

if (type == 1)
    SendFullReport();
else if (type == 2)
    for (int i = 0; i < numUsers; i++)
        GetReportFragment(userId);

Конечно, вам придется реализовать методы SendFullReport() и GetReportFragment(string userId).

Нет смысла использоватьсложные шаблоны проектирования в этом контексте.

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