Перегрузка лучших практик - PullRequest
4 голосов
/ 03 сентября 2010

У меня есть два статических метода, которые я хочу использовать для обработки ошибок.Один из которых передает объект исключения, а другой просто используется, если необходимо сообщить об ошибке, которая будет текстовым сообщением (строка 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 ]

9 голосов
/ 03 сентября 2010

Поскольку все, что вы делаете по-другому, - это создание собственного сообщения в первом методе, измените свой первый метод, чтобы вместо этого передать пользовательское исключение через метод сообщения об ошибке в виде простого текста:

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 логическое значение для третьей перегрузки.

5 голосов
/ 03 сентября 2010

Можете ли вы просто сделать перегрузку с меньшим количеством параметров, вызвать тот, у которого больше, передав null или "" как пользовательское сообщение?

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

Обратите внимание, что если вы используете C # 4, вы можете сделать это без перегрузки, используя необязательный параметр.

3 голосов
/ 03 сентября 2010

Одним простым решением было бы извлечь дублированный код в его собственный метод, например так:

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)
}

Это, конечно, не самый элегантный способ сделать это, но это только начало; -)

1 голос
/ 03 сентября 2010

При перегрузке методов убедитесь, что первые параметры всегда одинаковы.Это немного сбивает с толку в противном случае.В вашем случае сделайте исключение последним параметром.

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

Что касается дублирования кода.Заставьте оба метода вызвать третий защищенный метод, который выполняет фактическую обработку.Метод исключения может отформатировать исключение и добавить его в параметр сообщения перед вызовом третьего метода.

0 голосов
/ 08 сентября 2010

Другие ответы хороши, но я подумал, что хотел бы добавить что-то, чтобы избежать столкновения, которое, как правило, вызывает боль в обслуживании ...

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.

Это обычно очень раздражает, когда вам приходится проводить рефакторинг всех этих методов просто потому, что вы хотите изменить параметр в одном из методов.

0 голосов
/ 03 сентября 2010
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...
}
...