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