调用其他函数时减少if语句

时间:2012-01-31 16:38:33

标签: c#

我有一个从不同对象调用许多其他函数的函数。在调用下一个函数之前,每个函数都必须返回true。正如您所看到的,我使用了太多if语句。如何改进代码并使其更整洁?感谢

bool ISOKToDoSomthing()
{
    boo retVal = false;

    retVal = ObjA.CheckVersion(oldVersion);

    if(retVal)
    {
         retVal = objB.CheckUserRight();
    }

    if(retVal)
    {
          retVal = ObjC.ISDBExist();
    }

    if(retVal)
    {
          retVal = OjbD.ISServerUp(ServerName);
    }
    //tons of similar code as above
    ......... 
    return retVal;
 }

11 个答案:

答案 0 :(得分:9)

return 
    ObjA.CheckVersion(oldVersion) &&
    objB.CheckUserRight() && 
    ObjC.ISDBExist() && 
    OjbD.ISServerUp(ServerName);

答案 1 :(得分:8)

我的建议:如果没有明确的商业案例进行更改,请不要对此代码执行任何操作。

您的代码清晰,明显,可能正确,易于维护且易于调试。 为什么你想以任何方式改变它?花时间通过修复错误和添加功能来增加价值,而不是通过不必要地更改工作代码。当你的老板问你“你今天做了什么?”答案不应该是“我通过对正确的,有效的,已经调试过的代码进行不必要的外观修改来增加我们的日程安排风险”。

现在,如果这里确实存在问题,问题可能不是代码难以阅读,而是代码严格编码应该是用户可配置的业务流程。在这种情况下,创建一个名为“Workflow”的对象,该对象编码业务流程,以及一个评估任意工作流的引擎。然后根据用户的输入构造该对象的实例,该实例表示所需的工作流。

这实际上为用户增加了价值;用户不关心是否使用嵌套的“if”语句。

答案 2 :(得分:6)

if (!ObjA.CheckVersion(oldVersion)) return false;
if (!ObjB.CheckUserRight()) return false;
if (!ObjC.IsDBExist()) return false;
if (!ObjD.IsServerUp(serverName)) return false;

... your other checks ...

return true;

&&的短路对于一些条件很有用,但是如果你有“吨”的话,IMO太过于试图坚持一个声明。

但两者的结合可能会有用。更有用的是将这些检查中的一些压缩成更大的块(但小于IsOKToDoSomething)。例如,检查您是否有权访问数据库(是否存在,是否可以登录等)

说实话,事实上你有很多物品来检查设计问题的提示 - 也就是说,你试图一次做太多,或者你的某个地方有一个“神物”触角在系统的各个方面。你可能想看看修复它。

答案 3 :(得分:5)

return ObjA.CheckVersion(oldVersion) && objB.CheckUserRight() && ObjC.ISDBExist() && OjbD.ISServerUp(ServerName)

答案 4 :(得分:2)

也许?

 retVal = objB.CheckUserRight() && ObjC.ISDBExist() &&  OjbD.ISServerUp(ServerName);

附注,你可以测试一下,例如,如果objB在一个语句中调用一个方法之前为null(代码将在条件未满足时立即执行,即不会调用下一个条件)所以你不需要很多if(objB!= null)类型语句。 E.g:

retVal = (objB != null && objB.CheckUserRight()) && (ObjC != null && ObjC.ISDBExist()) &&  (OjbD != null && OjbD.ISServerUp(ServerName));

答案 5 :(得分:2)

&&操作员会短路,所以你可以这样链接它们:

bool ISOKToDoSomthing()
{
    return
        ObjA.CheckVersion(string oldVersion) &&
        objB.CheckUserRight() &&
        ObjC.ISDBExist() &&
        OjbD.ISServerUp(ServerName) &&

    //tons of similar code as above
    ......... 

 }

答案 6 :(得分:2)

您可以利用C#进行短路评估的事实:

return
    ObjA.CheckVersion(oldVersion) &&
    objB.CheckUserRight() &&
    ObjC.ISDBExist() &&
    OjbD.ISServerUp(ServerName);

编辑修复CheckVersion参数的语法

答案 7 :(得分:2)

bool ISOKToDoSomthing()
{
    return ObjA.CheckVersion(string oldVersion) && 
           ObjB.CheckUserRight() &&
           ObjC.ISDBExist() && 
           OjbD.ISServerUp(ServerName);
}

答案 8 :(得分:1)

如何使用and

retVal = ObjA.CheckVersion(oldVersion) &&
         objB.CheckUserRight() &&
         ObjC.ISDBExist() &&
         OjbD.ISServerUp(ServerName);
return retval;

答案 9 :(得分:1)

为了使代码不那么冗长,你可以尝试一下while循环。鉴于此处的方法是,如果/ / /变为false,则不会更改原始值的值,那么它将是while(retval){}并迭代一系列操作。我个人认为这很难看。考虑使用一个开关,或者甚至(对此,但它会起作用)一个按位枚举。

从我的角度来看,当我看到自己编写这样的代码时,我在某个地方犯了一个严重的架构错误,我应该重新考虑打这个电话的原因。也许你应该再看看你的逻辑,而不仅仅是你的代码。坐下来画一些盒子,在设计阶段再做一些工作,你可能会发现自己构建的东西差别很大。

编辑:或者是,就像其他人一样,你可以使你的迭代成为一个if语句。同样,这是一个比一长串布尔值更大的问题。

答案 10 :(得分:0)

这取决于您想要改变多少。可能不是从子方法中返回bool,而是抛出异常。

bool retVal = true;

try
{
    ObjA.CheckVersion(oldVersion); 
    objB.CheckUserRight(); 
    ObjC.ISDBExist(); 
    OjbD.ISServerUp(ServerName); 
}
catch (SomeException ex)
{
    // Log ex here.
    retVal = false;
}

return retVal;

如果你做了这样的事情,IsDBExist可能不是最好的名字(因为通常翻译为"在我的脑海中回复一个bool")但是你得到的照片