2010-07-09 115 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进行序列化?

我想让必须有序列化对象的类型进行序列化。我会指定一个类型作为我的序列化器,将它作为一些依赖注入框架的一部分注入,并使用它来处理序列化。或者,如果需要序列化对象的类型负责序列化和反序列化,我会让它负责选择序列化器本身的责任。