C#重构代码

时间:2011-12-06 04:26:28

标签: c# refactoring

目前我的代码看起来像这样

Status("Start Step 1");
result = Step1();
Status("End Step 1", result);

Status("Start Step 2");
result = Step2();
Status("End Step 2", result);

Status("Start Step 3");
result = Step3();
Status("End Step 3", result);

是否有可能以某种方式重构此代码并摆脱状态行。 - 但是,在每个步骤的开始和结束时更新状态非常重要。

我考虑过将状态行移动到Step1,2,3调用中,但这会使方法变得混乱。

5 个答案:

答案 0 :(得分:5)

public void ExecuteAndLog(Func<T> func, string startMessage, string endMessage) {
    Status(startMessage);
    var result = func;
    Status(endMessage, result);
}

带有明显的调用

您可以根据需要进行优化。例如,建立在前一个:

public void ExecuteAndLog(Func<T> func, string message) {
    ExecuteAndLog(func, "Start " + message, "End " + message);
}

使调用稍微简单甚至

public void ExecuteAndLog(Func<T> func, int stepNumber) {
    ExecuteAndLog(func, String.Format("Step {0}", stepNumber));
}

建立在前一个。所以现在你可以说

ExecuteAndLog(Step1, 1);
ExecuteAndLog(Step2, 2);
ExecuteAndLog(Step3, 3);

答案 1 :(得分:1)

略微改善@Jason

public object ExecuteAndLog(Func<T> func, int number) {
    Status(string.Format("Start Step {0}", number));
    var result = func;
    Status(string.Format("End Step {0}", number), result);
    return result;
}

// and used like:

var result = ExecuteAndLog(Step1, 1);
result = ExecuteAndLog(Step2, 2);
result = ExecuteAndLog(Step3, 3);

答案 2 :(得分:1)

也许是这样的:

public void RunStep<T>(string stepName, Func<T> stepFunc)
    {
        Status("Start Step " + stepName);
        var result = stepFunc();
        Status("End Step " + stepName, result);
    }

将被称为:

RunStep("1", Step1);
RunStep("2", Step2);
RunStep("3", Step3);

答案 3 :(得分:0)

如果他们都返回相同的结果类型,你可以像

那样
    Runner(Step1, Step2, Step3);


    public void Runner<T>(params Func<T>[] stepList)
    {
        foreach (var act in stepList)
        {
            Status(act.Method.Name + "Started");
            var result=act.Invoke();
            Status(act.Method.Name + "Ended", result);  
        }


    }

答案 4 :(得分:0)

您可以使用Spring.Net记录器来避免一次又一次地调用Status。

感谢。