程式碼整潔之道-函數

  • 2019 年 10 月 6 日
  • 筆記

什麼是一個好的函數或者叫方法,只要能讓函數明確的表達其意圖,讓讀者能夠一眼看出是一個怎樣的函數,其接收什麼參數,返回什麼結果,做了什麼事情。能做到這,大概就能算作一個好的函數了,看上去很簡單。那麼問題來了,如果做到這點呢?

1. 短小

想像一下,一個擊敗航的複雜函數和一個只有十幾行的函數,哪一個能夠讓人一眼看出其意圖並理解其行為呢?顯然是後者。當然,現在大多數語言完全可以將幾百行程式碼寫到一行,那樣毫無格式的程式碼只會讓人難以理解。

2.程式碼塊和縮進

對於if、else等語句來說,其中包含的程式碼塊最好只有一行,而這一行應該是一個函數調用語句,讓讀者可以一看看出其意圖

3.函數名

一個好的函數名十分重要,如何定義一個好的函數名呢?只可意會。如果一個函數,你僅看函數名,就能明白他是做了什麼,返回什麼,那它就是一個好的函數名了。

4.只做一件事

函數應該只做一件事,並且做好這一件事足矣。這個大家都承認吧,並且已經是一個共識了,但是說起來容易,做起來卻並沒有那麼簡單。那麼如何確保函數只做一件事呢?我們可以嘗試這在函數中再拆出一個函數來,當然,拆出的函數不能僅僅是將程式碼搬過去,它應該有自己的責任,能夠對新的函數起一個好的函數名。如果不能再拆出這樣的函數,那麼他應該可以了。

5. 函數參數

最理想的參數數量是0,其次遞增,3個參數就已經很多了。

就函數測試而言,沒有參數的函數測試簡直小菜一碟,若有了一個參數,就需要測試很多種組合,之後每多一個參數,測試的組合數量都是指數級增長。

就調用者而言,沒有參數的函數直接調用即可,而有了參數就需要理解每一個參數是什麼,也增加了調用者的時間。

如果函數的參數中存在布爾值,不好意思,並不推薦這樣做,因為它明確的告訴調用者如果為true就會這樣做,如果為false就會那樣做。更好的做法是其拆分成兩個函數。

同時,如果一個函數需要三個以上的參數,就可以考慮將其中的一些參數封裝成類了。比如描繪笛卡爾坐標的x、y。

6.無副作用

副作用是函數的一個謊言,函數名承諾只做這一件事,但是他偷偷的做了其他事情。

比如,一個checkOrderStatus函數,明顯它是在檢查訂單狀態,但是如果它在檢查的同時對狀態進行了修改,就會讓人很困惑,甚至在排查錯誤的時候,看到這樣一個函數都不會點進去看。更好的做法是將其拆成兩個函數。

7. 每個函數一個抽象層級

說起來很簡單,我們在閱讀程式碼時,往往採用自頂向下的順序來看,如果每個函數都只處理自己所在層級的邏輯,閱讀和維護就很舒服了。

這個雖然我覺得很有道理,但是我沒看懂啊。

。。。等等


那麼問題來了,如何寫出符合這樣規範的程式碼呢?

其實沒有必要再一開始寫的時候就按照規則來寫,那樣很容易打亂思路,甚至事倍功半。完全可以在寫完後在返回來認真打磨、拆解函數、修改名稱、消除重複程式碼等.