使用提前返回or不使用提前返回,你的選擇是什麼?

全文共1634字,預計學習時長

5分鐘

使用提前返回or不使用提前返回,你的選擇是什麼?


使用提前返回(early returns)還是不使用提前返回,這是個問題,兩者都有其緣由。


關於使用提前返回,程序員往往有很強的個人偏好。有些人從不使用,另一些人卻對此執念很深。但除了個人編程風格外,還有別的其他原因嗎?


本文中,小芯將和大家一起討論可以在代碼中使用提前返回的原因,以及為什麼一些程序員不選擇使用提前返回。


在開始深入探討提前返回這個話題之前,我們首先要了解一下“提前返回到底是什麼?”


使用提前返回or不使用提前返回,你的選擇是什麼?


提前返回是指編寫的函數能在結尾處返回預期結果。


在函數中,其餘代碼應儘快觸發終端,防止偏離函數目的。


提前返回的運行正如其名所述。下面就是提前返回的運行模式:


<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網站上讀到過一篇很好的評論文章,幾乎涵蓋了大部分反對使用提前返回的原因:


“一般來說,人們希望函數中能有儘可能少的返回點。實際原因是為了簡化代碼讀取,因為可以始終假設每個函數都能夠接收參數,執行邏輯,並返回結果。


而增加返回次數往往會使邏輯複雜化,增加讀取和充分理解代碼所需的時間。


一旦代碼達到了維護階段,新手程序員試圖推理邏輯時,多次返回就會大大影響他們的效率(當註釋比較分散,代碼模糊不清時尤其糟糕)。


函數的長度越長,問題也就越嚴重。


該評論來自於馬克·凱格爾。儘管發佈於十多年前,但筆者認為,如果決定不使用提前返回,該評論仍有意義。


在某些情況下,使用提前返回就比較誇張。來看看下面的例子:


  1. function setAge(age) {
  2. if (!age) {
  3. return;
  4. }

  5. this.age = age;
  6. }

此處使用提前返回似乎不太對,對代碼來說可能弊大於利,因為本可以更簡潔:


<code>function setAge(age) {/<code>
<code>if (age) {/<code>
<code>this.age = age;/<code>
<code>}/<code>
<code>}/<code>


使用提前返回or不使用提前返回,你的選擇是什麼?


提前返回,你選擇用還是不用?你是那種喜歡使用提前返回的程序員嗎,因為這樣代碼可以平穩運行?還是在函數里最多隻返回一次結果?


現在,輪到你了!快分享一下你對提前返回的看法吧~

使用提前返回or不使用提前返回,你的選擇是什麼?

使用提前返回or不使用提前返回,你的選擇是什麼?

我們一起分享AI學習與發展的乾貨


分享到:


相關文章: