復(fù)制粘貼代碼真的有問題嗎?
當(dāng)你編程的時(shí)候,復(fù)制和粘貼—將你現(xiàn)有的代碼進(jìn)行再利用,這是不必再重復(fù)編碼的***做法。這是一個(gè)技術(shù)債務(wù)的***例子:偷懶,草率和目光短淺,這會讓維護(hù)代碼的長期成本增加。
但它同時(shí)也很自然,找一些已經(jīng)在運(yùn)行的代碼,跟你所需要的非常像,復(fù)制,粘貼,并用它作為起點(diǎn)。幾乎每個(gè)人都這么干過。因?yàn)橛行r(shí)候,復(fù)制過來的代碼不僅僅是方便,而且就算我們所需要的
首先要清楚我講得復(fù)制粘貼的意思。不是說從互聯(lián)網(wǎng)上復(fù)制代碼,我指的是程序員重用代碼的捷徑–當(dāng)他們遇到的問題與他們之前在另外一個(gè)系統(tǒng)中遇到的問題類似的時(shí)候,他們開始用現(xiàn)有的代碼副本,并加以改變。
在開發(fā)和設(shè)計(jì)階段的早期,復(fù)制和粘貼并沒有什么優(yōu)勢。代碼和設(shè)計(jì)仍可塑的,這時(shí)系統(tǒng)需要做的是建立一套正確的抽象。這個(gè)時(shí)候沒有什么好復(fù)制的。當(dāng)在你開發(fā)的后期時(shí),你已經(jīng)有大量的代碼,你需要維護(hù)龐大的系統(tǒng),復(fù)制和粘貼就變得更加復(fù)雜。
為什么要復(fù)制粘貼?
程序員復(fù)制粘貼,因?yàn)檫@樣可以節(jié)省時(shí)間。首先,你必須站在一個(gè)起點(diǎn),你要知道你的代碼要做什么事?你所要做的就是那里需要增加,哪里需要修改。你就可以專注于理解不同點(diǎn)。這時(shí)你變得更加自由–你可以清理你不需要的代碼。這一切都很主要。因?yàn)槟憧赡懿恢滥阈枰A舻模阈枰淖兊模钡侥氵M(jìn)入更深的層面。
復(fù)制和粘貼同樣可以降低風(fēng)險(xiǎn)。如果你改變和擴(kuò)展現(xiàn)有的代碼,至少它運(yùn)行了一段時(shí)間,通常是更安全的,并且成本較低。
如果你正在構(gòu)建一個(gè)新的 B2B 客戶界面,你會使用新的嗎?通常會采用現(xiàn)有的接口,作為新的起點(diǎn)。然后看看那里需要改變,到年底的時(shí)候,你就有了 2 個(gè)接口,但通常需要一段的時(shí)間來理解這個(gè)代碼是什么?
找到一個(gè)共同的設(shè)計(jì),正確的抽象和變化,以支持不同的現(xiàn)實(shí)和異常處理。你最終的代碼可能變得無法理解,難以維護(hù),直到不得不改變—因?yàn)樵瓉淼脑O(shè)計(jì)沒有預(yù)料到不同情況下的異常和擴(kuò)展,重構(gòu)只能到此結(jié)束,你需要一個(gè)全的設(shè)計(jì)和實(shí)施。
改變現(xiàn)有的代碼,進(jìn)行重構(gòu)和擴(kuò)展,將會讓你目前的工作增加風(fēng)險(xiǎn)和成本,你不能為了適應(yīng)網(wǎng)上的新客戶而讓給老客戶帶來問題。你需要格外的小心,你不但要明白你將要做的事每個(gè)細(xì)節(jié)(新界面),而且要明白現(xiàn)有界面的每個(gè)細(xì)節(jié),它的行為和假設(shè)。
如果你認(rèn)為這些改變都能被自動化測試工具捕捉到,那你就很天真了—假設(shè)你已經(jīng)有良好的自動化測試工具,你需要整合現(xiàn)有的接口測試,這可能需要花費(fèi)數(shù)周甚至數(shù)月的時(shí)間。讓那些客戶花費(fèi)這么多的時(shí)間適應(yīng)新界面,他們會不滿意,因?yàn)樗麄兌家呀?jīng)習(xí)慣了。
現(xiàn)在就復(fù)制粘貼,如果需要的話,過些日子要制定計(jì)劃來重構(gòu)和重新設(shè)計(jì),是明智的選擇。
什么時(shí)候該復(fù)制粘貼?
1. 分叉 — 試探性的原因,如適應(yīng)不同的平臺或者硬件
2. 模板 — 一些語言不支持某些庫或者共享函數(shù),這時(shí)有必要復(fù)制粘貼代碼。
3. 定制 — 臨時(shí)的解決辦法,只要是臨時(shí)的。
4. 微軟克隆的做法 — 一個(gè)小組的代碼給另外小組用。這時(shí)開源的通常做法,需要擴(kuò)展來解決專有問題。
什么時(shí)候復(fù)制粘貼會變成問題?
什么時(shí)候復(fù)制粘貼會成為問題,有幾個(gè)主要因素。
首先,你對你復(fù)制的代碼理解程度是多少,你穩(wěn)定程度如何,有多少潛在的 bug。你總不想繼承別人的問題吧。
還要知道這個(gè)代碼已經(jīng)拷貝了多少份?根據(jù)“三則重構(gòu)”(three strikes and you refactor)原則。因?yàn)槟銖?fù)制了什么,并且加上改變,就帶來維護(hù)上的問題。這個(gè)維護(hù)的困難就是如何理清問題,因?yàn)?2 個(gè)版本不足以理解哪些是共有的,哪些是特殊的。
越多次的拷貝,越多的維護(hù)上的問題。多個(gè)版本的更改和修正增加了維護(hù)的風(fēng)險(xiǎn)和成本。保持代碼的同步,需要在多個(gè)系統(tǒng)中改變它。
雖然一些工具可以幫助你來尋找復(fù)制和粘貼的代碼。隨著時(shí)間的推移,不同的程序員尋找復(fù)制的副本代碼變得更加艱難。有些程序員建議離職時(shí)做好復(fù)制標(biāo)記,以便后來的程序員維護(hù)。
Copy and Paste programming doesn’t come for free. But like a lot of other ideas and practices in software development, copy and paste programming isn’t right or wrong. It’s a tool that can be used properly, or abused.
復(fù)制粘貼不是免費(fèi)的。和軟件開發(fā)中的其它想法和實(shí)踐一樣,它沒用對錯(cuò)之分。它是一個(gè)工具,你可以善用,也可以濫用。
Brian Foote, one of the people who first recognized the Big Ball of Mud problem in software design, says that copy and paste programming is the one form of reuse that programmers actually follow, because it works.
It’s important to recognize this. If we’re going to Copy and Paste, let’s do a responsible job of it.
意識到這些是非常重要的,假設(shè)我們有復(fù)制粘貼,我們必須為我們的工作負(fù)責(zé)。