Параметры шаблона проектирования для одного и того же возвращаемого объекта, но с различными типами значений типа Enum и Value - PullRequest
1 голос
/ 21 июля 2010

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

  1. Возвращаемый объект одинаков для всех типов вызовов
  2. Базовые реализации классов могут быть выполнены для определенных типов перечислений (т. Е. ActionType = 1 отлично работает с ActionClass1, но не с ActionClass2 и ActionClass3
  3. Параметры класса варьируются в зависимости от типа

Например:

public enum ActionType
{
   Action1,
   Action2,
   Action3
}

Возможная реализация фабричного шаблона:

public static class ActionClass
{
        public static int DoAction(ActionType type, int val1, int val2)
        {
               switch (type)
               {
                  case Type1: 
                       return new ActionClass1(val1, val2).DoAction();
                       break;
                  default:
                       throw new NotImplementedException();                      
               }
         } 

         public static int DoAction(ActionType type, string val1)  
         {
             switch (type)
               {

                  case Type2: 
                       return new ActionClass2(val1).DoAction();
                       break;
                  case Type3:
                       return new ActionClass3(val1).DoAction();
                  default:
                        throw new NotImplementedException();                      
               }

         }
}    

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Обычным способом рефакторинга переключений типов является полиморфизм, путем создания класса для каждого ActionType. Поскольку каждая перегрузка DoAction принимает разные параметры, вы можете инкапсулировать их в «объект параметра» и связать каждый тип действия с его типом параметра, используя обобщенные значения:

public abstract ActionClass<T>
{
    public abstract int DoAction(T parameter);
}

public class ActionClass2 : ActionClass<string>
{
    public override int DoAction(string parameter) { ... }
}
1 голос
/ 21 июля 2010

В зависимости от того, что представляют ваши действия, вы можете взглянуть на шаблон стратегии .В противном случае шаблон метода фабрики выглядит уже как подходящее, хотя я, вероятно, изменил бы метод, чтобы он не выполнял действие немедленно, но возвращал объект, который инкапсулирует действие, и использовал бы шаблон TryXXX вместоИсключения, когда действие не поддерживает типы параметров:

public static bool TryGetIntIntAction(
    ActionType type, out Func<int, int, int> func)
{
    switch (type)
    {
    case ActionType.Action1:
        func = (val1, val2) => new ActionClass1(val1, val2).DoAction();
        return true;
    default:
        func = null;
        return false;
    }
}

public static bool TryGetStringAction(
    ActionType type, out Func<string, int> func)
{
    switch (type)
    {
    case ActionType.Action2:
        func = val1 => new ActionClass2(val1).DoAction();
        return true;
    case ActionType.Action3:
        func = val1 => new ActionClass3(val1).DoAction();
        return true;
    default:
        func = null;
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...