2011-12-06 149 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記錄器來避免一次又一次地調用狀態。

謝謝。