Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#重构代码_C#_Refactoring - Fatal编程技术网

C#重构代码

C#重构代码,c#,refactoring,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); 是否有可能以某种方式重构此代码并去掉状态行

目前我有这样的代码

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调用中,但这只会使方法变得混乱。

比@Jason稍有改进

public void ExecuteAndLog(Func<T> func, string startMessage, string endMessage) {
    Status(startMessage);
    var result = func;
    Status(endMessage, result);
}
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);
public object ExecuteAndLog(Func-Func,int-number){
状态(string.Format(“开始步骤{0}”,编号));
var结果=func;
状态(string.Format(“结束步骤{0}”,编号),结果);
返回结果;
}
//用起来像:
var结果=ExecuteAndLog(步骤1,1);
结果=ExecuteAndLog(步骤2,2);
结果=ExecuteAndLog(步骤3,3);

比@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);
public object ExecuteAndLog(Func-Func,int-number){
状态(string.Format(“开始步骤{0}”,编号));
var结果=func;
状态(string.Format(“结束步骤{0}”,编号),结果);
返回结果;
}
//用起来像:
var结果=ExecuteAndLog(步骤1,1);
结果=ExecuteAndLog(步骤2,2);
结果=ExecuteAndLog(步骤3,3);

可能是这样的:

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

也许是这样的:

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

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

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


    }
Runner(步骤1、步骤2、步骤3);
公共无效运行程序(参数函数[]步骤列表)
{
foreach(步骤列表中的var动作)
{
状态(act.Method.Name+“已启动”);
var result=act.Invoke();
状态(act.Method.Name+“结束”,结果);
}
}

如果它们都返回相同的结果类型,您可以这样做

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


    }
Runner(步骤1、步骤2、步骤3);
公共无效运行程序(参数函数[]步骤列表)
{
foreach(步骤列表中的var动作)
{
状态(act.Method.Name+“已启动”);
var result=act.Invoke();
状态(act.Method.Name+“结束”,结果);
}
}

您可以使用Spring.Net logger来避免一次又一次地调用状态


谢谢。

您可以使用Spring.Net logger来避免一次又一次地调用Status


谢谢。

创建一个接受lambda(包含步骤1、2、3…)的函数。用适当的lambda调用该functon;让它增加一个本地步骤编号,并打印“开始”,执行lambda,打印“结束步骤”。创建一个接受lambda的函数(包含步骤1、2、3…)。用适当的lambda调用该functon;让它增加一个本地步骤编号,并打印“开始”,执行lambda,打印“结束步骤”。+1,但建议将
func
放在最后。然后调用将是
ExecuteAndLog(“开始步骤1”,“结束步骤1”,()=>Step1())
+1,但建议将
func
放在最后。然后调用将是
ExecuteAndLog(“开始步骤1”,“结束步骤1”,()=>Step1())
    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);  
        }


    }