現(xiàn)在回過(guò)頭來(lái)看項(xiàng)目中以前寫(xiě)的代碼,發(fā)現(xiàn)有好多的controller文件的行數(shù)是非常多的,甚至有時(shí)候打開(kāi)一個(gè)controller的時(shí)候會(huì)導(dǎo)致編輯器卡住或CPU使用率瞬間飆升,風(fēng)扇聲音都有些刺耳.
如果仔細(xì)閱讀和分析這些代碼就會(huì)發(fā)現(xiàn),其實(shí)有好多代碼是本不應(yīng)該放在這里的,一般情況下這些代碼是我們系統(tǒng)的業(yè)務(wù)邏輯,常常是一個(gè)action就像一個(gè)意大利面條一樣順滑,整個(gè)業(yè)務(wù)邏輯代碼一擼到底,其實(shí)這些業(yè)務(wù)邏輯都可以拆分成單獨(dú)的邏輯功能封裝成一個(gè)函數(shù),來(lái)供這里和其他地方調(diào)用,可是我們并沒(méi)有這樣做,這就導(dǎo)致有些比較獨(dú)立的邏輯在各個(gè)地方被無(wú)數(shù)次的重復(fù)書(shū)寫(xiě),所以我們的controller的代碼量急劇飆升.
例如:
# status 代碼表通過(guò)審核
if employee.archive and employee.archive.status==1
# some code
end
如上是一個(gè)非常簡(jiǎn)單的例子,如果放到controller中判斷,那么每個(gè)需要這個(gè)判斷的地方都需要寫(xiě)上面的一串代碼,并且從程序的字面意思上還不能讀懂這個(gè)判斷到底是在判斷什么,如果把上面的代碼改為下面的我覺(jué)得就會(huì)好一些
def archive_valid?
archive && archive.status==1
end
if employee.archive_valid?
end
這只是一個(gè)非常簡(jiǎn)單的邏輯封裝,如果我們的代碼都像上面這樣封裝好的話,我想我們的controller中就不會(huì)有這么長(zhǎng)的代碼,以及這么多的數(shù)據(jù)庫(kù)查詢語(yǔ)句了吧(因?yàn)槲覀兊牟樵冋Z(yǔ)句會(huì)封裝到我們的方法中了)
所以,我們?cè)赾oding的時(shí)候,不能僅僅是為了要實(shí)現(xiàn)功能,而把代碼像意大利面條一樣一擼到底,我們要考慮邏輯的封裝,要考慮函數(shù)封裝的原子性,而不是把很多邏輯混合到一個(gè)函數(shù)中,只有這樣我們的代碼復(fù)用率才能提高,我們的controller才不會(huì)這么fat,我們的model才不會(huì)這么thin.