代码整洁之道-函数
什么是一個(gè)好的函數(shù)或者叫方法,只要能讓函數(shù)明確的表達(dá)其意圖,讓讀者能夠一眼看出是一個(gè)怎樣的函數(shù),其接收什么參數(shù),返回什么結(jié)果,做了什么事情。能做到這,大概就能算作一個(gè)好的函數(shù)了,看上去很簡單。那么問題來了,如果做到這點(diǎn)呢?
1. 短小
想象一下,一個(gè)擊敗航的復(fù)雜函數(shù)和一個(gè)只有十幾行的函數(shù),哪一個(gè)能夠讓人一眼看出其意圖并理解其行為呢?顯然是后者。當(dāng)然,現(xiàn)在大多數(shù)語言完全可以將幾百行代碼寫到一行,那樣毫無格式的代碼只會讓人難以理解。
2.代碼塊和縮進(jìn)
對于if、else等語句來說,其中包含的代碼塊最好只有一行,而這一行應(yīng)該是一個(gè)函數(shù)調(diào)用語句,讓讀者可以一看看出其意圖
3.函數(shù)名
一個(gè)好的函數(shù)名十分重要,如何定義一個(gè)好的函數(shù)名呢?只可意會。如果一個(gè)函數(shù),你僅看函數(shù)名,就能明白他是做了什么,返回什么,那它就是一個(gè)好的函數(shù)名了。
4.只做一件事
函數(shù)應(yīng)該只做一件事,并且做好這一件事足矣。這個(gè)大家都承認(rèn)吧,并且已經(jīng)是一個(gè)共識了,但是說起來容易,做起來卻并沒有那么簡單。那么如何確保函數(shù)只做一件事呢?我們可以嘗試這在函數(shù)中再拆出一個(gè)函數(shù)來,當(dāng)然,拆出的函數(shù)不能僅僅是將代碼搬過去,它應(yīng)該有自己的責(zé)任,能夠?qū)π碌暮瘮?shù)起一個(gè)好的函數(shù)名。如果不能再拆出這樣的函數(shù),那么他應(yīng)該可以了。
5. 函數(shù)參數(shù)
最理想的參數(shù)數(shù)量是0,其次遞增,3個(gè)參數(shù)就已經(jīng)很多了。
就函數(shù)測試而言,沒有參數(shù)的函數(shù)測試簡直小菜一碟,若有了一個(gè)參數(shù),就需要測試很多種組合,之后每多一個(gè)參數(shù),測試的組合數(shù)量都是指數(shù)級增長。
就調(diào)用者而言,沒有參數(shù)的函數(shù)直接調(diào)用即可,而有了參數(shù)就需要理解每一個(gè)參數(shù)是什么,也增加了調(diào)用者的時(shí)間。
如果函數(shù)的參數(shù)中存在布爾值,不好意思,并不推薦這樣做,因?yàn)樗鞔_的告訴調(diào)用者如果為true就會這樣做,如果為false就會那樣做。更好的做法是其拆分成兩個(gè)函數(shù)。
同時(shí),如果一個(gè)函數(shù)需要三個(gè)以上的參數(shù),就可以考慮將其中的一些參數(shù)封裝成類了。比如描繪笛卡爾坐標(biāo)的x、y。
6.無副作用
副作用是函數(shù)的一個(gè)謊言,函數(shù)名承諾只做這一件事,但是他偷偷的做了其他事情。
比如,一個(gè)checkOrderStatus函數(shù),明顯它是在檢查訂單狀態(tài),但是如果它在檢查的同時(shí)對狀態(tài)進(jìn)行了修改,就會讓人很困惑,甚至在排查錯(cuò)誤的時(shí)候,看到這樣一個(gè)函數(shù)都不會點(diǎn)進(jìn)去看。更好的做法是將其拆成兩個(gè)函數(shù)。
7. 每個(gè)函數(shù)一個(gè)抽象層級
說起來很簡單,我們在閱讀代碼時(shí),往往采用自頂向下的順序來看,如果每個(gè)函數(shù)都只處理自己所在層級的邏輯,閱讀和維護(hù)就很舒服了。
這個(gè)雖然我覺得很有道理,但是我沒看懂啊。
。。。等等
那么問題來了,如何寫出符合這樣規(guī)范的代碼呢?
其實(shí)沒有必要再一開始寫的時(shí)候就按照規(guī)則來寫,那樣很容易打亂思路,甚至事倍功半。完全可以在寫完后在返回來認(rèn)真打磨、拆解函數(shù)、修改名稱、消除重復(fù)代碼等.
總結(jié)
- 上一篇: NS2相关学习——完成一个新协议(3)
- 下一篇: crontab 指令笔记