Coding style 在IF块中放什么,在ELSE块中放什么?
这是一个次要的风格问题,但添加到代码中的每一点可读性都很重要 所以如果你有:Coding style 在IF块中放什么,在ELSE块中放什么?,coding-style,function-exit,Coding Style,Function Exit,这是一个次要的风格问题,但添加到代码中的每一点可读性都很重要 所以如果你有: if (condition) then { // do stuff } else { // do other stuff } 你如何决定是这样更好,还是这样更好: if (!condition) then { // do other stuff { else { // do stuff } 我的启发是: 保持条件为正(小于 阅读时的心理计算) 将最
if (condition) then
{
// do stuff
}
else
{
// do other stuff
}
你如何决定是这样更好,还是这样更好:
if (!condition) then
{
// do other stuff
{
else
{
// do stuff
}
我的启发是:
我喜欢第一个。条件应该尽可能简单,并且应该相当明显,哪种情况下更简单,哪种情况下更简单!条件我更喜欢将最常见的路径放在第一位,并且我非常相信减少嵌套,因此我将尽可能中断、继续或返回,而不是埃尔辛。我通常更喜欢针对正面条件进行测试,或者将负面条件反转为正面条件
if (condition)
return;
DoSomething();
我发现,通过大幅度减少else的使用,我的代码更具可读性和可维护性,当我不得不使用else时,它几乎总是一个更结构化的switch语句的最佳候选者。这取决于您的流程。对于许多函数,我将使用前提条件:
bool MyFunc(variable) {
if (variable != something_i_want)
return false;
// a large block of code
// ...
return true;
}
如果我在每种情况下都需要做一些事情,我将使用
If(positive_子句){}else{}
格式。对我来说,这取决于条件,例如:
if (!PreserveData.Checked)
{ resetfields();}
if (!some_function_that_could_fail())
{
// Error handling code
}
else
{
// Success code
}
我倾向于用我想要的逻辑与自己交谈,并将其编码到我头脑中的小声音中。如果代码是为了检查错误情况,我宁愿将代码放在第一位,“成功”代码放在第二位;从概念上讲,这使函数调用及其错误检查代码保持在一起,这对我来说很有意义,因为它们是相关的。例如:
if (!PreserveData.Checked)
{ resetfields();}
if (!some_function_that_could_fail())
{
// Error handling code
}
else
{
// Success code
}
我同意奥利在可能的情况下使用积极的if子句 请不要这样做:
if (somePositiveCondition)
else {
//stuff
}
我曾经在我工作过的一个地方看到过很多这样的情况,我常常想知道是否有一个编码员不知道如何不工作…一般来说,如果一个明显大于另一个,我会将较大的一个设为
if
块
!full==空)
我知道这不是你想要的,但是。。。许多开发人员使用一个“guard子句”,即一个否定的“if”语句,该语句会尽快脱离方法。在这一点上,没有真正的“其他” 例如:
if (blah == false)
{
return; // perhaps with a message
}
// do rest of code here...
有一些核心的c/c++/汇编人员会告诉你,你正在破坏你的CPU!!!(在许多情况下,处理器倾向于使用“true”语句,并尝试“预取”下一步要做的事情……因此理论上任何“false”条件都会刷新管道,并且速度会慢几微秒)
在我看来,我们正处于“更好”(更容易理解)的代码胜于几微秒的CPU时间的时刻。我认为对于单个变量,not运算符足够简单,命名问题开始变得更加相关 永远不要给变量命名,如果需要的话,使用同义词表并找到相反的名称。我见过很多像这样糟糕的代码
if (not_dead) {
} else {
}
而不是显而易见的
if (alive) {
} else {
}
然后您可以合理地使用(非常可读,无需反转代码块)
如果我们讨论更多的变量,我认为最好的规则是简化条件。一段时间后,项目往往会遇到以下情况:
if (dead || (!dead && sleeping)) {
} else {
}
也就是说
if (dead || sleeping) {
} else {
}
始终注意条件是什么,以及如何简化它们 如果您必须有多个退出点,请将它们放在第一位,并说明清楚:
if TerminatingCondition1 then
Exit
if TerminatingCondition2 then
Exit
现在我们可以继续做一些平常的事情:
if NormalThing then
DoNormalThing
else
DoAbnormalThing
两个(相互矛盾的)教科书引用:
放置if/else的最短子句
最上面
--艾伦·霍卢布,“足够的绳子射中你自己的脚”,第52页
将正常情况置于if之后,而不是else之后
--Steve McConnell,“代码完成,第二版”,第356页,软件是知识捕获。你在编码某人关于如何做某事的知识 软件应该符合问题的“自然”要求。当有疑问时,问问其他人,看看人们到底说了什么,做了什么 “常见”情况是什么都不做?然后呢
if( common ) {
// pass
}
else {
// great big block of exception-handling folderol
}
还是你这么做
if( ! common ) {
// great big block of except-handling folderol
}
“总是积极的”规则并不是你首先想要的。您希望看到更像下面这样的规则
如果两条路径中的一条非常短(1到10行左右),而另一条则长得多,那么我将遵循,并将较短的代码段放入If中。这使得在查看代码时更容易在一个屏幕上看到if/else流
如果这是不可能的,那么我将构建尽可能简单的条件。当我查看数据验证时,我尝试将我的条件设置为“白名单”——也就是说,我测试我将接受的条件:
if DataIsGood() then
DoMyNormalStuff
else
TakeEvasiveAction
而不是相反,它往往退化为:
if SomeErrorTest then
TakeSomeEvasiveAction
else if SomeOtherErrorCondition then
CorrectMoreStupidUserProblems
else if YetAnotherErrorThatNoOneThoughtOf then
DoMoreErrorHandling
else
DoMyNormalStuff
通常可以使条件为正,而无需切换if/else块 改变
if (!widget.enabled()) {
// more common
} else {
// less common
}
到
英特尔奔腾分支预测预取“如果”情况的指令。如果它改为跟随“else”分支:它将刷新指令管道,从而导致暂停 如果你非常关心绩效:将最可能的结果放在“如果”子句中 就我个人而言,我是这样写的
if (expected)
{
//expected path
}
else
{
//fallback other odd case
}
我总是把最有可能的放在第一位 在Perl中,我有一个额外的控制结构来帮助实现这一点。if的倒数
unless (alive) {
go_to_heaven;
} else {
say "MEDIC";
}
如果你有正确和错误的条件,那么我会选择一个积极的条件-这减少了混乱,一般来说,我相信会使你的代码更容易阅读 另一方面,如果你使用的是一种语言
unless ($foo) {
$bar;
}
if(condition)
{
doSomething();
}
else
{
System.out.println("condition not true")
}
if(!condition)
{
doSomething();
}
else
{
System.out.println("condition true");
}