2011-12-06 118 views
1

目前,我有代码看起来像这样C#代码重构

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的调用,但这只是使方法混乱。

+1

创建一个接受lambda表达式的函数(包含Step1,2,3 ...)。用适当的lambda调用该functon;让它增加一个本地步数,并打印“开始”,做lambda,打印“结束步骤”。 –

回答

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); 
+0

可能想修复两个字符串参数之间的小错字(无逗号)... – Jace

+0

+1,但建议将'func'放在最后。这个调用将会是'ExecuteAndLog(“Start step 1”,“End step 1”,()=> Step1())' –

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

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

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


    } 
0

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

谢谢。