2010-04-29 41 views
1

您有一系列要執行的功能。案例A:他們不相互依賴。哪個更好?這些更好的練習是哪一種?

function main() { 
    a(); 
    b(); 
    c(); 
} 

function main() { 
    a(); 
} 

function a() { 
    ... 
    b(); 
} 

function b() { 
    ... 
    c(); 
} 

案例B:他們不依賴於以前的成功完成。

function main() { 
    if (a()) 
    if (b()) 
     c(); 
} 

function main() { 
    if (!a()) return false; 
    if (!b()) return false; 
    c(); 
} 

function main() { 
    a(); 
} 

function a() { 
    ... // maybe return false 
    b(); 
} 

function b() { 
    ... // maybe return false 
    c(); 
} 

好,當然,意味着更多的維護和更易於理解。

+0

我不認爲有可能獲得任何超過一堆意見作爲答案。 – danben 2010-04-29 14:35:30

+0

我希望有合理的意見,以便我可以爲自己做出決定。現在我不一致。 – 2010-04-29 14:40:20

回答

14

案例A:1.
推理:由於沒有一個函數相互依賴,因此在main函數中按順序調用它們會顯示一系列邏輯事件。在每個函數結束時,他們稱之爲下一個代碼的替代方案看起來像意大利麪條代碼,並且很難讓有人閱讀您的程序。案例B:以上都不是。

function main() { 
    return a() && b() && c(); 
} 

推理:看來你真的不關心的返回值,你只是想打出來,如果早期的功能之一返回一定的價值。您可以返回所有這些函數的「結果」結果,並且如果其中任何一個返回false,代碼將提前結束。所以,如果a返回false,那麼b不會被執行。將它們全部放在一行上很容易閱讀,簡潔地表明它們彼此依賴。

+1

+1優雅 – 2010-04-29 14:39:06

0

方案A:第一個選項

案例B:第二個選項

2

方案A:第一個選項

如果你使用第二個選項,你使它更難以再使用,因爲你自動拉b和c。案例二:取決於 - 做一個,B和C自然返回布爾值,或其他值來檢查?我仍然不會打電話給b和b打電話給c,因爲那時你引入了一個不必要的依賴關係。如果返回值是有意義的,我傾向於選項2 - 減少嵌套是一件好事。

1

首先,最好的答案將取決於上下文中的代碼是在多個方面 - 有沒有人權利除'它取決於'的答案。

然而,考慮在面值,情況A:

選項1示出了算法的頂層視圖。

選項2隱藏此項,隱藏對B & C的調用。發現C被稱爲可能是相當多的工作。另外,如果他們接着調用更多的方法,則很難單獨測試A & B.如果A,B和C可以被嘲弄,主要總是可以被測試。

案例B: 在一個方法中,通常有1個出口點與多個出口點有關的參數。有時候多個退出點可以使代碼變得更簡單,這使得代碼更易於維護,有時候不明顯返回會產生什麼影響,或者返回會發生,這使得它不易維護。

選項1明確顯示算法,但多個嵌套if可以快速失控。 在這種情況下,我肯定會有選項2或一些聰明的布爾型(是的,corey)。

選項3看起來對我來說簡直是愚蠢的。

相關問題