重载最佳实践

时间:2010-07-09 20:38:49

标签: c# .net asp.net oop

假设我有一个返回业务对象的方法:

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()因为我想要返回原来的响应。

5 个答案:

答案 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进行序列化?

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