将两个方法重构为具有相同字段但名称不同的方法

时间:2014-12-03 01:00:03

标签: c# .net refactoring

我有两个具有完全相同代码的事件处理程序,除了处理不同的事件。如何将这些组合使用相同的代码而不必重复自己?

static void SharePointEventHandler(object sender, SharePointEventArgs e)
{
    switch (e.ExceptionType)
    {
        case SharePointEventArgs.ExceptionLevel.Debug:
            CLog(LogType.Debug, e.Message);
            break;

        case SharePointEventArgs.ExceptionLevel.Info:
            CLog(LogType.Info, e.Message);
            break;

        case SharePointEventArgs.ExceptionLevel.Error:
            CLog(LogType.Error, e.Message, e.Exception);
            break;
    }
}

static void FTPEventHandler(object sender, FTPEventArgs e)
{
    switch (e.ExceptionType)
    {
        case FTPEventArgs.ExceptionLevel.Debug:
            CLog(LogType.Debug, e.Message);
            break;

        case FTPEventArgs.ExceptionLevel.Info:
            CLog(LogType.Info, e.Message);
            break;

        case FTPEventArgs.ExceptionLevel.Error:
            CLog(LogType.Error, e.Message, e.Exception);
            break;
    }
}

1 个答案:

答案 0 :(得分:3)

根据代码的当前状态,您可以通过多种方式重构此代码。我假设目前,两个EventArgs子类根本没有关系。恕我直言,这样做的最好方法是改变它。具体来说,创建一个基类,两个现有的子类都派生自:

class ExceptionEventArgs : EventArgs
{
    public enum ExceptionLevel
    {
        Debug,
        Info,
        Error
    }

    public ExceptionLevel ExceptionType { get; set; }
    public string Message { get; set; }
    public Exception Exception { get; set; }
}

class SharePointEventArgs : ExceptionEventArgs { ... }
class FTPEventArgs : ExceptionEventArgs { ... }

然后,您可以对两个事件使用相同的事件处理程序:

static void SharePointEventHandler(object sender, ExceptionEventArgs e)
{
    switch (e.ExceptionType)
    {
        case ExceptionEventArgs.ExceptionLevel.Debug:
            CLog(LogType.Debug, e.Message);
            break;

        case ExceptionEventArgs.ExceptionLevel.Info:
            CLog(LogType.Info, e.Message);
            break;

        case ExceptionEventArgs.ExceptionLevel.Error:
            CLog(LogType.Error, e.Message, e.Exception);
            break;
    }
}

这利用了.NET委托类型的差异支持。委托实例可以将任何方法作为目标,该方法接收为委托类型指定的确切类型的参数,或者可以从为委托类型指定的参数分配哪些参数。