2011-08-31 38 views
0

假設我有一個很長的方法鏈接縮進方法鏈接

object.SetA(123).SetB(234).SetC(345) ... 

什麼是最好的缺口?所有的編譯器都支持它們?

object. 
    SetA(123). 
    SetB(234). 
    SetC(345) ... 

object 
    .SetA(123) 
    .SetB(234) 
    .SetC(345) ... 

回答

2

假設我們正在對同一對象(每個功能retuns *this)談論方法鏈,怎麼樣:

object.setA().setB().setC(); 
object.setD().setE().setF(); 

龍行不只是糟糕,因爲你的屏幕不夠寬,以包含它們。如果這就是它,只需購買更大的顯示器或縮小字體大小即可。它們是不好的,因爲人們一次編碼一行,如果你在一行中做了太多的事情,你就會破壞他們小小的基於碳的大腦。

如果一切都失敗,我個人倒縮進這樣理解:

object 
    .setA() 
    .setB() 
    ... 
; 

但我更喜歡:

object.setA(); 
object.setB(); 
... 

方法鏈更補習班到線的方式,所以如果我們再將線路拆分出來,我看不出優勢。有時我們被迫,因爲object實際上是一個臨時(函數調用的結果而不是命名變量)或其他東西,我們不能引用它。

你也許可以讓線路從右邊跑掉。這很煩人,不得不橫向滾動或者捲起線條,但是又一次令人討厭的是必須在一個聲明中這麼做,所以顯然有一些非常重要的原因。

+0

由於源代碼管理,長行也很糟糕 – tenfour

+0

@tenfour:好的一點,您不希望在'diff'中看到修改的行,並且無法找出更改的位置,因爲它太長了。雖然我剛剛添加了一些文字,爭辯說如果我們要分割成單獨的行,那麼我們可能會盡可能將它們拆分爲單獨的語句。 –

+0

是真實的,但爲什麼要使用方法鏈接有很多原因:在'if' /'while'函數參數中,或者返回值是一個新對象,而您的替代方法不起作用。同樣概念的另一個例子是使用運算符的長表達式(例如,使用iostream運算符編寫調試日誌消息)。即使如此,當結果相同時,爲什麼要使用引用來使每一行成爲一個單獨的語句?我不認爲開發者會對多行語句感到困惑。 – tenfour

8

IMO,所述第二一個更好。通過以。開頭,它明確表示它是鏈接調用的延續。

3

我會寫這個,如果鏈條過長,不能來上一行:

object.SetA(123) 
     .SetB(234) 
     .SetC(345) 
     .SetD(345) 
     .SetE(345) 
     .SetF(345); 

,否則我會去這樣的:

object.SetA(123).SetB(234).SetC(345).SetD(345).SetE(345).SetF(345); 
+1

像這樣的垂直排列代碼現在已經是絕大多數。 – tenfour

3

是的,所有的編譯器將支持他們。您所做的只是添加空白,編譯器在詞法分析過程中將其刪除。

這是一個個人喜好的問題,但我同意Mike Kwan提出的觀點。

0

C++不是空白敏感的,它們都可以在任何C++編譯器上工作(好吧......假設它們在詞法分析器中沒有錯誤)。無論如何,我更喜歡最後一個,終止分號放在它自己的行上(這使得添加更多的鏈更容易,簡單的行復制會做到這一點)。