2012-02-28 48 views
1

我會如何重構這個:重構調用了一堆的構造函數,所有采取同樣的ARGS

if (cond1) { 
    return new Class1(arg1, arg2, arg3); 
} 
else if (cond2) { 
    return new Class2(arg1, arg2, arg3); 
} 
else if (cond3) { 
    return new Class3(arg1, arg2, arg3); 
} 
... 

我在避免重複arg1, arg2, arg3

+0

這可能是(非常)有助於增加你的目標在... – ChristopheD 2012-02-28 23:40:37

+0

什麼語言哎呀...對不起...添加標籤 – JoelFan 2012-02-28 23:43:00

回答

1

做一個工廠功能特別感興趣:

template<class Derived> 
Base* instantiate(A arg1, B arg2, C arg3) { 
    return new Derived(arg1, arg2, arg3); 
} 

使用有意義的鍵類型構建地圖:

std::map<int, Base(*)(A, B, C)> factory; 

factory[0] = instantiate<Class1>; 
factory[1] = instantiate<Class2>; 
factory[2] = instantiate<Class3>; 

是的,對於int,這可能只是一個數組或std::vector,但我使用上面的std::map爲了提供通用解決方案。然後您可以以明顯的方式從工廠獲取實例。對於任意的條件下,它不得不是這樣的:

int index = cond1 ? 0 
    : cond2 ? 1 
    : cond3 ? 2 
    : throw std::runtime_error("Invalid index."); 

return factory[index](arg1, arg2, arg3); 

但是可能有一個理智的方式根據您的問題的細節做到這一點。

+0

+1。這是C++,但是完全相同的方法適用於C#。 – 2012-02-28 23:48:06

+0

@AlexeiLevenkov:哎呀。這個問題沒有被標記,我只是假設。我會保持原樣,因爲工廠模式在這些語言之間是可移植的。 – 2012-02-28 23:49:44

+0

您可以在Dicitionary中對Action 執行相同的操作;動作指向在C#中具有相同參數的構造函數。 – 2012-02-29 00:01:48

1

使用激活劑

Type t = cond1 ? typeof(Class1) : cond2 ? typeof(Class2) : cond3 ? typeof(Class3) : null; 
Activator.CreateInstance(t, new object[] {arg1, arg2, arg3}); 
+0

也可能希望爲't!= null'添加檢查 – 2012-03-01 08:42:33