新聞中心
1.為什么需要我們重構(gòu)

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


咨詢(xún)
建站咨詢(xún)
