代碼重構(gòu)的場(chǎng)景總結(jié)

核心思想:拆細(xì)厦画、公用

重構(gòu)可以是修改變量名嘱能、重新安排目錄這樣簡(jiǎn)單的物理重構(gòu),也可以是抽取子函數(shù)伦吠、精簡(jiǎn)冗余設(shè)計(jì)這樣稍許復(fù)雜的邏輯重構(gòu)妆兑。但均不改變現(xiàn)有代碼的功能。

了解敵人——丑陋的代碼
  • 臃腫的類
    開發(fā)者缺乏對(duì)最基本的編碼原則毛仪,即“單一職責(zé)原則”(SRP)的理解搁嗓。開發(fā)者不去思考這些功能是不是應(yīng)該放在這同一個(gè)類中,導(dǎo)致這些類會(huì)變得很臃腫箱靴,造成一個(gè)類幾千行腺逛,讓下一個(gè)接盤俠欲哭無淚。

  • 臃腫的方法
    好幾十上百行的一個(gè)函數(shù)堆在一塊衡怀,用面向過程的思想來寫代碼棍矛。

  • 函數(shù)參數(shù)過多
    函數(shù)參數(shù)過多會(huì)導(dǎo)致調(diào)用者對(duì)方法難以理解,參數(shù)弄混抛杨。想象一下一個(gè)函數(shù)連續(xù)傳5個(gè)int值參數(shù)够委,能分清誰是誰嗎?建議可以將參數(shù)組成一個(gè)對(duì)象傳入。

  • 層層嵌套的判斷
    如果邏輯不復(fù)雜盡量減少if-else的分支包裹怖现,他人太難閱讀慨绳。比如不滿足條件了直接return,不走其他代碼真竖,這樣可以減少一層嵌套脐雪。

  • 滿篇跑的常量值
    一個(gè)類里面出現(xiàn)各種未命名的常量值。0恢共,1战秋,200等等鋪天蓋地。這種狀態(tài)碼意義改了讨韭,改代碼會(huì)把你改哭的脂信。難道就不能先聲明一個(gè)統(tǒng)一的常量變量來使用嗎癣蟋。

  • 模棱兩可的命名
    不能根據(jù)名字一眼看懂它的功能的命名不是一個(gè)好命名。當(dāng)然生僻的單詞除外狰闪。模糊的疯搅,沒有功能意義的命名會(huì)給閱讀造成很大困難。

重構(gòu)之道

  • 分拆大函數(shù): Break Method
    當(dāng)函數(shù)比較大了埋泵,就可以根據(jù)功能節(jié)點(diǎn)分拆成多個(gè)小函數(shù)幔欧,也許其中的小函數(shù)還可以公用。比如結(jié)算購物車丽声,包括計(jì)算各類商品的總價(jià)礁蔗,再計(jì)算折扣,再計(jì)算滿減優(yōu)惠雁社,如果一個(gè)方法執(zhí)行完浴井,那么別人要只要邏輯就要從頭到尾讀一遍。而分別拆分成三個(gè)霉撵,一眼就能看出這段邏輯先后做了什么磺浙。寫方法切忌一口吃一個(gè)胖子。

  • 封裝到父類:
    如果多各類要執(zhí)行相似的功能和代碼徒坡,可以把該方法放到它們的父類中屠缭,或者提取出來成業(yè)務(wù)工具類。

  • Move Method----方法遷移
    遵守“單一職責(zé)”原則崭参,當(dāng)類中的方法不適合放在當(dāng)前類中時(shí)呵曹,就應(yīng)該為該方法尋找合適下家。移到與方法耦合大的類中何暮。當(dāng)一個(gè)方法被其他類使用比在它所在類中的使用還要頻繁時(shí)奄喂,我們就需要使用遷移方法重構(gòu)了——將方法遷移到更頻繁地使用它的類中。

  • Move Field----搬移字段
    當(dāng)在一個(gè)類中的某一個(gè)字段海洼,被另一個(gè)類的對(duì)象頻繁使用時(shí)跨新,我們就應(yīng)該考慮將這個(gè)字段的位置進(jìn)行更改了

  • Extract Class----提煉類
    一個(gè)類如果過于復(fù)雜,做了好多的事情坏逢,違背了“單一職責(zé)”的原則域帐,所以需要將其可以獨(dú)立的模塊進(jìn)行拆分,當(dāng)然有可能由一個(gè)類拆分出多個(gè)類是整。
    對(duì)類的細(xì)化也是為了減少代碼的重復(fù)性肖揣,以及提高代碼的復(fù)用性,便于代碼的維護(hù)浮入。

  • 提升方法龙优、字段(Pull Up Method)
    將方法向繼承鏈上層遷移的過程。用于一個(gè)方法被多個(gè)實(shí)現(xiàn)者使用時(shí)事秀。在繼承的體系中彤断,當(dāng)多個(gè)類使用了相同或類似的方法野舶,就可以考慮將該方法抽取到基類,沒有基類就創(chuàng)建一個(gè)宰衙。字段提升同方法平道。

  • 降低方法
    即父類抽象方法讓多個(gè)子類實(shí)現(xiàn)。多個(gè)子類有相同的功能但是有各個(gè)具體的實(shí)現(xiàn)方法供炼,那么這種封裝就可以用多態(tài)性了一屋,父類創(chuàng)建一個(gè)抽象方法,將方法實(shí)現(xiàn)降低到子類劲蜻。

  • 重復(fù)代碼的提煉
    有時(shí)候?yàn)榱粟s項(xiàng)目進(jìn)度陆淀,盡快完成功能考余,會(huì)偷懶將實(shí)現(xiàn)功能的一片代碼復(fù)制一遍先嬉,直接套用。這種把多余的刪掉楚堤,保留一個(gè)疫蔓,也許只需傳一兩個(gè)參數(shù)就可以封成一個(gè)方法供多處調(diào)用。

  • 重命名變量(類身冬、方法衅胀、變量)
    這個(gè)很重要,可以不夸張地說酥筝,命名的水平就體現(xiàn)了編程能力的高低滚躯。在重構(gòu)的過程中,當(dāng)發(fā)現(xiàn)類名嘿歌,方法名在當(dāng)前版本不符合它的功能含義掸掏,就該考慮對(duì)其重新命名。

  • 補(bǔ)加注釋
    對(duì)于全局變量宙帝,公用函數(shù)丧凤,邏輯復(fù)雜的地方添加注釋,彌補(bǔ)之前的遺漏步脓。

  • 將較長的判斷或代碼運(yùn)算用臨時(shí)變臉暫存

