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