哪种更好的做法? (如果有所不同,我在.Net中编码)
IF condition = true THEN
...true action--even if rare...
ELSE
...action
END IF
或
IF condition = [most common condition] THEN
...most common action....
ELSE
...least common action
END IF
答案 0 :(得分:32)
代码完成的作者Steve McConnell表示,你应该
“把你通常期望的案子 过程先。这符合 放置代码的一般原则 这是因为决定很接近 尽可能决定... [推杆 if ]之后的正常情况 专注于阅读主要流程 而不是趟过特殊的 案例,所以代码更容易阅读 整体“。
Code Complete,第2版,第356-357页。
答案 1 :(得分:8)
针对您的特定情况使用最易读的版本,顺便说一下,不要将布尔表达式与true和false进行比较。在C#中使用condition
和Not condition
(!condition
。)
if (condition == true) // bad
if (condition) // better
答案 2 :(得分:3)
首先,你不应该与布尔值进行比较,这就是做
if condition then
而不是
if condition = true then
关于你的问题,它取决于自然变量名称,IMO。
例如,如果您要创建一个需要检查它是否已连接的客户端(最常见的情况)
if connected then
//Proceed
else
//Throw error
end if
或者,如果您要创建一个不同的程序,您有一个变量,比如说,检索过,并且您想知道是否已检索到该内容
if not retrieved then
//Error
end if
不要做
if retrieved then
else
//Error
end if
答案 3 :(得分:3)
在最终的装配/机器代码中,它确实有所作为。 最有可能执行的语句是在没有分支的路径中完成的。这样,管道就不会被破坏,导致宝贵的周期丢失。
我不知道编译器是否保留了if then语句顺序,这样就迫使程序集采用这种优化路径。
我已经读过Visual Studio 2008(当它被宣布时)将具有优化功能,其中编译器在分支处添加测量值,然后在运行时期间测量certian路径的采用频率。然后在随后的重新编译中,首选最佳代码路径。
我不知道这个功能是否超越了“设计/学术阶段”
答案 4 :(得分:2)
一般来说,我总是把真正的条款放在第一位。对我来说,像这样的东西,混淆了意思:
If not something Then
'do something 1
Else
'do something 2
End If
这导致双阴性,更好地写这样:
If something Then
'do something 2
Else
'do something 1
End If
我相信这个建议来自代码完整。一本值得阅读的好书
如果您要拥有多个其他人,那么考虑一个案例陈述可能会更好。
答案 5 :(得分:2)
你已经收到了一些很好的答案。我将从另一个角度来处理这个问题。
首先,就性能而言,它可能与您在现代CPU中的想法无关。这是因为他们使用一种称为分支预测的功能,其中CPU试图预测代码将采用的最可能的方向。当然,我仍然同意,如果性能是您主要考虑的问题,您应该将最有可能的分支放在最顶层。
其次,我更喜欢可读性而不是琐碎的性能增强。在大多数情况下,可读性的好处超过了性能。
第三,尽可能使用guard clauses。它使代码更具可读性。
答案 6 :(得分:1)
使用哪个代码更容易阅读。这通常是您的第二个选择。
修改
在很多情况下,这取决于您要实现的目标,例如,如果您想检查连接是否正确启动:
Connect()
if connected then
SendString("Hello!")
else
FlagConnectionFailed()
endif
然而,如果你想捕捉错误:
' Just about to send something
if not connected then
FlagConnectionLost()
return
endif
SendString("Still connected!")
但你甚至可能想:
Disconnect()
if not connected then
return "Complete"
else
FlagConnectionDisconnectFailure()
endif
(我不是VB程序员,所以上面的语法很大程度上构成了!)
答案 7 :(得分:1)
正如其他人所说,可读性通常更为重要。但是,可读性对不同的人来说意味着不同的东西。
对我来说,它通常意味着安排if语句,以便更短的动作(就代码行而言)首先出现,这样如果语句靠近窗口的底部我'更有可能在屏幕上看到“Else”。
对于其他人来说,在条件中放置“Not”可以真正抛出它们,因此他们更愿意列出它,以便If条件总是尽可能正。
答案 8 :(得分:1)
更好的做法是第二种选择 - 最常见 行动第一。
它可以让您更轻松地阅读代码 被较少使用/例外情况的代码分散注意力。
答案 9 :(得分:1)
如果最常见的案例不是最简单的表达,您可能有机会重新分解
我发现了一个有用的重新分解:
if (a.getFoo() == 1 && a.getBar() == 2)
可以重新计算到
if (a.isFooBar())
在这种情况下会出现像这样令人讨厌的事情,
if (!(fooSet.contains(a.getValidFoo())))
可能是
if (a.hasInvalidFoo(fooSet))
这可以通过简化对最常见条件的评估,使选项1也成为选项2。