軟件配置管理程序員
第1章 軟件配置管理概念與目標算法
(1) 定義(多個):數據庫
l 軟件配置管理是指一套管理軟件開發和維護過程當中所產生的各類中間軟件產品的方法和規則,它是控制軟件系統演變的學科。編程
l 軟件配置管理是一組針對軟件產品的追蹤和控制活動,它貫穿於項目生命週期的始終,並表明着軟件產品接受各項評審。數組
l 軟件配置管理是貫穿於整個軟件過程當中的保護性活動,它被設計用來:(1) 標識變化;(2) 控制變化;(3) 保證變化被適當的發現;(4) 向其餘可能有興趣的人員報告變化。安全
(2) 目標:服務器
l 軟件配置管理的各項工做是有計劃進行的。網絡
l 被選擇的項目產品獲得識別,控制而且能夠被相關人員獲取。session
l 已識別出的項目產品的更改獲得控制。架構
l 使相關組別和我的及時瞭解軟件基準的狀態和內容。
(3) 目的:使錯誤降爲最小並最有效地提升生產效率。
最終軟件版本產品是文檔、程序和數據的集合,是軟件生產商交付給客戶的軟件產品,是用戶可以直接使用的軟件產品。
軟件配置是一個軟件產品在生存期各個階段的不一樣形式(記錄特定信息的不一樣媒體)和不一樣版本的程序、文檔及相關數據的集合,或者說是配置項的集合。
l 軟件配置是一個集合,該集合中的每個元素稱爲該軟件產品軟件配置中的一個配置項。
l 軟件配置項是軟件配置管理的對象,一個軟件配置項是項目中一個特定的、可文檔化的工做產品集。
(1) 概念
l 基線是指一個(或一組)配置項在項目生命週期的不一樣時間點上經過正式評審而進入正式受控的一種狀態。
l 基線是已經正式經過複審和批准的某規約和產品。
l 通過正式評審和審計,並被批准後的階段性軟件工做產品,稱爲軟件配置管理中的一根基線。
(2) 分類
l 功能基線:
l 指派基線:又稱爲分配基線,指在軟件需求分析階段結束時,通過正式評審和批准的軟件需求的規格說明,指派基線是最初批准的指派配置標識。
l 產品基線:指在軟件組裝與系統測試階段結束時,通過正式評審的批准的有關所開發的軟件產品的所有配置項的規格說明,產品基線是最初批准的產品配置標識。
l 負責管理軟件配置項變動的組織。
l 具體責任以下:
第2章 軟件配置管理角色與過程
(1) 項目經理(Project Manager,PM)
l 項目經理是整個軟件研發活動的負責人,他根據軟件配置控制委員會的建議批准配置管理的各項活動並控制它們的進程。
l 其具體職責爲如下幾項:
(2) 配置控制委員會(Configuration Control Board,CCB)
l 負責指導和控制配置管理的各項具體活動的進行,爲項目經理的決策提供建議。
l 其具體職責爲如下幾項:
(3) 配置管理員(Configuration Management Officer,CMO)
l 根據配置管理計劃執行各項管理任務,按期向CCB提交報告並列席CCB的例會。
l 其具體職責包括如下幾項:
(4) 系統集成員(System Integration Officer,SIO)
l 負責生成和管理項目的內部和外部發布版本。
l 其具體職責爲如下幾項:
(5) 開發人員(Developer,DEV)
l 根據組織內肯定的軟件配置管理計劃和相關規定,按照軟件配置管理工具的使用模型來完成開發任務。
(1) 計劃階段
l CCB根據項目的開發計劃肯定各個里程碑和開發策略;
l CMO根據CCB的規劃,制定詳細的配置管理計劃,交CCB審覈;
l CCB審覈配置管理計劃後交項目經理批准,發佈實施。
(2) 開發和維護階段:
在這一階段中,軟件配置管理活動主要分爲三個層面:
l 主要由CMO完成的管理和維護工做;
l 由SIO和DEV具體執行軟件配置管理策略;
l 變動流程。
核心流程爲:
l CCB設定研發活動的初始基線;
l CMO根據軟件配置管理規劃設立配置庫和工做空間,爲執行軟件配置管理作好準備;
l 開發人員按照統一的軟件配置管理策略,根據得到的受權的資源進行項目的研發工做;
l SIO按照項目的進度集成組內開發人員的工做成果,並構建系統,推動版本的演進;
l CCB根據項目的進展狀況,審覈各類變動請求,並適時的劃定新的基線,保證開發和維護工做有序的進行。
(1) 制定配置管理計劃
l 步驟:
l 配置管理計劃主要內容:
(2) 識別和標誌配置項
步驟:
l 將軟件項目中須要進行控制的工做產品定義爲配置項(SCI)。
配置項分爲:
l 爲每個配置項分配惟一的標誌。
注意:配置項標識並非指程序/文檔文件的文件名,而是該程序/文檔做爲一個配置項的標識。
l 創建配置項間的對應關係。
可以使用某種模塊互聯語言(Module Interconnection language, MIL)來描述配置項之間的關係。
(3) 搭建配置管理環境
l 配置管理環境是用於進行軟件配置管理的系統環境,其中最重要的是配置管理庫,簡稱配置庫。
l 配置庫存儲配置項 (SCI)、修改請求、變化記錄等,並提供對庫中所存儲文件的版本控制。
l 爲不一樣的開發人員分配不一樣的訪問配置庫的權限。
l 通常需採用配置管理工具來創建配置庫。
l 配置庫中文件的更改是受控的。
(4) 配置項的版本控制
l 當開發人員要使用配置庫中的一個文件時,將文件檢出到本身的工做目錄裏,此時該文件在配置庫中被自動鎖定,開發人員處理完該文件後,再將文件檢入到配置庫中(需有修改權限),一個新的版本號自動與文件相關聯,文件解鎖。
l 配置庫的檢入檢出和版本控制機制解決了軟件開發中的兩個重要問題:
l 軟件產品不一樣類型的版本的特性和所包含的配置項應被明確描述,保證可根據要求將配置項組合生成適用於不一樣應用環境的正確的軟件產品版本。
(5) 基線變動管理
l 變動請求
l 變動評估
l 變動批准/拒絕
根據評估結果對變動做出決策:
l 變動實現
(6) 配置審覈
l 配置管理活動審覈:確保全部配置管理活動符合已批准的軟件配置管理規程。
l 基線審覈:審覈基線配置項的完整性和一致性,從而保證基線配置項可被正確地構造。
(7) 配置狀態統計
l 配置管理系統的狀態統計和評估
l 配置狀態報告
(1) 數字順序型版本編號
l 普通版本編號
x.y.z,x爲主版本號,y爲特徵版本號,z爲缺陷修復版本號,如V3.10.16。
² 主版本號的增長表示提供給客戶的主要產品功能的加強。
² 特徵版本號的增長表示產品新增了一些特徵或作了一些重要修改。
² 缺陷修復版本號的增長表示在軟件產品上作了一些缺陷修復工做。
l α和β版本編號
² α測試是由公司內部的用戶在模擬實際操做環境下進行的測試。
² β測試是由軟件的多個用戶在實際使用環境下進行的測試。
(2) 屬性版本編號
l 把版本的重要屬性反映在標識中。能夠包括的屬性有:客戶名、開發語言、開發狀態、硬件平臺、生成日期等。例如:J2SDK.v.l.2.2:10/31/2000-18:00,native threads, jit-122(Jit(Just in Time):Java即時編譯技術)
l 包含的信息豐富,方便了查詢和管理,版本間的關係易於保持,但因爲太複雜,通常只用於軟件組織內部的管理。
第3章 軟件配置管理核心功能
(1) 軟件配置管理是CMM/CMMI二級的一個重要KPA。
(2) CMM/CMMI將軟件配置管理的活動分爲6個方面
l SCM過程管理
l 軟件配置標識
l 軟件配置控制
l 軟件配置狀態統計
l 軟件配置審計
l 軟件發佈管理和交付
(3) 在CMM和CMMI中,將配置管理的目的定義爲「創建和維護產品的完整性」。
(4) 配置完整性
l 產品完整性:項目提交的工做成果是「產品集合完整、子產品正確」的
l 產品集合完整:產品包含的子產品(配置項)是完整的
l 子產品正確:子產品(配置項)達到了需求要求,知足標準、規程的要求
(5) 三庫管理:三庫的概念源自CMM/CMMI,即開發庫、受控庫和產品庫。配置項在三庫之間遷移,一級比一級的控制更嚴格。
l 開發庫:存放開發過程當中須要保留的各類信息,供開發人員專用。
l 受控庫:在軟件開發的某個階段工做結束時,將工做產品存入或將有關的信息存入。
l 產品庫:在開發的軟件產品完成系統測試以後,做爲最終產品存入庫內,等待交付用戶或現場安裝。
(1) 基線管理:每一個基線都將接受配置管理的嚴格控制,對其的修改將嚴格按照變動控制要求的過程進行,在一個軟件開發階段結束時,上一個基線加上增長和修改的基線內容造成下一個基線,這就是「基線管理」的過程。
l 基線具備如下屬性:
l 創建基線的好處:
l 基線、配置、配置項的關係:
l 基線管理的步驟:
(2) 變動管理:在有效標識了配置項並進行了管理以後,如何保證它們在複雜多變的開發過程當中真正處於受控的狀態,並在任何狀況下都能迅速的恢復到任一歷史狀態就要依賴變動管理。
l 缺少有效的變動請求管理會致使的問題:
l 變動管理的流程:
l 爲了更好的指導變動範圍的影響分析,能夠經過兩種表格來幫助發現受到變動影響的內容,一種是《需求跟蹤表》,一種是《配置項依賴關係表》:
(3) 配置庫管理
l 設置版本分支:爲每一個配置項從創建開始就劃分紅3個不一樣的分支:私有分支、集成分支、公共(主幹)分支,讓它們分別對應3類工做空間:
l 配置庫的設置:決定配置庫的結構是配置管理活動的重要基礎,通常經常使用的是兩種組織形式:按配置項類型分類建庫和按任務建庫。
l 配置庫的平常工做:配置庫的平常工做是一些事務性的工做,主要保證配置庫的安全性,包括:
(4) 配置審計:配置審計的主要做用是做爲變動控制的補充手段,來確保某一變動需求已被切實實現。
l 配置審計有兩種:
² 配置項是否齊備
² 版本是否齊全
l 配置審計步驟:
(5) 配置狀態報告:根據配置項操做的記錄來向管理者報告軟件開發活動的進展狀況。
l 應着重反映當前基線配置項的狀態,以做爲對開發進度報告的參照。
l 爲了說明項目狀態對變動的狀況也應當進行報告。
l 有時,對配置庫的狀況也進行說明,例如備份次數,磁盤佔用空間等等。只要是關心的信息,都可做爲狀態報告的內容。這些信息進行有效記錄,每每能夠做爲項目度量的重要數據來源。
第4章 軟件配置管理規範與相關文檔
主要內容:
l 人員及職責
l 配置管理軟硬件資源
l 配置項計劃
l 基線計劃
l 配置庫備份計劃
主要內容:
l 基本信息
l 項目成員的操做權限
l 配置項記錄
l 基線記錄
l 配置庫備份記錄
l 配置項交付記錄
l 配置庫重要操做日誌
主要內容:
l 變動申請
l 審批變動申請
l 變動配置項
l 結束變動
主要內容:
l 各份變動請示概要:變動請求號、日期、申請人、狀態、估計工做量、實際工做量、發行版本、變動結束日期
l 基線庫狀態:庫標識、至某日預計庫內配置項數、實際配置項數
l 發行信息:發行版本、計劃發行時間、實際發行日期、說明
l 備份信息:備份日期、介質、備份存放位置
l 配置管理工具狀態
l 配置管理培訓狀態
主要內容:
l 配置項狀態統計
l 基線庫基線統計
l 變動統計
l 審計中發現的主要問題
第5章 軟件配置管理工具(5-8章)
(1) 特色
l 提供了完善的版本和配置管理功能,以及安全保護和跟蹤檢查功能
l 與 Visual Basic、Visual C++、Visual FoxPro 等開發環境以及 Microsoft Office 應用程序集成在一塊兒
l 工做原理簡單
(2) 優勢
l 可以與Visual Studio實現無縫集成,使用簡單
l 提供了歷史版本記錄、變動控制、文件比較、日誌等基本功能
(3) 缺點
l 只支持Windows平臺
l 速度慢、伸縮性差
l 老版本(VSS6.0及之前)不支持並行開發,只支持Check Out – Modify – Check In的管理方式,一個時間只容許一我的修改代碼
l 老版本(VSS6.0及之前)不支持異地開發
(1) 特色
l CVS採用客戶機/服務器體系結構,代碼、文檔的各類版本都存儲在服務器端,開發者首先從服務器上得到一份複製到本機,而後在此基礎上進行開發。
l 基於「拷貝—修改—合併」的併發控制
l 記錄不一樣版本之間的差異
(2) 優勢(與VSS相比)
l SourceSafe有的功能CVS全都有,CVS支持併發的版本管理,SourceSafe沒有併發功能。CVS服務器的功能和性能都比SourceSafe高出一籌。
l CVS服務器是用Java編寫的,能夠在任何操做系統和網絡環境下運行。CVS深受Unix和Linux 的用戶喜好。Borland公司的JBuilder提供了CVS的插件,Java程序員能夠在JBuilder集成環境中使用CVS進行版本控制。
l CVS服務器有本身專用的數據庫,文件存儲並不採用SourceSafe的「共享目錄」方式,因此不受限於局域網,信息安全性很好。
(3) 缺點(與VSS相比)
l 客戶端軟件,五花八門、參差不齊。Unix和Linux 的軟件高手能夠直接使用CVS命令行程序,而Windows用戶一般使用WinCVS。安裝和使用WinCVS顯然比SourceSafe麻煩很多,這是比較使人遺憾的。
(1) 特色(和CVS比較)
l 和CVS的類似性
l 目錄的版本化
l 更加好的文件版本管理(例如對文件拷貝,重命名的處理)
l 提交的原子性
l 元數據的版本化
l 可選的網絡層
l 對文本文件和二進制文件一致的差別比較算法
l 高效的分支(branch)和標籤(tag)操做
l 良好的可維護性
(2) 經常使用的SVN命令
命令名稱 |
功能 |
svnadmin create |
建立一個新的空的版本庫。 |
svn add |
添加文件、目錄或符號鏈。 |
svn checkout |
從版本庫取出一個工做副本。 |
svn commit |
將修改從工做副本發送到版本庫。 |
svn copy |
拷貝工做副本或版本庫中的文件或目錄。 |
svn delete |
從工做副本或版本庫中刪除一個項。 |
svn diff |
顯示兩個版本或兩個路徑的區別。 |
svn import |
將未歸入版本控制的文件或目錄樹提交到版本庫。 |
svn info |
顯示本地或遠程條目的信息。 |
svn list |
列出版本庫中的目錄內容。 |
svn lock |
鎖定版本庫中的路徑,使得其餘用戶不能向其提交修改。 |
svn log |
顯示提交日誌信息。 |
svn merge |
合併兩個版本中的內容。 |
svn mkdir |
建立歸入版本控制的新目錄。 |
svn move |
移動一個文件或目錄。 |
svn resolved |
刪除工做副本中目錄或文件的「衝突」狀態。 |
svn revert |
撤銷全部的本地修改。 |
svn status |
打印工做副本中文件和目錄的狀態。 |
svn switch |
更新工做副本至同一版本庫中另外一個URL。 |
svn unlock |
解除工做副本或URL的鎖定。 |
svn update |
更新你的工做副本。 |
l Lock-Modify-Unlock Model(加鎖-修改-解鎖)
存在問題:
l Copy-Modify-Merge Model(拷貝-修改-合併)
存在問題:
衝突是隨着拷貝-修改-合併方案的產生而帶來的問題。兩個開發者使用拷貝-修改-合併方案編輯同一個文件,而且兩人的修改發生了交疊時就發生了衝突
當衝突發生時,開發者會看到一對衝突的修改結果,一般狀況下,必須讓引發衝突的兩我的商議以後,手動選擇保留一組更改。在這裏,版本控制系統只能提示衝突的發生而沒法給出解決建議
增長開發者的交流能夠最大限度減小衝突的發生,可是不可能杜絕衝突
l 兩種方案比較與選擇
代碼味道與重構
(1) 重構概念
重構是在不改變軟件現有功能的基礎上,經過調整程序代碼改善軟件的質量、性能,使程序的設計和架構更趨合理,進而提升軟件的擴展性和維護性。
(2) 重構意義
l 重構改進軟件設計(Refactoring Improves the Design of Software)
l 重構使軟件更容易理解 (Refactoring Makes Software Easier to Understand)
l 重構幫助找到缺陷 (Refactoring Helps You Find Bugs)
l 重構提升編程速度 (Refactoring Helps You Program Faster)
(3) 重構時機
l 添加功能時重構 (Refactor When You Add Function)
l 修補錯誤時重構 (Refactor When You Need to Fix a Bug)
l 複審代碼時重構(Refactor As You Do a Code Review)
(1) 類內味道
l Measured Smells(可度量的味道)
l Unneccessary Complexity(沒必要要的複雜性)
l Duplication(重複)
l Conditional Logic(條件邏輯)
(2) 類間味道
l Data(數據)
l Inheritance(繼承)
l Responsibility(職責)
l Accommodating Change(協調變化)
l Library Classes(庫類)
(1) Long Method(過長函數)
l 描述:A method is too long.(方法太長。)
l 重構手段:
(2) Large Class(過大類)
l 描述:A class is trying to do too much, it often shows up as too many instance variables.(一個類試圖作太多的事情,一般會出現太多的實例變量。)
l 重構手段:
(3) Long Parameter List(過長參數列)
l 描述:A method needs passing too many parameters.(一個方法須要傳遞太多的參數。)
l 重構手段:
(4) Comments(過多的註釋)
l 描述:Do not write comments when it is unnecessary. When you feel the need to write a comment, first try to refactor the code so that any comment becomes superfluous.(在非必要的狀況下不要寫註釋。當你以爲須要去寫一段註釋時,你首先應該嘗試去重構代碼,這將使任何註釋都變得是多餘的。)
l 重構手段:
(5) Speculative Generality(誇誇其談的將來性)
l 描述:If a machinery was being used, it would be worth it. But if it is not, it is not. The machinery just gets in the way, so get rid of it.(若是一個裝置【一個設計或實現方案】會被用到,那就值得去作;若是用不到,就不值得。用不到的裝置會成爲攔路石,所以須要將它搬移。)
l 重構手段:
(6) Duplicated Code(重複代碼)
l 描述:Same code structure happens in more than one place.(在一個以上的地方發現類似的代碼結構。)
l 類型:
l 重構手段:
(7) Alternative Classes with Different Interfaces(殊途同歸的類)
l 描述:Classes are doing similar things but with different signatures. (不一樣的類作相同的事情,卻擁有不一樣的簽名,主要是指方法簽名不一樣。)
l 重構手段:
(8) Switch Statements(Switch驚悚現身)
l 描述:Switch statements often lead to duplication. Most times you see a switch statement which you should consider as polymorphism.(Switch語句一般會致使代碼重複。大多數時候,一看到Switch語句你應該考慮使用多態來替換。)
l 重構手段:
(9) Primitive Obsession(基本類型偏執)
l 描述:Primitive types are overused in software. Small classes should be used in place of primitive types in some situations.(在軟件中,基本類型被過分使用。在某些場合下,應該使用一些小的類來代替這些基本類型。)
l 重構手段:
(10) Data Class(純稚的數據類)
l 描述:These are classes that have fields, getting and setting methods for the fields, and nothing else. Such classes are dumb data holders and are almost certainly being manipulated in far too much detail by other classes.(這些類擁有一些字段【成員變量】,並提供了對應的Getter和Setter方法,除此之外一無全部。這些類只是一些不會說話的數據容器, 並且它們一定會被其餘類過度瑣細地操做。)
l 重構手段:
(11) Data Clumps(數據泥團)
l 描述:Some data items together in lots of places: fields in a couple of classes, parameters in many method signatures.(一些數據項同時出如今多個地方,例如一對類中的值域【成員變量】,多個方法簽名中的參數等。)
l 重構手段:
(12) Temporary Field(使人迷惑的暫時值域)
l 描述:Sometimes you see an object in which an instance variable is set only in certain circumstances. Such code is difficult to understand, because you expect an object to need all of its variables.(有時候你會看到一個對象的實例變量僅爲某些特定的場合而設。這樣的代碼將致使難以理解,由於你指望一個對象須要它全部的變量。)
l 重構手段:
(13) Refused Bequest(被拒絕的遺贈)
l 描述:Subclasses get to inherit the methods and data of their parents, but they just use a few of them.(子類繼承父類的方法和數據,可是它們只須要使用其中的一部分。)
l 重構手段:
(14) Inappropriate Intimacy(狎暱關係)
l 描述:Sometimes classes become far too intimate and spend too much time delving in each others’ private parts.(有時候,類之間的關係變得很是親密,而且須要花費大量時間來探究彼此之間的私有成分。)
l 重構手段:
(15) Lazy Class(冗贅類)
l 描述:Each class you create costs money to maintain and understand. A class that is not doing enough to pay for itself should be eliminated.(你所建立的每一個類都須要花錢去維護和理解。一個類若是不值其身價,它就應該消失。)
l 重構手段:
(16) Feature Envy(依戀情節)
l 描述:The whole point of objects is that they are a technique to package data with the processes used on that data. A Feature Envy is a method that seems more interested in a class other than the one it actually is in.(對象的所有要點在於它是一種封裝數據以及施加於這些數據的處理過程的技術。依戀情節是指一個方法對別的類的興趣高過它自己所在的類。)
l 重構手段:
(17) Message Chains(過分耦合的消息鏈)
l 描述:You see message chains when a client asks one object for another object, which the client then asks for yet another object, which the client then asks for yet another object, and so on. Navigating in this way means that the client is coupled to the structure of the navigation. Any change to the intermediate relationships causes the client to have to change.(你看到的消息鏈是這樣的:當一個客戶端向一個對象請求另外一個對象,而後再向後者請求另外一個對象,而後再請求另外一個對象,如此反覆。這種方式的導航意味着客戶端將與整個導航結構緊密耦合在一塊兒。一旦對象之間的聯繫發生任何改變,將致使客戶端也不得不作出相應的修改。)
l 重構手段:
(18) Middle Man(中間轉手人)
l 描述:You look at a class’s interface and find that half the methods are delegating to this other class. It may mean problems.(當你審查一個類的接口時發現其中有一半的方法都委託給了其餘類,這也許就意味着存在問題了。)
l 重構手段:
(19) Divergent Change(發散式變化)
l 描述:Divergent change occurs when one class is commonly changed in different ways for different reasons.(若是某個類常常由於不一樣的緣由在不一樣的方向上發生變化就會產生髮散式變化。也就是說,一個類擁有多個引發它發生變化的緣由。)
l 重構手段:
(20) Shotgun Surgery(霰彈式修改)
l 描述:Shotgun surgery is similar to divergent change but is the opposite. Every time you make a kind of change, you have to make a lot of little changes to a lot of different classes.(霰彈式修改與發散式變化相似,卻又存在相反的一面。每次進行某種修改時,你都必須對多個不一樣的類進行不少對應的小修改。)
l 重構手段:
(21) Parallel Inheritance Hierarchies(平行繼承體系)
l 描述:Parallel inheritance hierarchies is really a special case of shotgun surgery. In this case, every time you make a subclass of one class, you also have to make a subclass of another. You can recognize this smell because the prefixes of the class names in one hierarchy are the same as the prefixes in another hierarchy.(平行繼承體系是霰彈式修改的一個特例。在這種狀況下,當你爲某個類增長一個子類時,你不得不爲另外一個類也相應增長一個子類。你也許可以識別到這種味道,由於一個繼承體系中類的類名前綴與另外一個體系中的類名前綴同樣。)
l 重構手段:
(22) Incomplete Library Class(不完善的程序庫類)
l 描述:Library classes should be used carefully, especially we do not know whether a library is completed.(庫類在使用時必定要當心,特別是在咱們不知道一個庫是否完整時。
l 重構手段:
(1) 從新組織函數(Composing Methods)
l Extract Method(提煉函數)
l Inline Method(內聯函數)
l Inline Temp(內聯臨時變量)
l Replace Temp with Query(以查詢取代臨時變量)
l Introduce Explaining Variable(引入解釋性變量)
l 你有一個複雜的表達式。
l 將該複雜表達式(或其中一部分)的結果放進一個臨時變量,以此變量名稱來解釋表達式用途。
l Split Temporary Variable(分解臨時變量)
l Remove Assignments to Parameters(移除對參數的賦值)
l Replace Method with Method Object(以函數對象取代函數)
l Substitute Algorithm(替換算法)
(2) 在對象之間搬移特性(Moving Features Between Objects)
l Move Method(搬移函數)
l Move Field(搬移字段)
l Extract Class(提煉類)
l Inline Class(將類內聯化)
l Hide Delegate(隱藏「委託關係」)
l Remove Middle Man(移除中間人)
l Introduce Foreign Method(引入外加函數)
l Introduce Local Extension(引入本地擴展)
(3) 從新組織數據(Organizing Data)
l Self Encapsulate Field(自封裝字段)
l Replace Data Value with Object(以對象取代數據值)
l Change Value to Reference(將值對象改成引用對象)
l Change Reference to Value(將引用對象改成值對象)
l Replace Array with Object(以對象取代數組)
l Duplicate Observed Data(複製「被監視數據」)
l Change Unidirectional Association to Bidirectional(將單向關聯改成雙向關聯)
l Change Bidirectional Association to Unidirectional(將雙向關聯改成單向關聯)
l Replace Magic Number with Symbolic Constant(以字面常量取代魔法數)
l Encapsulate Field(封裝字段)
l Encapsulate Collection(封裝集合)
l Replace Record with Data Class(以數據類取代記錄)
實例:將傳統的由JDBC返回的結果記錄,替換成一個簡單的值對象。
l Replace Type Code with Class(以類取代類型碼)
l Replace Type Code with Subclasses(以子類取代類型碼)
l Replace Type Code with State/Strategy(以State/Strategy取代類型碼)
l Replace Subclass with Fields(以字段取代子類)
(4) 簡化條件表達式(Simplifying Conditional Expressions)
l Decompose Conditional(分解條件表達式)
l Consolidate Conditional Expression(合併條件表達式)
l Consolidate Duplicate Conditional Fragments(合併重複的條件片斷)
l Remove Control Flag(移除控制標記)
l Replace Nested Conditional with Guard Clauses(以衛語句取代嵌套條件表達式)
l Replace Conditional with Polymorphism(以多態取代條件表達式)
l Introduce Null Object(引入Null對象)
l Introduce Assertion(引入斷言)
(5) 簡化函數調用(Making Method Calls Simpler)
l Rename Method(函數更名)
l Add Parameter(添加參數)
l Remove Parameter(移除參數)
l Separate Query from Modifier(將查詢函數和修改函數分離)
l Parameterize Method(令函數攜帶參數)
l Replace Parameter with Explicit Methods(以明確函數取代參數)
l Preserve Whole Object(保持對象完整)
l Replace Parameter with Method(以函數取代參數)
l Introduce Parameter Object(引入參數對象)
l Remove Setting Method(移除設值函數)
l Hide Method(隱藏函數)
l Replace Constructor with Factory Method(以工廠函數取代構造函數)
l Encapsulate Downcast(封裝向下轉型)
l Replace Error Code with Exception(以異常取代錯誤碼)
l Replace Exception with Test(以測試取代異常)
(6) 處理歸納關係(Dealing with Generalization)
l Pull Up Field(字段上移)
l Pull Up Method(函數上移)
l Pull Up Constructor Body(構造函數本體上移)
l Push Down Method(函數下移)
l Push Down Field(字段下移)
l Extract Subclass(提煉子類)
l Extract Superclass(提煉超類)
l Extract Interface(提煉接口)
l Collapse Hierarchy(摺疊繼承體系)
l Form Template Method(塑造模板函數)
l Replace Inheritance with Delegation(以委託取代繼承)
l Replace Delegation with Inheritance(以繼承取代委託)
(7) 大型重構(Big Refactorings)
l Tease Apart Inheritance(梳理並分解繼承體系)
l Convert Procedural Design to Objects(將過程化設計轉化爲對象設計)
l Separate Domain from Presentation(將領域和表述/顯示分離)
l Extract Hierarchy (提煉繼承體系)