这段代码一直困扰着我,部分是因为
if (result != OpResult.Success) { // return
Run Code Online (Sandbox Code Playgroud)
代码重复,到处都是.
1..n执行一系列评估.每次评价后,进行检查,以确保手术很成功(利用枚举派生的自定义返回值): OpResult.Success.
这是一个例子(带有示例对象等):
OpResult result = OpResult.Sucess;
result = performOperationOne(commonObjectArgument);
if (result != OpResult.Success)
{
trace.Exit(); // Exit logging mechanism
return result;
}
result = performOperationTwo(commonObjectArgument);
if (result != OpResult.Success)
{
trace.Exit();
return result;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,if (result != OpResult.Success)用作流控制,即除非所有先前的操作都成功,否则下一个操作不会运行.
使用.Net 4.*,C#在语法上已经具备了一些非常令人难以置信的功能.我可以采取哪些措施来消除每次操作后需要重新编写此评估的内容吗?
一种可能性是构建操作列表并在循环中执行它们:
var operations = new List<Func<CommonObjectArgumentType, OpResult>>
{
Operation1,
Operation2
};
OpResult result = OpResult.Success;
foreach (var op in operations)
{
result = op(commonObjectArgument);
if (result != OpResult.Success)
{
trace.exit();
return result;
}
}
// all operations were successful
Run Code Online (Sandbox Code Playgroud)
如果签名是相同的,如示例代码所示,您可以在循环中执行这些函数:
// create a collection of your functions where `object` is your argument type
var functions = new Func<object, OpResult>[] {
performOperationOne,
performOperationTwo,
/* etc... */
};
var result = OpResult.Success;
foreach(var function in functions)
{
result = function(commonObjectArgument);
if (result != OpResult.Success)
{
trace.Exit(); // Exit logging mechanism
break;
}
}
return result;
Run Code Online (Sandbox Code Playgroud)
这样,所有状态检查都在同一个地方完成.