我們每個人剛開始編程寫代碼時,函數總是寫得冗長而復雜,有太多的縮進和嵌套循環,有過長的參數列表。函數名稱是隨意取的,也會有重復代碼出現在不同函數體中。但是,這沒有關系,寫好函數重在細節+耐心打磨。我們需要多幾次分解函數,修改函數名稱,消除重復,重新安置函數,甚至拆散類。打磨函數,規范代碼本身就是工匠精神的體現,所以這一切很正常。
如何寫好代碼中的函數?也許我們需要注意這些。
短小
俗話說:函數的第一規則是短小,第二規則是還要更短小。保證一個函數只做一件事,它最長不過20行左右。
在遇到if語句,else語句,while語句等,其中的代碼應該只保持一行。該行大抵是一個函數調用語句。這樣不但能保持函數短小,而且,塊內調用的函數擁有較為具體說明性的名稱,從而增加了代碼的可讀性。這樣,函數的縮進層級不該多于一層或兩層。
只做一件事
函數應該只做一件事。編寫函數是為了把大一些的概念拆分為另一抽象層上的一系列步驟。函數只做一件事指的是在函數本身這一抽象層級上的一件事兒,具體的實現步驟,可以通過實現下一層級的函數來調用。
如果函數還可以拆分出另一個函數或者可以被劃分為多個區段,則該函數違反了"一件事"原則。
每個函數一個抽象層級
函數中的語句都要在統一抽象層級上,你可能會調用某個較高層級的函數,例如實現貓圖像識別的函數,但在該函數底部卻輸出該圖像到磁盤上。調用貓識別的函數抽象較高,后面輸出太過于具體,違反了"一個抽象層級"的原則。
switch語句
盡量避免使用switch語句,switch語句太長,它明顯做了不止一件事。如果無法避免switch,盡量讓每個分支在統一抽象級上。
使用描述性名稱
函數一般是一個動賓短語,不用怕名稱太長,盡量保持描述性。另外,在同一抽象層級上的函數保持函數命名方式一致。
函數參數
函數參數理想情況為0個,其次是1個,再次是2個,盡量避免3個。函數參數最好不作為返回值。如果確實有很多內容需要作為參數傳進函數,可以歸納參數的一致性并封裝成類,作為對象傳進函數。
分割指令和詢問
函數要么做了一件事,要么用于判斷一件事。一個函數最好不要同時把做的事情和需要判斷的條件放在一個函數體中。這屬于兩件事。
避免重復
不同的函數體中如果出現相同或者相似功能的語句,最好抽象成函數統一起來,避免代碼冗余。