過度使用時,邏輯的美將索然無味。
Edward John Moreton Drax Plunkett
接下來這幾天,我們將看看另一個充斥雷區的主題:控制流程(control flows)。控制流程在是解釋器如何從上至下運行你的程式代碼。
有一些陳述句statements和操作符operators可以改變控制流程。它們是所有編程語言中常見的:loop
、if-else
、switch
、function calls
、ternary
等等。
在這兩天,我們先來看看Guard Clauses。
我們先來看看,維基百科的解釋:
在電腦程式設計中,衛(guard)是布爾表達式,其結果必須為真,程序才能執行下去。衛語句(guard code或guard clause)用於檢查先決條件。
我們來看一個例子getValidBoy
:給一群人的資訊,與特定名字,判斷其是否為男生。是的話返回該人資料,否則是undefined。
// 比較會被主管討厭的寫法
function getValidBoy(name, people) {
if (name) {
const person = people.find(
(person) => person.name === name
);
if (person) {
const isMale = person.sex === "male";
if (isMale) {
return person;
}
}
}
}
顯而易見的,雖然上述邏輯合理,但有多個嵌套if條件句(有三個!),造成閱讀代碼的心力成本大幅提高。我們可以使用guard clauses來解決上述問題。
// 比較不會被主管討厭的寫法
function getValidBoy(name, people) {
if (!name) {
return;
}
const person = people.find(
(person) => person.name === name
);
if (!person) {
return;
}
const isMale = person.sex === "male";
if (!isMale) {
return;
}
return person;
}
在這裡,我們攤平了所有嵌套的條件句。我們可以發現每次檢查東西是否有問題時,我們就設立斷點或是衛。
它們阻止函數繼續執行,也就是在衛語句條件沒有滿足的情況下提前返回。