2011-01-24 2 views
3

типа я наткнулся некоторым код сегодня, что были похожи на:Замена условных цепи проверки

if (myObject is MyClass1) 
    myOtherObject = new MyOtherClass1(myObject); 
    else if (myObject is MyClass2) 
    myOtherObject = new MyOtherClass2(myObject); 
    else if (myObject is MyClass3) 
    myOtherObject = new MyOtherClass3(myObject); 
    else if (myObject is MyClass4) 
    myOtherObject = new MyOtherClass4(myObject); 
    else if (myObject is MyClass5) 
    myOtherObject = new MyOtherClass5(myObject); 
    else if (myObject is MyClass6) 
    // ... 

Я нахожу это довольно трудно поддерживать, и хотели бы заменить его чем-то менее громоздким. Какие у меня варианты?

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

// Not even sure this is valid syntax. 
foreach (myClass in classes) 
    if myObject is myClass 
     new classes[myClass](myObject); 

Другие идеи?

Update

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

MyBaseClass        MyOtherBaseClass 
    |          | 
    -MyClass1        -MyOtherClass1 
    |          | 
    -MyClass2        -MyOtherClass2 

MyBaseClass и его потомки, что я хотел бы рассмотреть постоянные объекты передачи данных. Они хранят свои данные в определенном классе формате.

Ближе всего я могу описать MyOtherBaseClass, и его потомками будут однонаправленные карты данных [PoEAA], но они также смешивают небольшую бизнес-логику.

В базе данных хранится достаточно информации для поиска объектов и отслеживания их состояния.

+0

Каким образом 'MyOtherClass1',' MyOtherClass2 'и другие отличаются друг от друга? –

+0

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

+0

@codeelegance: хорошо, я думал, что, возможно, дженерики могут быть полезны, но, вероятно, это не так. –

ответ

5

Не могли бы вы рассмотреть вопрос абстрактный метод generateOtherObject() в базовом классе для MyClass1, MyClass2 и т.д., который переопределен в каждом производном классе, чтобы создать новый объект соответствующего типа?

+1

Почему вы предполагаете, что MyClass1, MyClass2 имеют общий базовый класс? – leppie

+0

@leppie: Справедливая точка! –

+0

@leppie, на самом деле его предположение верно. MyClass * все спускаются с одного базового класса и MyOtherClass * все спускаются из другого базового класса. –

2

Другое предложение может заключаться в использовании строителя .

В одном утверждении полагается словарь, который для каждого типа описывает действие здания, которое должно выполняться для создания нового экземпляра (который должен быть легче поддерживать, чем инструкция if-else/switch).

Предоставлено MyOtherClass1, MyOtherClass2 все derrive из MyOtherBaseClass, следующий код может помочь вам:

public class YourTypeBuilderBuilder 
    { 
     private readonly static IDictionary<Type, Func<object, MyOtherBaseClass>> builderMap = new Dictionary<Type, Func<object, MyOtherBaseClass>>(); 

     static YourTypeBuilderBuilder() 
     { 
      /* Here is described the specific behavior 
      of the building of the requested type */ 

      builderMap.Add(typeof(MyClass1), obj => new MyOtherClass1((MyClass1)obj)); 
      builderMap.Add(typeof(MyClass2), obj => new MyOtherClass2((MyClass2)obj)); 
      builderMap.Add(typeof(MyClass3), obj => new MyOtherClass3((MyClass3)obj)); 
     } 

     public static MyOtherBaseClass Build<T>(T input) 
     { 
      Func<object, MyOtherBaseClass> typeBuilder; 
      bool hasTypeBeenFound = builderMap.TryGetValue(typeof(T), out typeBuilder); 

      if (!hasTypeBeenFound) 
      { 
       throw new ArgumentException(string.Format("'{0}' is not a valid parameter.", typeof(T))); 
      } 

      // Let's build the requested type 
      MyOtherBaseClass obj = typeBuilder(input); 

      return obj; 
     } 
    }

Тогда ваш код вызова превратится в

myOtherObject = YourTypeBuilder.Build(myObject);
+0

+1 Мой предпочтительный подход тоже – leppie

Смежные вопросы