2010-07-09 118 views
1

說我有一個返回業務對象的方法:重載最佳實踐

public static MyObject GetObject() 
{ 
    return Blah.Blah(); 
} 

現在我需要另一種做同樣的事情的方法,但在一個XML格式返回的MyObject:

public static string GetObject(bool returnXml) 
{ 
    return Blah.Blah.Xml(); 
} 

我從這種方法開始,但很快意識到調用者可以爲returnXml指定false。

是我唯一的選擇將我的方法重新命名爲GetObjectAsXml之類的東西嗎?


更新...謝謝大家。

我原來的方法是這樣的。

public static MyObject GetObject() 
{ 
    return ConvertToMyObject(GetResponseAsXML()); 
} 

我只需要一套新的方法是這樣的:

public static string GetObject() 
{ 
    return GetResponseAsXML(); 
} 

從它似乎是最好的辦法的答案是有第二組被命名GetObjectAsXML方法,正確的?我真的不想做GetObject()。ToXml(),因爲我想返回原始響應。

回答

8

我不知道爲什麼你會在這裏重載相同的方法。

一個正在返回對象,另一個正在返回該對象的XML表示/序列化。我會用兩種不同的方法。

更有意思的是您對這些對象和XML序列化所做的事情;消費者可能會希望2種重載將任一種類型作爲參數,但這取決於您的需求。

2

有幾種方法可以做到這一點 - 您的一些決定取決於您的系統。但是,如果我設計的系統需要根據誰需要信息而不同地返回信息,我不會讓對象負責提供正確的格式,因爲這違反了維護高級系統的原則(AKA,系統只做一件事)。

相反,我會創建一個子系統,它可以接受您的業務對象,並具有如何將其轉換爲XML,平面文件,YAML,無論您需要它的知識。而且,如果您有來自同一個「業務對象基類」的其他業務對象,那麼子系統也可以爲所有這些業務對象工作,從而創建更可重用的系統。

4
public static MyType GetObject() 
{ 
    return Blah.Blah(); 
} 

public static string GetObjectAsXml() 
{ 
    return Blah.Blah().Xml(); 
} 
+1

第一個應該是返回布拉的類型,但這只是挑剔。 – Joe 2010-07-09 20:49:54

+0

複製粘貼錯誤:)謝謝喬! – corsiKa 2010-07-09 21:14:09

0

我不確定在這種情況下是否需要超載。你有

public static MyObject GetObject() 
{ 
    return Blah.Blah(); 
} 

得到的對象。獲取對象的XML似乎是一個實例函數,而不是靜態函數,您可以通過此調用獲取XML:

string xmlStuff = GetObject().Xml(); 
0

最佳實踐?如何更好地實踐,特別是單一責任原則?

您的方法結合了獲取對象和序列化它的職責。SRP規定這是兩個完全不同的責任。此外,誰會說你想要使用XmlSerializer,XamlSerializer甚至NetDataContractSerializer進行序列化?

我想讓必須有序列化對象的類型進行序列化。我會指定一個類型作爲我的序列化器,將它作爲一些依賴注入框架的一部分注入,並使用它來處理序列化。或者,如果需要序列化對象的類型負責序列化和反序列化,我會讓它負責選擇序列化器本身的責任。