代码的坏味道之一——译自《重构》
重復(fù)代碼Duplicated Code
臭味集合里面排第一的就是重復(fù)代碼了。如果你在不止一處發(fā)現(xiàn)了同樣結(jié)構(gòu)的代碼,你可以確定如果你找到一種方法來統(tǒng)一他們的話,你的程序?qū)纳啤?/p>
最簡單的重復(fù)代碼問題是當(dāng)你在同一個(gè)類中有兩個(gè)方法有相同的表達(dá)時(shí)出現(xiàn)的。那么你需要做的所有步驟只是提取方法然后在兩處調(diào)用代碼。
另一種常見的重復(fù)問題是當(dāng)你在兩個(gè)兄弟類中有相同的表達(dá)。你可以通過在兩個(gè)類中提取方法然后拉升方法(Pull up Method)來消滅重復(fù)。如果這段代碼相似但不相同,你需要通過提取方法來分離相同和不同的部分。你可能會發(fā)現(xiàn)你可以使用構(gòu)成模版方法(Form Template Method)。如果這些方法是在用不同的算法做同樣的事情,你可以選擇兩種算法中比較清楚的那個(gè)然后替換算法。
? ? ? 如果你的重復(fù)代碼在兩個(gè)不相關(guān)的類中,考慮在一個(gè)類中使用提取類,然后在另一個(gè)類中使用這個(gè)新部件。另一種可能是這個(gè)方法只屬于其中一個(gè)類,并且要被其他類調(diào)用;或者方法屬于另一個(gè)類需要參考原始類。你必須決定這個(gè)方法在哪更有意義,并且確認(rèn)他只在那里不在其他任何地方。
?
長方法Long Method
對象程序存在的最好最長的都是那些短方法組成的。新接觸對象的程序員經(jīng)常覺得對象程序是無盡的委托,沒有一點(diǎn)計(jì)算發(fā)生。當(dāng)你和這樣的程序相處一些年份,你會學(xué)到小方法是多么的有價(jià)值。所有間接帶來的好處——解釋,分享,選擇都被小方法支持。
早在編程最初時(shí)期人們就意識到一段流程越長就越難被理解。老一些的語言對子程序的調(diào)用付出更多的代價(jià),阻止了人們接觸小方法?,F(xiàn)代面對對象語言差不多消除了進(jìn)程中的調(diào)用的代價(jià)。對于代碼的讀者仍然還有代價(jià),就是如果要看子程序做了什么需要切換內(nèi)容。開發(fā)環(huán)境允許同時(shí)看兩個(gè)方法幫助消除了這個(gè)代價(jià),但真正讓理解小方法更容易的是好的命名。如果對一個(gè)方法你有好的名字,那么你就不需要看他的方法體了。
網(wǎng)絡(luò)效應(yīng)即你應(yīng)該在分解方法上更積極一些。一個(gè)我們遵循的啟示是,當(dāng)我們覺得需要注釋的時(shí)候,我們寫一個(gè)方法來取代之。這樣的一個(gè)方法包含被注釋過的代碼,但被以代碼的意圖命名了,而不是代碼怎樣做命名。我們可能對幾行代碼這樣做,也可能只針對一行。我們這樣做即使我們調(diào)用的方法比他代替的代碼還要長,但提供的方法名解釋代碼的意圖。這里的關(guān)鍵不是方法的長度,而是方法做什么和怎么做之間的語義距離。
? 百分之九十九的時(shí)候,簡短方法你所需要做的全部就是提取方法。把方法中看起來很適合在一起的部分找到,然后作為一個(gè)新的方法。
如果你有一個(gè)許多參數(shù)和臨時(shí)變量的方法,這些元素礙了提取方法的事。如果你試圖提取方法,你以傳遞那么多參數(shù)和臨時(shí)變量作為提取方法的參數(shù)收尾,那么這個(gè)結(jié)果幾乎不比原來的狀況可讀性更高。你常常可以通過用請求替代臨時(shí)變量來消除臨時(shí)變量。一長列參數(shù)可以被引入?yún)?shù)對象和保留整個(gè)對象(Preserve Whole Object)來精簡。
如果你嘗試了并且你仍然有許多臨時(shí)變量和參數(shù),那么是時(shí)候使用重型火炮:用方法對象替代方法了。
你怎么鑒別需要被提取的代碼塊呢?一個(gè)好的技巧是尋找注釋。注釋常常是這類語義距離的信號。一塊帶有注釋的代碼告訴你,這段代碼做的事可以被基于這個(gè)注釋命名的方法替代。即使是一行代碼也值得提取,如果它需要解釋。
條件語句和循環(huán)也是提取的信號。用分解條件語句來處理?xiàng)l件語句表達(dá)。對待循環(huán),提取循環(huán)和循環(huán)中的代碼到他們自己的方法里去。
轉(zhuǎn)載于:https://www.cnblogs.com/browncrane/p/refactoring_1.html
總結(jié)
以上是生活随笔為你收集整理的代码的坏味道之一——译自《重构》的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PWA(Progressive Web
- 下一篇: ALTER语句