復制粘貼代碼真的有問題嗎?
當你編程的時候,復制和粘貼—將你現有的代碼進行再利用,這是不必再重復編碼的最佳做法。這是一個技術債務的最佳例子:偷懶,草率和目光短淺,這會讓維護代碼的長期成本增加。
但它同時也很自然,找一些已經在運行的代碼,跟你所需要的非常像,復制,粘貼,并用它作為起點。幾乎每個人都這么干過。因為有些時候,復制過來的代碼不僅僅是方便,而且就算我們所需要的。
首先要清楚我講得復制粘貼的意思。不是說從互聯網上復制代碼,我指的是程序員重用代碼的捷徑–當他們遇到的問題與他們之前在另外一個系統中遇到的問題類似的時候,他們開始用現有的代碼副本,并加以改變。
在開發和設計階段的早期,復制和粘貼并沒有什么優勢。代碼和設計仍可塑的,這時系統需要做的是建立一套正確的抽象。這個時候沒有什么好復制的。當在你開發的后期時,你已經有大量的代碼,你需要維護龐大的系統,復制和粘貼就變得更加復雜。
為什么要復制粘貼?
程序員復制粘貼,因為這樣可以節省時間。首先,你必須站在一個起點,你要知道你的代碼要做什么事?你所要做的就是那里需要增加,哪里需要修改。你就可以專注于理解不同點。這時你變得更加自由–你可以清理你不需要的代碼。這一切都很主要。因為你可能不知道你需要保留的,你需要改變的,直到你進入更深的層面。
復制和粘貼同樣可以降低風險。如果你改變和擴展現有的代碼,至少它運行了一段時間,通常是更安全的,并且成本較低。
如果你正在構建一個新的 B2B 客戶界面,你會使用新的嗎?通常會采用現有的接口,作為新的起點。然后看看那里需要改變,到年底的時候,你就有了 2 個接口,但通常需要一段的時間來理解這個代碼是什么?
找到一個共同的設計,正確的抽象和變化,以支持不同的現實和異常處理。你最終的代碼可能變得無法理解,難以維護,直到不得不改變—因為原來的設計沒有預料到不同情況下的異常和擴展,重構只能到此結束,你需要一個全的設計和實施。
改變現有的代碼,進行重構和擴展,將會讓你目前的工作增加風險和成本,你不能為了適應網上的新客戶而讓給老客戶帶來問題。你需要格外的小心,你不但要明白你將要做的事每個細節(新界面),而且要明白現有界面的每個細節,它的行為和假設。
如果你認為這些改變都能被自動化測試工具捕捉到,那你就很天真了—假設你已經有良好的自動化測試工具,你需要整合現有的接口測試,這可能需要花費數周甚至數月的時間。讓那些客戶花費這么多的時間適應新界面,他們會不滿意,因為他們都已經習慣了。
現在就復制粘貼,如果需要的話,過些日子要制定計劃來重構和重新設計,是明智的選擇。
什么時候該復制粘貼?
1. 分叉 — 試探性的原因,如適應不同的平臺或者硬件
2. 模板 — 一些語言不支持某些庫或者共享函數,這時有必要復制粘貼代碼。
3. 定制 — 臨時的解決辦法,只要是臨時的。
4. 微軟克隆的做法 — 一個小組的代碼給另外小組用。這時開源的通常做法,需要擴展來解決專有問題。
什么時候復制粘貼會變成問題?
什么時候復制粘貼會成為問題,有幾個主要因素。
首先,你對你復制的代碼理解程度是多少,你穩定程度如何,有多少潛在的 bug。你總不想繼承別人的問題吧。
還要知道這個代碼已經拷貝了多少份?根據“三則重構”(three strikes and you refactor)原則。因為你復制了什么,并且加上改變,就帶來維護上的問題。這個維護的困難就是如何理清問題,因為 2 個版本不足以理解哪些是共有的,哪些是特殊的。
越多次的拷貝,越多的維護上的問題。多個版本的更改和修正增加了維護的風險和成本。保持代碼的同步,需要在多個系統中改變它。
雖然一些工具可以幫助你來尋找復制和粘貼的代碼。隨著時間的推移,不同的程序員尋找復制的副本代碼變得更加艱難。有些程序員建議離職時做好復制標記,以便后來的程序員維護。
復制粘貼不是免費的。像軟件里面的其它做法一樣,它不是正確的或者是錯誤的,而是一個工具,你可以善用,也可以濫用。
意識到這些是非常重要的,假設我們有復制粘貼,我們必須為我們的工作負責。
來自: www.daidata.com