IF / ELSE声明订单的最佳实践

时间:2009-08-20 13:23:41

标签: .net vb.net if-statement

哪种更好的做法? (如果有所不同,我在.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

10 个答案:

答案 0 :(得分:32)

代码完成的作者Steve McConnell表示,你应该

  

“把你通常期望的案子   过程先。这符合   放置代码的一般原则   这是因为决定很接近   尽可能决定... [推杆   if ]之后的正常情况   专注于阅读主要流程   而不是趟过特殊的   案例,所以代码更容易阅读   整体“。

Code Complete,第2版,第356-357页。

答案 1 :(得分:8)

针对您的特定情况使用最易读的版本,顺便说一下,不要将布尔表达式与true和false进行比较。在C#中使用conditionNot 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

我相信这个建议来自代码完整。一本值得阅读的好书

http://www.cc2e.com/

如果您要拥有多个其他人,那么考虑一个案例陈述可能会更好。

答案 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。