我們每個人剛開始編程寫代碼時锐想,函數(shù)總是寫得冗長而復(fù)雜,有太多的縮進(jìn)和嵌套循環(huán)乍狐,有過長的參數(shù)列表赠摇。函數(shù)名稱是隨意取的,也會有重復(fù)代碼出現(xiàn)在不同函數(shù)體中浅蚪。但是藕帜,這沒有關(guān)系,寫好函數(shù)重在細(xì)節(jié)+耐心打磨惜傲。我們需要多幾次分解函數(shù)洽故,修改函數(shù)名稱,消除重復(fù)盗誊,重新安置函數(shù)时甚,甚至拆散類。打磨函數(shù)哈踱,規(guī)范代碼本身就是工匠精神的體現(xiàn)荒适,所以這一切很正常。
如何寫好代碼中的函數(shù)开镣?也許我們需要注意這些刀诬。
短小
俗話說:函數(shù)的第一規(guī)則是短小,第二規(guī)則是還要更短小邪财。保證一個函數(shù)只做一件事陕壹,它最長不過20行左右。
在遇到if語句卧蜓,else語句帐要,while語句等,其中的代碼應(yīng)該只保持一行弥奸。該行大抵是一個函數(shù)調(diào)用語句榨惠。這樣不但能保持函數(shù)短小,而且,塊內(nèi)調(diào)用的函數(shù)擁有較為具體說明性的名稱赠橙,從而增加了代碼的可讀性耽装。這樣,函數(shù)的縮進(jìn)層級不該多于一層或兩層期揪。
只做一件事
函數(shù)應(yīng)該只做一件事掉奄。編寫函數(shù)是為了把大一些的概念拆分為另一抽象層上的一系列步驟。函數(shù)只做一件事指的是在函數(shù)本身這一抽象層級上的一件事兒凤薛,具體的實現(xiàn)步驟姓建,可以通過實現(xiàn)下一層級的函數(shù)來調(diào)用。
如果函數(shù)還可以拆分出另一個函數(shù)或者可以被劃分為多個區(qū)段缤苫,則該函數(shù)違反了"一件事"原則速兔。
每個函數(shù)一個抽象層級
函數(shù)中的語句都要在統(tǒng)一抽象層級上,你可能會調(diào)用某個較高層級的函數(shù)活玲,例如實現(xiàn)貓圖像識別的函數(shù)涣狗,但在該函數(shù)底部卻輸出該圖像到磁盤上。調(diào)用貓識別的函數(shù)抽象較高舒憾,后面輸出太過于具體镀钓,違反了"一個抽象層級"的原則。
switch語句
盡量避免使用switch語句镀迂,switch語句太長丁溅,它明顯做了不止一件事。如果無法避免switch招拙,盡量讓每個分支在統(tǒng)一抽象級上唧瘾。
使用描述性名稱
函數(shù)一般是一個動賓短語,不用怕名稱太長别凤,盡量保持描述性饰序。另外,在同一抽象層級上的函數(shù)保持函數(shù)命名方式一致规哪。
函數(shù)參數(shù)
函數(shù)參數(shù)理想情況為0個求豫,其次是1個,再次是2個诉稍,盡量避免3個蝠嘉。函數(shù)參數(shù)最好不作為返回值。如果確實有很多內(nèi)容需要作為參數(shù)傳進(jìn)函數(shù)杯巨,可以歸納參數(shù)的一致性并封裝成類蚤告,作為對象傳進(jìn)函數(shù)。
分割指令和詢問
函數(shù)要么做了一件事服爷,要么用于判斷一件事杜恰。一個函數(shù)最好不要同時把做的事情和需要判斷的條件放在一個函數(shù)體中获诈。這屬于兩件事。
避免重復(fù)
不同的函數(shù)體中如果出現(xiàn)相同或者相似功能的語句心褐,最好抽象成函數(shù)統(tǒng)一起來舔涎,避免代碼冗余。