公司差點(diǎn)因?yàn)榇a寫得差把我直接給開掉
1.為什么需要我們重構(gòu)
- 重構(gòu)可以提高我們?cè)趯懽骶幋a時(shí)候的速度
 - 重構(gòu)可以讓代碼更加的容易理解,方便其他人接手的時(shí)候,能夠快速的上手
 - 重構(gòu)可以找出我們代碼里面隱藏的一些不易察覺的Bug,進(jìn)而在之后的運(yùn)行的過程中,能減少很多不必要的麻煩。
 
而在《重構(gòu):改善既有代碼的設(shè)計(jì)》說重構(gòu)的目的:讓軟件更加的容易理解和修改,而與之前的形成對(duì)比的是性能方面的優(yōu)化,不改變組件的行為,改變內(nèi)部結(jié)構(gòu),而重構(gòu)之后的軟件功能還是一如既往。
而阿粉是親身經(jīng)歷過有些人的代碼,咱們先不說這個(gè)功能實(shí)現(xiàn)的好壞,至少你必要的方法上面能不能寫點(diǎn)注釋,比如說實(shí)現(xiàn)某些功能的時(shí)候,你可以在方法的實(shí)現(xiàn)上面寫上,用于此處教師信息的導(dǎo)入,完成教師信息的分類別導(dǎo)入和基礎(chǔ)查詢,可能你在中間做了很多業(yè)務(wù)上的操作,不用像剛剛走上工作崗位的朋友一樣,每個(gè)方法上面都寫上注釋,但是必有的注釋還是要有的把,阿粉之前接手的一個(gè)項(xiàng)目,從頭到尾除了在配置文件里面寫了注釋,估計(jì)還是百度的時(shí)候?qū)懭肱渲玫臅r(shí)候加上去的注釋,一個(gè)注釋沒有,看的阿粉那叫一個(gè)崩潰。
2.都有哪些代碼需要重構(gòu)
2.1 重復(fù)代碼
最簡(jiǎn)單的一個(gè)重構(gòu)的代碼,阿粉給大家放上一個(gè)片段,假如說我們有一個(gè)注冊(cè)和一個(gè)登陸的,
- @RequestMapping("regist")
 - public Map<String,Object> registUser(HttpServletRequest request, HttpServletResponse response,String userName,String passWord){
 - Map<String, Object> map = new HashMap<>();
 - //校驗(yàn)驗(yàn)證碼是否正確
 - if(PropUtils.checkCode(request.getParameter("Code"))){
 - //如果校驗(yàn)成功
 - map.put("state",0);
 - map.put("msg","驗(yàn)證碼正確");
 - }else{
 - map.put("state",1);
 - map.put("msg","驗(yàn)證碼錯(cuò)誤");
 - }
 - //此處保存帳號(hào)密碼
 - return map;
 - }
 
大家可以看一下上面的代碼,是不是很多地方我們可以直接把這些代碼進(jìn)行封裝,畢竟你學(xué)Java的,你不會(huì)封裝方法的話,你豈不是就不是一個(gè)正兒八級(jí)的合格程序員了。
于是我們把這個(gè)代碼抽取出來,就組成一個(gè)方法,也可以使用IDEA的快捷鍵,Extract Method 這樣把我們重復(fù)的代碼提取出來,當(dāng)我們?cè)谑褂眠@段代碼的時(shí)候,我們就能夠把這些內(nèi)容直接調(diào)用,不用在直接拿過來復(fù)制粘貼,然后把代碼重新組合啥的,直接就可以把這個(gè)抽取出來的方法進(jìn)行調(diào)用,實(shí)現(xiàn)我們的功能即可。
而上面就單獨(dú)說這個(gè)驗(yàn)證這個(gè)驗(yàn)證碼正確性這塊的內(nèi)容,我們?cè)谧?cè)的時(shí)候,有時(shí)候會(huì)需要這個(gè)驗(yàn)證,在我們登錄的時(shí)候有時(shí)候也會(huì)需要這個(gè),那么都是同樣的驗(yàn)證,你這就相當(dāng)于寫了兩次,如果說你不做抽取,那你的里面就出現(xiàn)了最簡(jiǎn)單的這種代碼冗余。那我們這時(shí)候是不是就可以通過Extract Method把代碼抽取成一個(gè)方法,封裝起來,當(dāng)我們需要這段代碼的時(shí)候,我們把這個(gè)參數(shù)傳遞過去,返回我們想要的數(shù)據(jù)就可以了,不是么?
2.2 巨長(zhǎng)的參數(shù)
為什么阿粉要把這個(gè)放在第二個(gè)呢,因?yàn)檫@個(gè)也是大家有時(shí)候在寫代碼的時(shí)候最容易出現(xiàn)的問題,有很多剛剛初入公司的年輕人來說,那傳遞的參數(shù),那叫一個(gè)恐怖,一行兩行都不能滿足,比如說:
- HttpServletRequest request, int page, int limit, HttpServletResponse response,String oauthuser, String cupboardId, String boxId, String upboxuser,String sex,int age
 