if(stateCode = OK && datas != null && canShow)

function(Math.random((num1-num2)*num3))

如上這種長長的判斷條件和參數(shù)會(huì)使 這種代碼應(yīng)該先將if判斷條件寫成一個(gè)變量愿待,放入變量判斷,將function參數(shù)寫一個(gè)局部變量保存結(jié)果靴患,再傳入方法仍侥。

  • 使用泛型封裝成統(tǒng)一的方法或類

  • 函數(shù)要避免過多的參數(shù)造成閱讀的復(fù)雜性

public void requestPhoneThirdRegister(String loginway, String nickname, String openId, String token, String expires, String phone, final CallBackimpl callBackimpl)

用這樣的方法直接傳參數(shù)就太長了,嚴(yán)重降低代碼可讀性鸳君。我們可以將參數(shù)變量寫到一個(gè)實(shí)體類中访圃,通過構(gòu)造方法初始化對(duì)象屬性值,只需要傳遞一個(gè)對(duì)象就搞定相嵌,也解決了增減參數(shù)帶來的變動(dòng)問題腿时。

  • 嵌套條件分支優(yōu)化
     if(){
            if(){
                if(){

                }
            }
        }else{

        }

相信大家也見識(shí)過不少這樣的箭頭代碼况脆,像怎么也解不開的死結(jié)。遇到這種代碼批糟,一定要盡可能要優(yōu)化格了。通常做法:判斷語句,if條件成立徽鼎,執(zhí)行代碼塊盛末,誒,這樣就生成了一個(gè)嵌套層級(jí)否淤。
優(yōu)化的核心思想:直接判斷不滿足的條件悄但,if條件成立,直接return石抡,盡快跳出方法來減少嵌套的層級(jí)檐嚣。
第二種:將條件判讀合并

  • 盡量避免雙重否定的條件
    private boolean isChecked(){
        if(){
            return true;
        }
    }

一個(gè)條件方法。

if(!isChecked()){
      
}

然后用否定來判斷這個(gè)條件啰扛,這樣可能會(huì)一時(shí)之間轉(zhuǎn)變不過來導(dǎo)致條件判斷反了嚎京。當(dāng)然頭腦靈活的忽略這條。

  • 去除東北亂燉的Util類
    當(dāng)我們?cè)趯懘a中偶然間需要抽出公用方法時(shí)隐解,一時(shí)之間找不到合適的類去放置鞍帝,然后就隨意地放進(jìn)了XXUtil或XXManager類中。長此以往煞茫,該類所含功能越來越雜帕涌,dp和px轉(zhuǎn)化在其中,屏幕尺寸相關(guān)方法在其中续徽,日期轉(zhuǎn)化在其中蚓曼,加密的索性也放在其中,那有無網(wǎng)絡(luò)炸宵,網(wǎng)絡(luò)類型判斷也加入吧辟躏。這不就像垃圾場(chǎng)了嗎,各類雜物都堆在其中土全,不符合單一職責(zé)原則捎琐,應(yīng)該按照如上的功能塊分解成多個(gè)職責(zé)單一的類。類多不要緊裹匙,關(guān)鍵要做到職責(zé)單一瑞凑。

  • 將滿篇跑的魔鬼數(shù)字和字符串用定義的常量表示。
    如果只是某個(gè)類或者某個(gè)模塊需要用到該常量概页,就聲明到對(duì)應(yīng)類中籽御。如果是全局項(xiàng)目都會(huì)用到的常量,就提升到項(xiàng)目的常量配置文件中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末技掏,一起剝皮案震驚了整個(gè)濱河市铃将,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哑梳,老刑警劉巖劲阎,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸠真,居然都是意外死亡悯仙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門吠卷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锡垄,“玉大人,你說我怎么就攤上這事祭隔』趿耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵序攘,是天一觀的道長茴她。 經(jīng)常有香客問我寻拂,道長程奠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任祭钉,我火速辦了婚禮瞄沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慌核。我一直安慰自己距境,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布垮卓。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疼鸟。 梳的紋絲不亂的頭發(fā)上空镜,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天张抄,我揣著相機(jī)與錄音欣鳖,去河邊找鬼。 笑死矾缓,一個(gè)胖子當(dāng)著我的面吹牛蜕依,可吹牛的內(nèi)容都是我干的样眠。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了黄选?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤苗膝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體完沪,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熟呛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年九府,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄旬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婆排。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鉴扫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤宋渔,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布薄嫡,位于F島的核電站,受9級(jí)特大地震影響毫深,放射性物質(zhì)發(fā)生泄漏态蒂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一费什、第九天 我趴在偏房一處隱蔽的房頂上張望钾恢。 院中可真熱鬧,春花似錦鸳址、人聲如沸瘩蚪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疹瘦。三九已至,卻和暖如春巡球,著一層夾襖步出監(jiān)牢的瞬間言沐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工酣栈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留险胰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓矿筝,卻偏偏與公主長得像起便,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窖维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容