【发布时间】:2009-10-29 17:50:02
【问题描述】:
**编辑:下面有几个可以工作的选项。请根据您对此事的看法投票/评论。
我正在清理并为具有以下基本结构的 c# 方法添加功能:
public void processStuff()
{
Status returnStatus = Status.Success;
try
{
bool step1succeeded = performStep1();
if (!step1succeeded)
return Status.Error;
bool step2suceeded = performStep2();
if (!step2suceeded)
return Status.Warning;
//.. More steps, some of which could change returnStatus..//
bool step3succeeded = performStep3();
if (!step3succeeded)
return Status.Error;
}
catch (Exception ex)
{
log(ex);
returnStatus = Status.Error;
}
finally
{
//some necessary cleanup
}
return returnStatus;
}
有很多步骤,在大多数情况下,步骤 x 必须成功才能继续执行步骤 x+1。现在,我需要添加一些始终在方法结束时运行的功能,但这取决于返回值。我正在寻找有关如何干净地重构它以获得预期效果的建议。显而易见的选择是将依赖于返回值的功能放在调用代码中,但我无法修改调用者。
一个选项:
public void processStuff()
{
Status returnStatus = Status.Success;
try
{
bool step1succeeded = performStep1();
if (!step1succeeded)
{
returnStatus = Status.Error;
throw new Exception("Error");
}
bool step2succeeded = performStep2();
if (!step2succeeded)
{
returnStatus = Status.Warning;
throw new Exception("Warning");
}
//.. the rest of the steps ..//
}
catch (Exception ex)
{
log(ex);
}
finally
{
//some necessary cleanup
}
FinalProcessing(returnStatus);
return returnStatus;
}
这对我来说似乎有点难看。相反,我可以直接从 performStepX() 方法中抛出。然而,这留下了在 processStuff() 的 catch 块中适当地设置 returnStatus 变量的问题。您可能已经注意到,处理步骤失败时返回的值取决于哪个步骤失败。
public void processStuff()
{
Status returnStatus = Status.Success;
try
{
bool step1succeeded = performStep1(); //throws on failure
bool step2succeeded = performStep2(); //throws on failure
//.. the rest of the steps ..//
}
catch (Exception ex)
{
log(ex);
returnStatus = Status.Error; //This is wrong if step 2 fails!
}
finally
{
//some necessary cleanup
}
FinalProcessing(returnStatus);
return returnStatus;
}
如果您有任何建议,我将不胜感激。
【问题讨论】:
标签: c# refactoring