Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用其他函数时减少if语句_C# - Fatal编程技术网

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

C# 调用其他函数时减少if语句,c#,C#,我有一个从不同对象调用很多其他函数的函数。在调用下一个函数之前,每个函数都必须返回true。正如你所看到的,我使用了太多的if语句。如何改进代码并使其更整洁?谢谢 bool ISOKToDoSomthing() { boo retVal = false; retVal = ObjA.CheckVersion(oldVersion); if(retVal) { retVal = objB.CheckUserRight(); }

我有一个从不同对象调用很多其他函数的函数。在调用下一个函数之前,每个函数都必须返回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;
 }
也许吧

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

附带说明,例如,您可以在一条语句中对objB调用方法之前测试objB是否为null(一旦条件未满足,代码将中断执行,即不会调用下一个条件),因此您不需要大量if(objB!=null)类型的语句。例如:

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

&&运算符将短路,因此您可以像这样链接它们:

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

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

 }

使用
如何:

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

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

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

编辑以修复CheckVersion参数的语法

要使代码不那么冗长,可以尝试while循环。假设这里的方法是在/ever/变为false时永远不会更改原始值的值,那么它将是while(retval){}并在操作列表上迭代。我个人认为这很难看。考虑使用一个开关,或者甚至(Youk对此,但它将工作)逐位枚举。< /P>
bool ISOKToDoSomthing()
{
    return ObjA.CheckVersion(string oldVersion) && 
           ObjB.CheckUserRight() &&
           ObjC.ISDBExist() && 
           OjbD.ISServerUp(ServerName);
}
从我的角度来看,当我看到自己编写这样的代码时,我在某个地方犯了一个严重的架构错误,我真的应该重新思考这个调用背后的原因。也许你应该重新审视一下你的逻辑,而不仅仅是你的代码。坐下来,画一些盒子,在设计阶段多做一些工作,你可能会发现自己构建的东西非常不同

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

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;
&&
的短路在一些情况下是有用的,但是如果你有“吨”的短路,我认为这太多了,无法坚持在一个语句中

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


说实话,有这么多的对象需要检查,这一事实暗示了一个设计问题——也就是说,你试图一次做太多的事情,或者你有一个“上帝对象”,在系统的各个方面都有它的小触角。你可能想看看如何解决这个问题。

这取决于你想改变多少。也许可以抛出异常,而不是从子方法返回
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”),但您明白了。我的建议是:如果没有明确的业务案例来进行更改,请不要对该代码进行任何操作

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

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


这实际上为用户增加了价值;用户一点也不在乎你是否使用嵌套的“if”语句。

以前有人问过这个问题的许多变体。我猜你只是复制/粘贴,但更正
CheckVersion
可能是个好主意。没错,我只是减少了if块,而没有太多注意函数的作用。:)你是绝对正确的,而且修正了。括号确实有助于划分条件,虽然看起来更可读,但我以前的版本有点过时了!谢谢非常好的建议。但这是一个旧的系统,我个人只拥有代码的一小部分,我会在Eric的建议和cHao的建议之间做出妥协。我更喜欢赵的解决方案,因为它同样可读,但比现有代码短。我喜欢一次能在屏幕上看到更多的功能。但是,我建议在下次需要更改
ISOKToDoSomthing
之前不要进行此更改。保存重构,以便在您积极处理相关代码时使用;无人处理的工作代码不需要重构。
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;
bool retVal = true;

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

return retVal;