解决方案
美国洛特显然已经看到了一些不好的代码在那里。我们不是呢?我不认为其他有害的,虽然我已经看到了它用来编写糟糕的代码。在这种情况下,所有周围的代码一直不好,以及,为什么怪别人差?
其他提示
没有它不是有害的,这是必要的。
有应该永远是一个包罗万象的声明。所有开关应该有一个默认值。所有在ML语言匹配模式应该有一个缺省值。
在争论,这是不可能的道理经过一系列的if语句是不争的事实是真的。该计算机是最大的有限状态机在那里,它是愚蠢的枚举在每种情况下每一个可能性。
如果你是真的害怕未知的错误去else语句被忽视,是不是真的那么难引发异常呢?
话说,否则被认为是有害的是一个有点像说,变量或类是有害的。哎呀,它甚至喜欢说的goto是有害的。当然,事情也可能被滥用。但在某些时候,你就必须相信程序员是成人和足够聪明,不。
什么它归结为是这样的:如果你愿意不使用的东西,因为在SO答案或通过Dijkstra算法博客文章,甚至是著名的论文叫你不要,你需要考虑,如果规划是正确的职业适合你。
我不会说这是有害的,但有些时候,else语句可以让你陷入困境。举例来说,如果你需要做基于输入值进行一些处理,并只有两个有效的输入值。只检查一个可能引入的错误。 例如:
The only valid inputs are 1 and 2:
if(input == 1)
{
//do processing
...
}
else
{
//do processing
...
}
在此情况下,使用人会允许除1以外的所有值时,只应为值1和2以进行处理。
在我看来,某些流行的语言结构的固有地坏的整个概念是完全错误的。即使goto
有它的地方。我已经沃尔特·布莱特和Linus Torvalds在使用它的人喜欢看到非常可读的,可维护的代码。这是更好的,只是教的程序员可读性数和使用常识,而不是武断地宣称某种构造“有害”。
如果你写的:
if foo:
# ...
elif bar:
# ...
# ...
,则读取器可以被在想:如果什么都不foo
也不bar
是真的?也许你知道,从你的代码的理解,它必须是要么foo
或bar
的情况。我宁愿看到:
if foo:
# ...
else:
# at this point, we know that bar is true.
# ...
# ...
或:
if foo:
# ...
else:
assert bar
# ...
# ...
这清楚你如何指望控制流动,而不需要读者有哪里foo
成竹在胸和bar
来自读者。
(在原来的情况下,你仍然可以写注释解释发生了什么,但我想我会再怀疑:“为什么不直接使用一个else:
条款”)
我认为这一点是不是说你不应该使用else:
;更确切地说,是的else:
子句可以让你写代码不清,你应该尝试去辨认时发生这种情况,并加少许评论助阵任何读者。
这大约是在编程语言中最真实的东西,真正做到: - )
金恰恰相反......在我看来,必须有一个else每一个如果。当然,你可以做愚蠢的事情,但如果你足够努力,你可以滥用任何结构。你知道说:“一个真正的程序员可以把每一种语言编写FORTRAN”。
我做很多的时间是什么else部分写的评论,说明为什么有什么工作要做。
<强>否则强>记录有关代码的假设时是最有用的。它确保您通过if语句两侧认为。
始终使用else子句每个if语句是即使在“代码大全”值得推荐的做法。
背后包括else
声明(try...else
的)在Python摆在首位的理由是只有抓住你真的想例外。通常,当你有一个try...except
块,还有一些代码,可能会引发异常,然后有更多的代码,如果前面的代码是成功的应该只运行。如果没有else
块,你必须把所有的代码在try
块:
try:
something_that_might_raise_error()
do_this_only_if_that_was_ok()
except ValueError:
# whatever
问题是,如果有什么do_this_only_if_that_was_ok()
提出了一个ValueError
?它将使except
声明被抓住,当你可能没有想它。这就是else
块的用途:
try:
something_that_might_raise_error()
except ValueError:
# whatever
else:
do_this_only_if_that_was_ok()
我想这是舆论在一定程度上的问题,但我个人认为这是一个伟大的想法,即使我用它很少。当我使用它,就觉得这是非常合适的(而且,我认为它有助于澄清码流位)
在我看来,对于任何语言,其中有一个默认的情况下或副作用的任何流量控制语句,该场景需要有考虑的同一水平。如果在或交换机或而逻辑仅是作为条件一样好,如果(x)的,而(x)或为(...)。因此该语句不是有害的,但在他们的状况,所述逻辑。
因此,作为开发商,我们有责任将代码与在-心目中的其他范围广。太多的开发者把它当作一个“如果不是上述”时,其实它也可以忽略所有的常识,因为它的唯一逻辑是前面的逻辑,这通常是不完全的否定。 (算法设计错误本身)
我不那么认为“别人”比任何危害更大的off-by-那些在for()循环或坏的内存管理。它的所有有关的算法。如果你的自动机在其范围和可能的分支完整,都是具体和理解则没有危险。危险的是人们没有意识到宽领域逻辑的影响表现背后的逻辑的滥用。 电脑是愚蠢的,他们做什么,他们是由他们的经营者告诉(理论上)
我不认为在尝试和捉是危险的,因为它可以否定处理,以代码的一个未知数。分支以上的提高强>可以包含一个错误,由在强调提高强>本身。这是可以是非显而易见的。它像转动一个顺序指令集成树状或错误处理图,其中每个分量是依赖于在父分支。奇。你要知道,我喜欢C。
有是设置在C家族语言遇到所谓的“悬空其他”的问题如下:
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
此无辜代码可以以两种方式来理解:
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
或
if (a==4)
if (b==2)
printf("here!");
else
printf("which one");
的问题是,所述“其他”是“悬空”,一个可以迷惑的其他所有者。当然编译器不会使这种混乱,但它是有效的凡人。
感谢Python中,我们不能在Python中晃来晃去别的问题,因为我们在写任何
if a==4:
if b==2:
print "here!"
else:
print "which one"
或
if a==4:
if b==2:
print "here!"
else:
print "which one"
这样人眼捕获它。而且,不,我不认为“别人”是有害的,它是“如果”。
有害在假定的是难以原因的例子中,它可以被明确地写入,但其他仍然是必要的。 例如。
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
else:
# Exactly what is true here?
# Can be hard to reason out what condition is true
可被写入
if a < 10:
# condition stated explicitly
elif a > 10 and b < 10:
# condition confusing but at least explicit
elif a > 10 and b >=10:
# else condition
else:
# Handle edge case with error?
我觉得相对于try...except...else
的一点是,它是一个容易犯的错误使用它的创建的不一致的状态,而不是修复它。这并不是说,应该不惜一切代价避免的,但它可以是适得其反。
考虑:
try:
file = open('somefile','r')
except IOError:
logger.error("File not found!")
else:
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'
这将是真正的好要说的是,上述块从试图访问不存在的文件,或者该用户没有权限的目录防止代码,并说一切都被封装,因为它是内一个try...except...else
块。但在现实中,在上述形式大量的代码真的应该是这样的:
try:
file = open('somefile','r')
except IOError:
logger.error("File not found!")
return False
# Some file operations
file.close()
# Some code that no longer explicitly references 'file'
您经常说,由于file
在范围上不再被引用,它的好去块编码之后愚弄自己,但在许多情况下,事情会拿出它仅仅是不行的。或者一个变量将在后面的是未在else
块创建的except
块内创建。
这是我会怎样区分if...else
的try...except...else
。在这两种情况下,必须使并行在大多数情况下(变量和状态在一个应在其他应设置设置),但在后者的块,程序员通常不这样做,可能是因为它是不可能的或不相关的。在这种情况下,往往会令很多更多意义返回给调用者,而不是试图保持周围你认为你将在最好的情况下工作。