如果有一些构造方法用于构造具有多个if的构造方法,我会更加干净。在解雇方法之前的大部分时间你必须检查输入参数和其他东西,例如。不是nullptr,是> 0,是!= -1等。有时你不能在一个中检查这个,结果你有这样的东西:
if(arg != nullptr)
{
if()
{
if()
{
if()
{
/*actual code here*/
}
else
{
}
}
else
{
}
}
else
{
/* other error message like "License check error: wrong key!" */
}
}
else
{
/* wrong input args! */
}
好的惯例是你的行少于80个字符,这为我们提供了更少的实际代码空间。代码变得越来越难以理解。
答案 0 :(得分:3)
您可以在问题出现时尽早返回,或者抛出异常:
if(arg == nullptr) {
log("arg was null, not doing anything");
return;
}
//if the user forgot to make the toast, we can do it for them
if(forgotToMakeToast) {
makeToast();
}
if(ranOverDog) {
//we can't continue if the user ran over our dog, throw an exception
throw too_angry_exception;
}
//actual code
通过将错误处理与地点错误检查联系起来,这使您的代码结构更加明显。
答案 1 :(得分:1)
我通常做的是这样的事情:
if(arg == nullptr)
{
/* wrong input args! */
return;
}
if()
{
/* other error message like "License check error: wrong key!" */
return;
}
...
/*actual code here*/
然后你将所有错误“ifs”和错误处理放在一个地方,最后的实际功能代码很好地分开。
答案 2 :(得分:0)
如果函数中的if
,while
,for
的子级别太多,则表明该函数应拆分为2个或更多单独的函数。根据具体的代码,它可能看起来像这样:
public void MyClass::Run(arg)
{
if(arg != nullptr)
{
if()
{
RunActualCode()
}
else
{
/* other error message like "License check error: wrong key!" */
}
}
else
{
/* wrong input args! */
}
}
private void MyClass::RunActualCode(...)
{
if()
{
if()
{
/*actual code here*/
}
else
{
}
}
else
{
}
}
有很多关于此的建议,例如:
Rec 4.7没有太复杂的功能。
每个人都不得不接管其他人编写的代码 知道复杂的代码很难维护。有很多方法 函数可能很复杂,例如代码行数, 参数的数量,或通过a的可能路径的数量 功能。通过函数的可能路径数,即 使用许多控制流原语的结果是主要的 为什么功能复杂的原因。所以你应该知道 大量使用控制流原语将使您的代码成为事实 更难维护。 http://www.tiobe.com/content/paperinfo/CodingStandards/hem/industrial/bookindex.htm
答案 3 :(得分:0)
您的原始构造可以这样写:
do
{
if(nullptr == arg) // Note: *negate* your original conditions!
{
/* wrong input args! */
break;
}
if(...)
{
/* other error message like "License check error: wrong key!" */
break;
}
if(...)
{
...
break;
}
if(...)
{
...
break;
}
/*actual code here*/
} while (0);
优点:
if
s; break
代替goto
跳出整个区块; if(...){...; break;}
; 缺点:
do-while(0)
看起来有点奇怪; if(cond)
=> if(!cond)
,可能会影响代码清晰度;