重载最佳实践

时间:2010-09-03 09:03:46

标签: c# overloading

我有两个静态方法,我想用它来处理错误。其中一个传递异常对象,另一个只是在需要报告错误时使用,该错误是基于文本的消息(字符串errorMessage)。

除了如何构建消息并将其发送到日志文件之外,两种方法中的代码几乎完全相同。我怎样才能重构这个以便我不重复代码?

public static void ReportError(Exception exceptionRaised, string reference, string customMessage, bool sendEmail)
{
    // get filename
    // check if logfile exists, blah, blah
    // build up message from exception, reference & custom message using string builder
    // save message
    // email error (if set)
}

public static void ReportError(string errorMessage, string reference, bool sendEmail)
{
    // get filename
    // check if logfile exists, blah, blah
    // build up message from errorMessage & reference string builder
    // save message
    // email error (if set)
}

感谢。

6 个答案:

答案 0 :(得分:9)

看到你所做的一切都是在第一种方法中构建自定义消息,改变你的第一种方法来通过纯文本错误消息方法传递自定义异常:

public static void ReportError(Exception exceptionRaised, string reference, 
    string customMessage, bool sendEmail)
{
    string errorMessage = BuildMessage(exceptionRaised, customMessage);
    ReportError(errorMessage, reference, sendEmail);
}

免责声明:不完全确定这是否有效。这取决于您如何构建错误消息。

编辑:

或者您可以添加第三个重载:

private static void ReportError(string completeException, bool sendEmail)
{
     // Do what needs to be done.
}

然后你的方法可以构建异常消息并将该字符串和sendEmail boolean传递给第三个重载。

答案 1 :(得分:5)

您是否可以使用较少的参数调用具有更多参数的重载,将null或“”作为自定义消息传递?

public static void ReportError(string errorMessage,
                               string reference,
                               bool sendEmail)
{
    ReportError(errorMessage, reference, null, sendEmail);
}

请注意,如果您使用的是C#4,则可以使用可选参数在不重载的情况下执行此操作。

答案 2 :(得分:3)

一个简单的解决方案是将重复的代码提取到它自己的方法中,如下所示:

public static void ReportError(Exception exceptionRaised, string reference, string customMessage, bool sendEmail)
{
    // build up message from exception, reference & custom message using string builder
    ProcessError(Message, SendEmail)
}

public static void ReportError(string errorMessage, string reference, bool sendEmail)
{
    // build up message from errorMessage & reference string builder
    ProcessError(Message, SendEmail)
}

private static void ProcessError(string message, bool sendEmail)
{
    // get filename
    // check if logfile exists, blah, blah
    // save message
    // email error (if set)
}

这当然不是最优雅的方式,但它是一个开始; - )

答案 3 :(得分:1)

重载方法时,请确保第一个参数始终相同。否则,这有点令人困惑。在您的情况下,将异常作为最后一个参数。

public static void ReportError(string customMessage, string reference, bool sendEmail, Exception exceptionRaised) 

至于代码重复。使两个方法调用第三个受保护的方法来执行实际处理。 异常方法可以格式化异常并在调用第三个方法之前将其添加到message参数。

答案 4 :(得分:0)

void report(Exception e)
{
  //convert exception to plain text
  string text = e.ToString();
  //re-use the other overload
  report(text);
}

void report(string text)
{
  ...etc...
}

更复杂的版本:

delegate string GetString();

public void report(Exception e)
{
  GetString getString = delegate() { return e.ToString(); }
  report(getText);
}

public void report(string text)
{
  GetString getString = delegate() { return text; }
  report(getText);
}

void report(GetString getString)
{
  ...etc...
  string text = getString();
  ...etc...
}

答案 5 :(得分:0)

其他答案都很好,但我想我会添加一些东西,以避免我遇到的往往是一个维持痛苦......

public void report(string text)
{
   ...
   report(text,defaultvalue);
}

public void report(string text, string email)
{
   ...
   report(text,email,null);
}

public void report(string text, string email, List<string> errors)
{
   ...
}
...
etc.

当您必须重构所有这些方法时,这往往会非常烦人,因为您想要在其中一个方法中更改参数。