我有一个函数从不同的对象调用许多其他函数.在调用下一个函数之前,每个函数都必须返回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;
}
Run Code Online (Sandbox Code Playgroud)
return
ObjA.CheckVersion(oldVersion) &&
objB.CheckUserRight() &&
ObjC.ISDBExist() &&
OjbD.ISServerUp(ServerName);
Run Code Online (Sandbox Code Playgroud)
我的建议:如果没有明确的商业案例进行更改,请不要对此代码执行任何操作.
您的代码清晰,明显,可能正确,易于维护且易于调试.为什么你想要以任何方式改变它?花时间通过修复错误和添加功能来增加价值,而不是通过不必要地更改工作代码.当你的老板问你"你今天做了什么?" 答案不应该是"我通过对正确的,有效的,已经调试过的代码进行不必要的修饰来增加我们的进度风险".
现在,如果这里确实存在问题,问题可能不是代码难以阅读,而是代码严格地编码应该是用户可配置的业务流程.在这种情况下,创建一个名为"Workflow"的对象,该对象编码业务流程,以及一个评估任意工作流的引擎.然后根据用户的输入构造该对象的实例,该实例表示所需的工作流.
这实际上为用户增加了价值; 用户不关心是否使用嵌套的"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;
Run Code Online (Sandbox Code Playgroud)
短路&&对于一些条件是有用的,但是如果你有"吨"的话,IMO太过于试图坚持一个声明.
但是,两者的结合可能是有用的.更有用的是将这些检查中的一些压缩成更大的块(但小于IsOKToDoSomething).例如,检查您是否有权访问数据库(是否存在,是否可以登录,等等)
说实话,事实上你有很多物品要检查设计问题的提示 - 也就是说,你试图一次做太多,或者你的某个地方有一个"神物"系统方面.你可能想看看修复它.
小智 5
return ObjA.CheckVersion(oldVersion) && objB.CheckUserRight() && ObjC.ISDBExist() && OjbD.ISServerUp(ServerName)
Run Code Online (Sandbox Code Playgroud)