我有一个大的对象,在我做它之前,我需要检查多个条件.我有一个很大的功能.这是不可读的,我想把它拆分为较小的功能,使我的代码更清晰.
该函数正在检查条件,如果某些东西不正确,它会停止并返回问题(属于某种enum类型).
它看起来像这样:
AnswerEnum CheckEverything(Bigobj o)
{
// some calculation
if (...)
return AnswerEnum.Error1;
// some more calculation
if (...)
return AnswerEnum.Error2;
...
return AnswerEnum.OK;
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在较小的函数中进行计算,我可以做到以下几点:
AnswerEnum CheckEverything(Bigobj o)
{
AnswerEnum ret;
ret=CheckFirstThing(o);
if (ret!=AnswerEnum.OK)
return ret;
ret=CheckSecondThing(o);
if (ret!=AnswerEnum.OK)
return ret;
...
return AnswerEnum.OK;
}
Run Code Online (Sandbox Code Playgroud)
该解决方案包含
if (ret!=AnswerEnum.OK)
return ret;
Run Code Online (Sandbox Code Playgroud)
多次,我不喜欢它.我想最小化return语句的数量和代码的任何重复部分.在这种情况下我该怎么做?
如果所有检查函数都具有相同的签名(在您发布的代码中似乎就是这种情况),那么您所要做的就是创建一个委托列表,如下所示:
List<Func<Bigobj, AnswerEnum>> list;
Run Code Online (Sandbox Code Playgroud)
然后在类初始化期间将所有检查方法添加到其中:
list.Add(CheckFirstThing);
list.Add(CheckSecondThing);
Run Code Online (Sandbox Code Playgroud)
最后,检查一切:
AnswerEnum ret;
foreach(Func<Bigobj, AnswerEnum> f in list)
{
ret = f(o);
if (ret != AnswerEnum.Ok) return ret;
}
return AnswerEnum.Ok;
Run Code Online (Sandbox Code Playgroud)