2013-08-30 37 views
4

我只是讀了top 100 signs of spaghetti code和我碰到4號,這只是指出來了:試圖避免「意大利麪代碼」,爲什麼多個if-else不好?

if ($status == "awake"){ 
    $actitivity = "Writing spaghetti code"; 
} else if ($healthstatus == "OK"){ 
    $activity = "Sleep"; 
} else { 
    print "CALL 911 IMMEDIATELY!"; 
} 

我已經看到了這個多的if-else圖案other spaghetti discussions。我有點困惑這是爲什麼,即使它適用於這個例子。

是對上面的例子中不好的,因爲

  • 所述第一變量是actitivity指示譯碼器需要一些睡眠,所以這是一個笑話,或

  • 視圖不應邏輯期間被輸出或

  • 講講太多的if/else


編輯沒關係第二部分,這是因爲嵌套的條件和多重回報

other spaghetti discussions鏈接的壞,是不好的,因爲

- 邏輯在它return ,打破流動,或

- 有太多if/else堆在上面彼此的...?

+0

最終,它的大部分內容都可以在[Cyclomatic Complexity](http://cl.wikipedia.org/wiki/Cyclomatic_complexity)的旗幟下歸結爲正式的計算機科學。 – Spudley

+0

啊,謝謝你的鏈接!這是每個人都想描述的模式。更多節點或更改 - >更復雜 - >更難以閱讀 - >意大利麪條。 – Ben

+0

是的,就是這樣。但這不僅難以閱讀,而且很難預測。每增加一個節點,代碼塊的維護和測試就會變得越來越困難。 – Spudley

回答

3

If/else陳述經常中斷Open-closed principle。 (Java示例,但在PHP中也有效)

解決方案=>傾向於多態。

此外,多次分配一個臨時變量實際上很容易出錯並降低了可讀性。特別是在PHP中,因爲它不是靜態類型的語言。 事實上,如果有人首先分配$actitivity = "Writing spaghetti code";然後$actitivity = 1;? ...在同一個容器內混合蘋果和橘子..看看這個:http://sourcemaking.com/refactoring/split-temporary-variable

此外,只有當條件之一被驗證時,該邏輯才允許副作用(print)=>方法不具有內聚性,因此SRP受到侵犯。

+0

對於像我這樣的人來說:'SRP指出每個對象都應該有一個責任,並且這個責任應該完全被這個類封裝。 – Ben

+0

SRP也適用於方法..不僅是整個對象本身。你如何命名一個方法來打印一個案例,並在其他案例中做其他事情:'printPerhaps'? ..往往會讓你的方法具有很高的凝聚力,這是獲得一個乾淨的代碼的最好方法之一。在這種情況下,拆分方法。 – Mik378

+1

欲瞭解更多信息,看看這個:http://codebork.com/2011/02/02/revisiting-solid-principles-srp-methods.html。在第二張圖片中出現了一個錯誤(因爲與第一張圖片相同),但在關聯的github中,有好的示例:) – Mik378