纠正功能的正确方法

gko*_*s90 1 c# function

我有一个大的对象,在我做它之前,我需要检查多个条件.我有一个很大的功能.这是不可读的,我想把它拆分为较小的功能,使我的代码更清晰.

该函数正在检查条件,如果某些东西不正确,它会停止并返回问题(属于某种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语句的数量和代码的任何重复部分.在这种情况下我该怎么做?

ppe*_*rov 6

如果所有检查函数都具有相同的签名(在您发布的代码中似乎就是这种情况),那么您所要做的就是创建一个委托列表,如下所示:

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)