大家看看這個(gè),如果說你在寫完之后,生成注釋的話,這樣在注釋上面還能知道這個(gè)方法里面的參數(shù)是什么,規(guī)范一點(diǎn)的話,那也能知道,但是你如果起個(gè)亂七八糟的名稱,還這么這么多的參數(shù),誰看到了不是瘋狂想diss你。
而我們能怎么處理呢?這時(shí)候你是不是把對(duì)象忘記了,此對(duì)象非彼對(duì)象,而有了對(duì)象,我們就沒必要把我們函數(shù)需要的東西用多個(gè)參數(shù)傳遞了,我們只需要傳遞給他足夠的,讓函數(shù)能夠從中獲取自己需要的東西這樣就完全OK了,大家在這塊內(nèi)容也是經(jīng)常使用的。
比如我們大家在使用 Mybatis 的時(shí)候我們?cè)趓esultType 里面是不是很多時(shí)候都會(huì)選擇傳遞一個(gè)對(duì)象回去,而如果沒有對(duì)象的時(shí)候,你去傳遞List
所以說,如果你的參數(shù)過長(zhǎng)的時(shí)候,那么你就應(yīng)該需要考慮是不是要進(jìn)行一下優(yōu)化了。
2.3 注釋太多,代碼很low
阿粉說這個(gè)的意思是這個(gè)樣子的,大家有沒有發(fā)現(xiàn),有時(shí)候,你看到注釋的時(shí)候,滿心歡喜的,感覺就是上一個(gè)哥們很給力呀,這注釋寫的明明白白的,但是看到下面的代碼的時(shí)候,就有了一種想要“一起去爬山”的心情,而我們?cè)趯懽⑨尩臅r(shí)候需要注意什么?
- 注釋形式統(tǒng)一,也就是我們的注釋盡量都是寫的一致,文檔注釋就是文檔注釋,語句注釋就是語句注釋,配置注釋就是配置注釋。
 - 注釋一定簡(jiǎn)明扼要,內(nèi)容簡(jiǎn)單直白,是什么就是什么
 - 注釋的數(shù)量,注釋必不可少,但也不應(yīng)過多,在實(shí)際的代碼規(guī)范中,要求注釋占程序代碼的比例達(dá)到20%左右。注釋是對(duì)代碼的“提示”,而不是文檔。
 
2.4 非常長(zhǎng)的函數(shù)
話說阿粉在看到這個(gè)過長(zhǎng)函數(shù)的時(shí)候,并沒有什么感覺,為什么函數(shù)過程不太好呢,阿粉把《重構(gòu):改善既有代碼的設(shè)計(jì)》中的第三章硬生生的看了好幾遍,書中大致內(nèi)容如下:
擁有短函數(shù)的對(duì)象會(huì)活的比較好,比較長(zhǎng). 不熟悉面向?qū)ο蟮娜?常常覺得對(duì)象程序中只有無窮無盡的委托,根本沒有進(jìn)行任何計(jì)算. 和此類程序共同生活數(shù)年之后,你才會(huì)知道, 這些小小函數(shù)有多大價(jià)值. "間接層"所能帶來的全部利益- 解釋能力,共享能力,選擇能力.這都是由小型函數(shù)支持的.
這段話是出自書中的,那么這是個(gè)什么意思呢?其實(shí)說白了,就是,你的一個(gè)方法里面,寫了太多太多的邏輯,阿粉因?yàn)楣敬a涉密的關(guān)系,不能給大家截圖,而這里所說的就是,你在方法里面一個(gè)方法寫了1000多行的代碼。
真的有這么復(fù)雜的么,說實(shí)話,不排除這種可能性,畢竟程序是多變的,但是你是不是需要自己想一下,如果你寫了一個(gè)方法,方法里面處理了一大堆邏輯,然后滑輪使勁好幾下,一個(gè)方法沒結(jié)束,那么對(duì)接下來的維護(hù)人員,就不單單說維護(hù)人員了,就是你自己三個(gè)月之后來看自己寫的代碼,你確定你能維護(hù)好么?
而我們需要怎么做?
把邏輯整理,分解為不同的小函數(shù)(小方法)。提高可讀性,這樣,我們?cè)谥蟮拇a維護(hù)也好維護(hù),處理也好處理,不是么?
3.如何寫出優(yōu)雅的代碼
- 可讀性高
 - 邏輯清晰
 - 高內(nèi)聚,低耦合
 - 學(xué)會(huì)應(yīng)用你所學(xué)的封裝,繼承,多態(tài)
 - 已測(cè)試
 
到這里,阿粉希望大家能夠?qū)懗鲎銐騼?yōu)雅的代碼,不會(huì)像阿粉一樣,因?yàn)榘汛a寫的稀碎,最終導(dǎo)致自己差點(diǎn)被公司開了。















 
 
 







 
 
 
 