假设我有一个返回业务对象的方法:
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()因为我想要返回原来的响应。
答案 0 :(得分:8)
我不确定为什么你会在这里重载相同的方法。
一个是返回对象,另一个是返回该对象的XML表示/序列化。我会用两种不同的方法。
更有趣的是你使用这些对象和XML序列化做了什么;消费者可能想要2个重载,它们将任一类型作为参数,但这取决于您的需求。
答案 1 :(得分:4)
public static MyType GetObject()
{
return Blah.Blah();
}
public static string GetObjectAsXml()
{
return Blah.Blah().Xml();
}
答案 2 :(得分:2)
有几种方法可以做到这一点 - 你的一些决定将取决于你的系统。但是,如果我设计的系统需要根据谁需要信息而不同地返回信息,我不会让对象负责提供正确的格式,因为这违反了维持高系数的原则(AKA,一个方面的系统只做一件事。)
相反,我会创建一个子系统,它可以接收你的业务对象,并且知道如何将它转换为XML,平面文件,YAML,无论你需要它。而且,如果您有其他业务对象来自同一个“业务对象基类”,那么该子系统也适用于所有这些,创建一个更可重用的系统。
答案 3 :(得分:0)
在这种情况下,我不确定你是否需要超载。
public static MyObject GetObject()
{
return Blah.Blah();
}
获取对象。获取对象的XML似乎是一个实例函数,而不是静态函数,您可以通过此调用获取XML:
string xmlStuff = GetObject().Xml();
答案 4 :(得分:0)
最佳做法?如何更好地实践,特别是单一责任原则?
您的方法结合了获取对象和序列化它的职责。 SRP规定这些是两个完全不同的职责。此外,谁会说你希望它使用XmlSerializer,XamlSerializer,甚至NetDataContractSerializer进行序列化?
我让必须具有序列化对象的类型进行序列化。我将一个类型指定为我的序列化程序,将它作为一些依赖注入框架的一部分注入,并在任何地方使用它来进行序列化。或者,如果需要序列化对象的类型负责序列化和反序列化,我会让它负责选择序列化器本身。