[轉錄] [轉錄][轉錄][轉錄] 重複的程式碼 (Duplicate …
標題[轉錄] [轉錄][轉錄][轉錄] 重複的程式碼 (Duplicate …
時間北極光 (2009/11/22 Sun 18:11:15)
※ 本文轉錄自 [mLog] 看板 發信人: KPXX.bbs@ptt2.cc (KPXX.bbs@ptt2.cc) 看板: mLog 標 題: [轉錄][轉錄][轉錄] 重複的程式碼 (Duplicate … 發信站: Group.NCTU.edu.tw (2009/11/21 Sat 16:57:38) 轉信站: Group.NCTU!grouppost!Group.NCTU!ptt2.cc!KPXX.bbs 作者: pangfeng (P老師) 看板: pangfeng 標題: [轉錄][轉錄][轉錄] 重複的程式碼 (Duplicate Code) 時間: Sat Nov 21 11:08:31 2009 ※ [本文轉錄自 lmr3796 看板] 作者: lmr3796 (我的本名不叫馬瑞喔) 看板: lmr3796 標題: [轉錄][轉錄] 重複的程式碼 (Duplicate Code) 時間: Thu Nov 19 00:07:36 2009 ※ [本文轉錄自某隱形看板] 發信人: hrs113355.bbs@sony.tfcis.org (建中電研100級學弟), 看板: (某隱形看板) 標 題: [轉錄] 重複的程式碼 (Duplicate Code) 發信站: 索尼小站 (Wed Nov 18 17:22:39 2009) 轉信站: ptt2!Group.NCTU!grouppost!Group.NCTU!SonyBBS ※ 本文轉錄自 [YiPo] 看板 作者: YiPo (享受過程) 看板: YiPo 標題: [轉載]重複的程式碼 (Duplicate Code) 時間: 2009/11/17 Tue 19:09:06 原始連結:http://tzuchieh.miroko.tw/sofeeng/Duplicate_Code.htm --- 關於程式碼重複最著名的單詞是 Kent Beck 的 Once And Only Once,也就是說軟體操 作的任何一個片斷--不管是一個演算法、一個常數集合、用於閱讀的文件或者其他東西… 應當只出現一次。 程式碼重複出現至少會導致以下問題: .其中一個版本會過期 .程式碼的責任會四處分散,導致程式碼難以理解。 .當你修改程式碼時,需要重複修改很多地方,不小心就會遺漏。 .你無法很好地進行性能優化 我以前的一位老闆曾經跟我誇耀過他手下編程的能力:「他只要把一份模版程式碼拷貝 過去,稍加修改,就可以完成一個新的模組。」在我驚訝這位程式員思路清晰的同時,也 懷疑這樣的程序,還有誰能維護?我想可能連他自己也無法做到。 重複程式碼的產生來自各式各樣的原因,上面就是一個例子,我經常看到程式員把幾行 或一整段程式碼從這複製到那,然後稍加修改,就變成了一份新的程式碼。這裡的原因是 程式員可以通過極少的努力,就完成程式碼重複使用,但是我們可以來看看 David Hooker 提出的 7 個軟體開發原則: 1.存在的理由 (The Reason) 一個軟體系統存在的理由就是:為它的使用者提供價值。你所有的決定都取決於這一點 。在指定一個系統需求、在寫下一段系統功能、在決定硬體平台和開發過程之前,問你自 己一個問題:「這樣做會為系統增加價值嗎?」如果答案是 Yes,便做;如果答案是 No ,不做。這個原則是其他原則的原則。 2.能簡單就簡單、能愚蠢就愚蠢! (KISS--Keep It Simple, Stupid) 軟體設計不是一個輕描淡寫的過程。在做任何設計時,你必須考慮很多因素。所有設計 應當盡可能簡單,但也不要再比這個簡單了。這樣產生的系統才是可以理解並容易維護的 。這並不是說一些有意義的特性,為了簡單性也要被拋棄。確實很多更優雅的設計往往更 簡單,但簡單並不意味著 Quick And Dirty。事實上,簡單是通過許多思考和一次又一次 的反覆修改才達到的。這些努力的回報就是更容易維護,程式碼錯誤更少。(看看是否違 反) 3.保持遠見 (Maintain The Vision) 清晰的遠見是軟體專案成功的基礎。沒有這樣的遠見,專案開發最後就變成天天為一個 不好的設計做補丁。 Brooks 曾說:「概念的完整性是系統設計中最重要的問題。」 Stroustrup 也說:「有一個乾淨的內部結構是構建一個可理解、可辨識、可維護、可測 試系統的基礎。」 Booch 則總結道:「只有當你對系統的體系有一個清晰的感覺,才可能去發現通用的抽象 和機制。開發這種通用性最終導致系統更簡單,因此更小、更可靠,如果你不斷地複製、 粘貼、修改程式碼,最終你將陷入一個大泥淖,永遠不可能對系統有一個清晰的認識。」 4.你所製造的,別人會消費 (What You Produce They Consume) 軟體系統不是在真空中使用的。其他人會使用、維護、文件化你的系統。這依賴於對你 系統的理解。所以,你設計、實現的東西應當能夠讓別人理解。要記住,你寫的程式碼並 非只給計算機看,要時時記住程式碼還要給人看。如果到處氾濫似是而非的程式碼,別人 如何辨別這些程式碼的相似和不同,如何去理解這些程式碼之間具有何種關係? 5.對將來開放 (Build For Today Design For Tomorrow) 一個成功的軟體有很長的生命期。你必須使軟體能夠適應變化。所以,一開始就別將軟 體設計到死角上去。總是問一下自己「如果這樣,那麼會…?」這個問題,你要考慮到各 樣的可能性,而不光是圖省事。複製、粘貼一下即可。 6.為重複使用做好計畫 軟體樣式是重複使用計畫的一種。不斷重複的程式碼顯然不是這樣的計畫。 7.思考! 在採取任何動作之前,先做個清晰、完整的考慮,這樣才能產生更好的結果。如果你考 慮了,但還是產生錯誤的結果,那麼這種努力也是值得的。在你學習或研究類似的問題時 ,更容易理解和掌握。 這些原則告訴我們輕鬆地複製、粘貼和修改程式碼不可能產生好的,也就是容易理解、 維護、重複使用的程式碼。但請不要走極端。 我一直認為,一個好的軟體系統是各種因素權衡的結果,也就是你如何把握一個度的問 題。產生重複程式碼的另一個主要原因就是做得太多,XP 有一個基本原則叫做 You Are'nt Gonna Need It,它是說「只實現你真正需要的東西,別去實現你預期需要的東西 。」如果去實現你現在認為將來需要的東西,不一定就是以後真正會需要的東西。你處於 現在的環境中可能無法理解你要實現的東西究竟是什麼樣子。你會浪費大量的時間去構造 這樣不知道是否必須的可能性。同時,當你真正實現的時侯就可能產生重複程式碼。 Martin Fowler 在他的 Refactoring 一書中有很多用來處程式碼重複,包括: 1.同一個類別的兩個方法中有相同的運算式,使用 Extract Method,然後大家都呼叫該 Method。 2.兩個兄弟子類別之間有相同的運算式,那麼在這兩個子類中使用 Extract Method,接 著使用 Pull Up Field,移到共同的超類別。 3.如果結構相似而並非完全相同,用 Extract Method 把相同部分和不同部分分開。然後 使用 Form Template Method。 4.如果使用不同的演算法做相同事情,那麼使用 Substitute Algorithm。 5.如果在兩個不相干的類別中有重複程式碼,那麼在一個類別中使用 Extract Class,然 後在其他類別中使用該 Class 物件作為元素。 重複程式碼需要 Refactoring 是毫無疑問的,關鍵在於,你如何找到重複程式碼,如 果所有重複的程式碼都是死板的重複,那是很容易解決的。但是軟體發展的複雜因素往往 使重複程式碼表現為相似性而並非完全重複。這些相似性或許並非一眼就能看出來,而需 要經過其他的 Refactory 步驟和一定的先見之明。 另一個問題就是排除重複程式碼的粒度。只有大段的重複程式碼有價值排除,還是即使 小小的兩、三句重複就應該排除。重複程式碼排除的基本方法是建立自己單獨的方法,如 果系統中許許多多的方法都很小,方法之間相互呼叫的成本就會增加,它同時也增加了維 護的成本。 但是,付出這些成本是值得的。方法是覆蓋的最小粒度,能夠被覆蓋的粒度越小,能夠 重初使用的範圍就越廣。但在這個問題上也不要走極端,只有當一個方法實現一個具體可 用的 Intent Revealing Name (揭示意圖的名稱) 命名時,一段程式碼才值得稱為一個方 法,而不是考慮其程式碼的多寡。 (下略…) --- 我猜這篇文章是從英文翻成簡中再轉繁體的。 有把它稍微修飾一下了,雖然還是不順… -- ┼─╮ ╭───────╮ │ │台南一中.索尼小站∣sony.TFcis.org│ │ ╰─────────╯ ╰─┼ by YiPo from 194129.ntpu.edu.tw (台北大學) → Nagari 推:借轉 >\\\< 1117 19:15 φ Nagari 轉:到 [某隱藏] 看板,于 2009/11/17 Tue 19:15:45 → PG 推:借轉 1117 20:39 φ PG 轉:到 [PG] 看板,于 2009/11/17 Tue 20:39:10 → hrs113355 推:借轉 1118 17:22 φ hrs113355 轉:從 [YiPo] 看板,于 2009/11/18 Wed 17:22:39 → stimim:借轉 推 11/18 18:01 ※ stimim:轉錄至看板 Stimim 11/18 18:01 -- ※ 發信站: 批踢踢兔(ptt2.cc) ◆ From: 118.166.218.187 → r44 :借轉~ 推 11/19 13:52 ※ r44:轉錄至看板 Ray44 11/19 13:52 -- ※ 發信站: 批踢踢兔(ptt2.cc) ◆ From: 140.112.28.27 -- ╭═ Origin ─═ 北極光 aurora.twbbs.org κλμ ─╣ ╚─ Author ═─ 220-136-157-206.dynamic.h △ Tony1223:抽空看了概要論述 , 經典好文~ **|11/22 18:11**/wnpu
Comments
No approved comments yet.