IDEA 真牛逼,900行 又臭又长 的类重构,几分钟搞定
生活随笔
收集整理的這篇文章主要介紹了
IDEA 真牛逼,900行 又臭又长 的类重构,几分钟搞定
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
??點擊上方?好好學(xué)java?,選擇?星標(biāo)?公眾號
重磅資訊、干貨,第一時間送達(dá) 今日推薦:網(wǎng)傳互聯(lián)網(wǎng)公司加班表個人原創(chuàng)+1博客:點擊前往,查看更多作者:橙味菌 鏈接:https://juejin.im/post/5e11dd736fb9a047f42e61ad 最近在對已有項目進(jìn)行擴(kuò)展的時候,發(fā)現(xiàn)要改動的一個類它長766行,開放了近40個public接口,我流著淚把它給改完了。為了防止這樣的慘劇再次發(fā)生在我的身上,我覺得有必要寫一篇博客來讓廣大程序猿同胞知道代碼重構(gòu)的重要性 如果你身邊有一個類寫上千行的猿,一定要把此文轉(zhuǎn)給ta 為什么類不能過長?類過長——讀不通,擴(kuò)展不通讀不通——直接用滾輪滾都得好幾秒,就算是原作者,時間長了恐怕也難以理清整個類,更不用說是其他的讀者擴(kuò)展不通——一個類有過多的接口,會讓擴(kuò)展這個類變得異常困難,一動千行類過長——可能有冗余代碼此時CV工程師打了個冷戰(zhàn) 冗余代碼,就是重復(fù)代碼,通常出自使用Ctrl+C,Ctrl+V來生產(chǎn)代碼的CV工程師之手,冗余代碼的危害非常大: 冗余代碼使方法、類過長,不簡潔冗余代碼會造成發(fā)散式修改(冗余代碼需要變動時,每一處Ctrl+V都需要修改)類過長——多半是職責(zé)過多" src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8c4a3038ef?imageView2/0/w/1280/h/960/ignore-error/1" data-width="1280" data-height="752" /> 一個類開放幾十個接口,絕對存在職責(zé)過多的問題,就像圖中的Tom貓一樣手忙腳亂,一個類的職責(zé)過多也有巨大問題: 違反設(shè)計原則——單一職責(zé)原則(單一職責(zé)原則要求一個類只實現(xiàn)一個職責(zé),比如一只Tom只做掃地、擦桌、拖地中的一件事,而其他事的實現(xiàn)可以轉(zhuǎn)移給史派克狗或肥胖女傭),違反了這個原則會導(dǎo)致發(fā)散式變化、發(fā)散式修改、類過長等代碼問題,還會讓你的類難以擴(kuò)展,甚至?xí)屍渌绦蛟痴J(rèn)為你不專業(yè) 發(fā)散式變化(指引發(fā)此類修改的地方很多),如果一個類的職責(zé)很多,那它的扇入(調(diào)用者)一定很多,每個調(diào)用者的修改都有可能讓你這個類不得不隨之修改,也就是發(fā)散式變化 就是說不管哪兒出了問題,你這個類都得遭殃 發(fā)散式修改(指此類修改引發(fā)修改的地方很多),相同的,如果一個類職責(zé)很多,那支撐它實現(xiàn)的下級,即扇出(被調(diào)用方)一定很多,如果此類邏輯發(fā)生變動,所有下級被調(diào)用者可能都得隨之修改,也就是發(fā)散式修改 就是說你這個類出了問題,不管哪兒都會遭殃 難以擴(kuò)展:如果你的一個類接口非常多,那它的子類怎么辦?它的包裝類怎么辦?難道全部都要實現(xiàn)這么多接口,全部都要承擔(dān)同樣多的職責(zé)嗎?擴(kuò)展起來真的非常麻煩 觸發(fā)機關(guān):【測試之怒】【運維之怒】 我已經(jīng)寫了幾千行了,怎么辦?重構(gòu)——抽取冗余代碼抽取冗余代碼就是將重復(fù)代碼抽取成一個獨立的方法,之后再使用這段代碼時就不再需要Ctrl + C,Ctrl + V,而是直接調(diào)用對應(yīng)的方法即可 這樣做也可以縮短原方法,使原方法更加簡潔易懂 更值得一提的是如果這段代碼需要修改,也只需修改一處,而不是發(fā)散式地到處修改 真是一箭三雕 使用IDEA進(jìn)行冗余代碼的抽取找到重復(fù)代碼 進(jìn)行方法抽取 右鍵->選擇重構(gòu)->抽取->方法 (或者直接使用快捷鍵Ctrl + Alt + m) " src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8e2544fe59?imageView2/0/w/1280/h/960/ignore-error/1" data-width="1280" data-height="745" />" src="https://user-gold-cdn.xitu.io/2020/1/5/16f75c8e7cf3c668?imageView2/0/w/1280/h/960/ignore-error/1" data-width="1280" data-height="726" /> 自動檢測出個別重復(fù)代碼的細(xì)微差別,有些代碼可能只改動一兩個變量,IDEA會自動檢測出來,并在抽取方法時提醒我們,選擇左側(cè)Accept Signature Change(接受簽名變動)可以使抽取的方法自動替換更多的重復(fù)點 可以選擇替換掉所有的重復(fù)代碼(竟然有18處) 重構(gòu)——更改方法簽名 如果你對抽取出的方法的名字、參數(shù)、返回值或是修飾符不滿意,不要使用Ctrl + R 修改,IDEA提供了重構(gòu)方法——更改簽名(快捷鍵Ctrl + F6) 注意:方法的名字指的是方法做了什么,而非怎么去做,最好是 動詞+名詞 格式 比如:Tom.掃地() √ Tom.掃地With掃把() × Tom.用掃把掃地() × 重構(gòu)——轉(zhuǎn)移成員變量+函數(shù)(轉(zhuǎn)移職責(zé))將不應(yīng)該由自己管理的成員變量和函數(shù)轉(zhuǎn)移出去 那就要考慮兩個問題:該轉(zhuǎn)移誰?轉(zhuǎn)移給誰? 來看一個圖 圖中成員【偏A】被類【A】調(diào)用兩次,而只被它所在的類【過長類】調(diào)用1次,因而應(yīng)該轉(zhuǎn)移給【A】去管理由于函數(shù)【偏A】與成員【偏A】的親密度較高(只調(diào)用了【偏A】),因而應(yīng)與【偏A】共進(jìn)退,同去留,轉(zhuǎn)移給【A】成員【偏B】和函數(shù)【偏B】也是相同道理職責(zé)1(函數(shù)【1】和成員【偏職責(zé)1】)和職責(zé)2(函數(shù)【2】和成員【偏職責(zé)2】)由于找不到可轉(zhuǎn)移的合適的類,所以應(yīng)抽取出一個新的類注意,先決定移動哪個成員變量,然后再決定移動哪個函數(shù) 使用IDEA轉(zhuǎn)移成員變量和函數(shù)移動成員變量,鼠標(biāo)選擇成員變量->右鍵->Refactor->Move,然后選擇轉(zhuǎn)移至哪個類2. ?移動函數(shù)(與移動成員變量步驟相同) 重構(gòu)——抽取類當(dāng)你發(fā)現(xiàn)要轉(zhuǎn)移的成員變量和函數(shù)找不到合適的類時(轉(zhuǎn)移職責(zé)卻找不到下家),要想起來,這里是程序世界,而我們程序猿就是類和對象的造物主,是時候創(chuàng)建一個新的類,讓它來替我們分擔(dān)職責(zé)(成員變量和函數(shù))了 使用IDEA抽取類重構(gòu) 選中要搬的成員變量和函數(shù),右鍵->Refactor->Extract->Delegate(抽取一個委托者,委托他來管理這部分變量和函數(shù),如果只有變量或只有函數(shù),可以抽出參數(shù)對象Paramater Object或方法對象Method Object) 不推薦抽取參數(shù)對象,因為一般參數(shù)對象是給參數(shù)多的方法用的(用參數(shù)對象取代一長溜的參數(shù)),而且如果成員變量抽取了也不會影響任何函數(shù)的話,那就是無用對象了,不如直接把他們刪除掉 為新類起個名,選個包吧 注意,抽取的函數(shù)和成員一定要符合一個原則,那就是被抽取函數(shù)使用被抽取成員的次數(shù)一定高于剩余函數(shù)的次數(shù),不然違反親密性原則(成員應(yīng)歸于調(diào)用它最多的類,沒有理由你用的比我多還讓我來管理) 一些小問題 由于抽取的函數(shù)直接使用了未抽取的對象而導(dǎo)致重構(gòu)失敗,涉及到另一個重構(gòu)(使用get方法而非直接使用私有成員變量),使用此重構(gòu)即可解決最后,再附上我歷時三個月總結(jié)的?Java 面試 + Java 后端技術(shù)學(xué)習(xí)指南,這是本人這幾年及春招的總結(jié),目前,已經(jīng)拿到了騰訊等大廠offer,拿去不謝,github 地址:https://github.com/OUYANGSIHAI/JavaInterview
這么辛苦總結(jié),給個star好不好。?點擊閱讀原文,直達(dá)
總結(jié)
以上是生活随笔為你收集整理的IDEA 真牛逼,900行 又臭又长 的类重构,几分钟搞定的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线上Bug无法复现怎么办?老司机教你一招
- 下一篇: 面试官:关于负载均衡你了解多少