在條件判斷中的規範,較常聽見的便是盡量避免否定條件,因為肯定句式會比否定句式更容易理解且直觀。也就是說:
if(employees.isEmpty())
會比下述程式更容易理解,也更好:
if(!employees.isEmpty())
而在提高程式的可讀性上,除了盡量使用肯定的條件判斷,必要時將條件判斷的意圖以函式抽取出來,也是很好的一種方式。因為若未查看上下文,單看判斷條件的內容,通常不容易理解其布林邏輯。
例如:
if(shouldBeDeleted(timer))
會優於:
if(timer.hasExpired() && !timer.isRecurrent())
關於何謂時序耦合作者並未特別說明,但看完內文後我的理解是:當我們將一個大函式內部依照其抽象概念劃分,分割成許多小函式時,它們通常時候會有其必要的執行順序,而這樣的情形,便稱為時序耦合。而不隱藏時序耦合,有助於呼叫的次序變得清晰,避免多人協作時因其他人不清楚其中邏輯,而導致使用了錯誤的次序。
public class MoogDiver {
Gradient gradient;
List<Spline> splines;
public void dive(String reason) {
saturateGradient();
reticulateSplines();
diveForMoog(reason);
}
...
}
在這個函示中,先填滿漸層(saturate the gradient),再讓線條成網狀(reticulate the splines),最後才能使 moog 潛入水中(dive for the moog),這個先後次序並不能隨意錯置。然而在上述的呼叫中並未表達出此種次序,而可能導致他人使用上的錯誤。
所以作者認為這樣是更好的安排:
public class MoogDiver {
Gradient gradient;
List<Spline> splines;
public void dive(String reason) {
Gradient gradient= saturateGradient();
List<Spline> splines = reticulateSplines(gradient);
diveForMoog(splines, reason);
}
...
}
如此一來,因為所傳入的參數都需先來自於上一個的運算結果,而曝露出時序的耦合性,並且解決次序錯置的問題。但在這個例子中我們可以注意到一個情形:由於作者將原本的方法都增加了一個參數,降低了函式本身的可閱讀性。我猜測是因為相較於次序錯置導致程式運行時拋出錯誤,稍微降低可閱讀性是比較可行的做法,也就是程式「可正確運行」這件事,優先級是高於「可閱讀性」的。