2009-10-25 145 views
1

我確定有人可能以前已經問過這種類型的問題,但我似乎無法找到類似的問題。C#避免重複代碼

我有這樣的事情:

client = Client.GetInstance(type.objectA)); 
if (client != null) 
{ 
    result += client.SaveObjectA(object); 
} 


client = Client.GetInstance(type.objectB)); 
if (client != null) 
{ 
    result += client.SaveObjectB(object); 
} 


client = Client.GetInstance(type.objectC)); 
if (client != null) 
{ 
    result += client.SaveObjectC(object); 
} 


client = Client.GetInstance(type.objectD)); 
if (client != null) 
{ 
    result += client.SaveObjectD(object); 
}  

我想找到一個好辦法來減少這種重複的代碼。

請讓我知道你的好想法。

謝謝

***其他什麼,我把前面 忘了提從web服務產生 這些方法非常重要的一部分。這是接口。

public interface Client 
    { 
     string SaveObjectA(object); 
     string SaveObjectB(object); 
     string SaveObjectC(object); 
     string SaveObjectD(object); 

    }  
+0

名稱相似的事實並不一定表示代碼可以被重構。你可以發佈各種'SaveObject *'函數的代碼嗎? – 2009-10-25 13:43:35

+0

沒有冒犯......但上面的代碼讓我想起了每天的WTF入口......不記得哪個...... – Graviton 2009-10-25 15:22:05

回答

9

聽起來像繼承會做的伎倆。讓每一個客戶選自方法

SaveObject(object o); 

的相同的接口繼承,那麼你可以這樣寫:

if (client!=null) 
{ 
    result+=client.SaveObject(object); 
} 

和多態性選擇SaveObject正確的版本,這取決於客戶端的類型。

2

這取決於你想要把保存對象的責任放在哪裏,但是我可以用接口或工廠的幾種不同方式來思考如何創建和保存對象,或許是這兩者的組合。

string result = string.Empty; 
foreach (var type in new Type[] { type.objectA, type.objectB, type.objectC, type.objectD }) 
{ 
    var client = Client.GetInstance(type) as IPersistable; 
    result += client.Save(); 
} 

其中每個客戶端實現定義Save()方法的IPersistable接口。

string result = string.Empty; 
foreach (var type in new Type[] { type.objectA, type.objectB, type.objectC, type.objectD }) 
{ 
    var client = Client.GetInstance(type); 
    result += Client.Save(client); 
} 

在客戶端類知道如何保存每種類型的對象它創建。

+0

+1我之前也做過這個。 – Pwninstein 2009-10-25 13:58:14

+0

我忘記提到的一件事是那些方法是從web服務生成的,它們都位於一個界面中。 我不確定是否有可能,但我會看看 – junk 2009-10-25 21:57:58

1

如果你必須有一個不同的名稱爲每個保存方法
(給每個保存方法的不同名稱,通常是不好的設計),
使用最佳的性能和更少的重複代碼哈希表(字典):

(如果您將散列表添加到使用類而不是靜態擴展類,則最終代碼會更少)。

static ClientExtensions : class 
{ 
    private delegate string MyDelegate(IClient, object); 

    private static Dictionary<Type, MyDelegate> myDictionary 
     = new Dictionary<Type, MyDelegate>(); 

    /// <summary>Static Contstructor</summary> 
    static MyExtenderType() 
    { 
     myDictionary.Add(typeof(ClientA), SaveObjectAExtensionMethod); 
     myDictionary.Add(typeof(ClientB), SaveObjectBExtensionMethod); 
     myDictionary.Add(typeof(ClientC), SaveObjectCExtensionMethod); 
     myDictionary.Add(typeof(ClientD), SaveObjectDExtensionMethod); 
    } 

    // TODO: copy for B, C & D 
    public static string SaveObjectAExtensionMethod(this IClient client, object obj) 
    { 
     return client.SaveObjectA(obj); 
    } 

    public static string SaveObject(this IClient client, object obj) 
    { 
     MyDelegate dele; 
     if (this.myDictionary.TryGetValue(typeof(client), out dele)) 
      return dele(client, obj); 

     throw new NotSupported... 
    } 
}