全文共1634字,預計學習時長
5分鐘使用提前返回(early returns)還是不使用提前返回,這是個問題,兩者都有其緣由。
關於使用提前返回,程序員往往有很強的個人偏好。有些人從不使用,另一些人卻對此執念很深。但除了個人編程風格外,還有別的其他原因嗎?
本文中,小芯將和大家一起討論可以在代碼中使用提前返回的原因,以及為什麼一些程序員不選擇使用提前返回。
在開始深入探討提前返回這個話題之前,我們首先要了解一下“提前返回到底是什麼?”
提前返回是指編寫的函數能在結尾處返回預期結果。
在函數中,其餘代碼應儘快觸發終端,防止偏離函數目的。
提前返回的運行正如其名所述。下面就是提前返回的運行模式:
<code>functionsomeFunction(someCondition) {/<code>
<code>if (!someCondition) {/<code>
<code>return;/<code>
<code>} // Do something/<code>
<code>}/<code>
但和往常一樣,在編程中,一個問題總有多種解決方法。這兩種解決方案都很好,沒有優劣之分。
提前返回的另一種替代方法可能是這樣的:
<code>function someFunction(someCondition){/<code>
<code>if (someCondition) {/<code>
<code>// Do something/<code>
<code>}/<code>
<code>}/<code>
那麼,為什麼要考慮使用提前返回?
考慮使用提前返回的原因之一,就是能讓代碼的視覺效果更加流暢。如果選擇其他替代方法,使用if語句,就需要額外縮進,而使用提前返回則並不需要,代碼的可讀性也更強。
使用提前返回的另一個原因,是它可以讓diffs命令更加簡潔,尤其是所做更改會改變縮進的話,更是如此。如果不採用提前返回方法,即使可能只有幾行代碼,diff命令也會非常繁瑣。
最後一個原因,提前返回是程序員的定心丸。通過使用提前返回,可以先排除無效情況(保鏢模式),再空出一行,便可專注於函數的“真正”主體。
此外,如果不使用提前返回,那就只有一個出口點,意味著人們必須一直在腦海中搜索全部代碼,直到函數運行結束。
那麼,為什麼不使用呢?
另一方面,關於為什麼不該使用提前返回,也有一些原因。筆者在StackOverflow網站上讀到過一篇很好的評論文章,幾乎涵蓋了大部分反對使用提前返回的原因:
“一般來說,人們希望函數中能有儘可能少的返回點。實際原因是為了簡化代碼讀取,因為可以始終假設每個函數都能夠接收參數,執行邏輯,並返回結果。
而增加返回次數往往會使邏輯複雜化,增加讀取和充分理解代碼所需的時間。
一旦代碼達到了維護階段,新手程序員試圖推理邏輯時,多次返回就會大大影響他們的效率(當註釋比較分散,代碼模糊不清時尤其糟糕)。
函數的長度越長,問題也就越嚴重。
該評論來自於馬克·凱格爾。儘管發佈於十多年前,但筆者認為,如果決定不使用提前返回,該評論仍有意義。
在某些情況下,使用提前返回就比較誇張。來看看下面的例子:
- function setAge(age) {
- if (!age) {
- return;
- }
- this.age = age;
- }
此處使用提前返回似乎不太對,對代碼來說可能弊大於利,因為本可以更簡潔:
<code>function setAge(age) {/<code>
<code>if (age) {/<code>
<code>this.age = age;/<code>
<code>}/<code>
<code>}/<code>
提前返回,你選擇用還是不用?你是那種喜歡使用提前返回的程序員嗎,因為這樣代碼可以平穩運行?還是在函數里最多隻返回一次結果?
現在,輪到你了!快分享一下你對提前返回的看法吧~
我們一起分享AI學習與發展的乾貨
閱讀更多 讀芯術 的文章