人們都討厭“面條代碼”(spaghetti code),因為它就像面條一樣繞來繞去,沒法理清頭緒。那么優雅的代碼一般是什么形狀的呢?經過多年的觀察,我發現優雅的代碼,在形狀上有一些明顯的特征。
如果我們忽略具體的內容,從大體結構上來看,優雅的代碼看起來就像是一些整整齊齊,套在一起的盒子。如果跟整理房間做一個類比,就很容易理解。如果你把所有物品都丟在一個很大的抽屜里,那么它們就會全都混在一起。你就很難整理,很難迅速的找到需要的東西。但是如果你在抽屜里再放幾個小盒子,把物品分門別類放進去,那么它們就不會到處亂跑,你就可以比較容易的找到和管理它們。
優雅的代碼的另一個特征是,它的邏輯大體上看起來,是枝丫分明的樹狀結構(tree)。這是因為程序所做的幾乎一切事情,都是信息的傳遞和分支。你可以把代碼看成是一個電路,電流經過導線,分流或者匯合。如果你是這樣思考的,你的代碼里就會比較少出現只有一個分支的if語句,它看起來就會像這個樣子:
~~~
if (...) {
if (...) {
...
} else {
...
}
} else if (...) {
...
} else {
...
}
~~~
注意到了嗎?在我的代碼里面,if語句幾乎總是有兩個分支。它們有可能嵌套,有多層的縮進,而且else分支里面有可能出現少量重復的代碼。然而這樣的結構,邏輯卻非常嚴密和清晰。在后面我會告訴你為什么if語句最好有兩個分支。