基于構(gòu)件的軟件版本管理系統(tǒng)研究
1 引言 配置管理系統(tǒng)[ 3, 9]是軟件開發(fā)的關(guān)鍵支撐工具之一,是一種管理軟件開發(fā)和維護過程以及其中各中間軟件產(chǎn)品的系統(tǒng),是ISO與CMM質(zhì)量保證體系的核心支持工具。配置管理研究怎樣在不同時刻標識軟件系統(tǒng)的配置,以便系統(tǒng)化地控制配置的改變,并在整個軟件系統(tǒng)的生命周期內(nèi)維護配置的完整性和可追蹤性[ 1] .其中,版本管理是基礎(chǔ)和核心。傳統(tǒng)的版本管理系統(tǒng)以文件作為管理的基本粒度。版本管理系統(tǒng)記錄、維護每個文件的演化歷史。在大型軟件開發(fā)中,系統(tǒng)往往包含較多文件,這使得傳統(tǒng)方式版本管理的工作量很大,而且不易于描述文件間內(nèi)在的組合關(guān)系。目前,基于構(gòu)件的軟件開發(fā)方法已成為發(fā)展趨勢[ 7, 8] .構(gòu)件作為系統(tǒng)的有機構(gòu)成成分,在物理上可以表現(xiàn)為多個文件的集合體,而在開發(fā)過程中是作為一個原子單位使用的。系統(tǒng)的開發(fā)者關(guān)心的是構(gòu)件整體的開發(fā)、演化,組裝和維護。這種大粒度的開發(fā)方法,對版本管理提出了新的要求[ 3] .這些要求包括: #應(yīng)能有效存儲和管理構(gòu)件演化歷史。 #操作模型應(yīng)有利于體現(xiàn)構(gòu)件的整體性, 降低系統(tǒng)開發(fā)的復(fù)雜程度。 #需要保證并行開發(fā)構(gòu)件時的正確性, 同時不減少項目組協(xié)同工作的靈活性。 本文研究了構(gòu)件的版本控制策略,提出了基于構(gòu)件的版本管理模型。針對并行開發(fā)問題,又提出了分別在構(gòu)件和文件粒度上進行版本管理和并發(fā)控制的方法。在此基礎(chǔ)上,設(shè)計實現(xiàn)了一個產(chǎn)品化的配置管理系統(tǒng)JBCM.該系統(tǒng)既提升了管理的粒度,又能確保團隊開發(fā)具有較好的并行性。 2 以構(gòu)件為粒度的版本管理 2.1 版本管理系統(tǒng)中的構(gòu)件定義 在基于構(gòu)件復(fù)用的青鳥軟件生產(chǎn)線中,軟件構(gòu)件定義如下: /構(gòu)件是可以被多個軟件系統(tǒng)復(fù)用的具有獨立功能的系統(tǒng)構(gòu)成成分0 [8] .構(gòu)件在實際形態(tài)上可表現(xiàn)為通過目錄結(jié)構(gòu)組織起來的一些文件的集合,并且是系統(tǒng)中可以明確辨識的構(gòu)成成分。需要指出的是,在以前許多有關(guān)版本管理的文獻中都出現(xiàn)了構(gòu)件的概念[ 4] ,但其中的構(gòu)件一般指的就是文件。本文中的構(gòu)件則是應(yīng)用系統(tǒng)中多個相關(guān)文件構(gòu)成的一個邏輯整體,例如一個類的定義及其實現(xiàn),一個完整的功能模塊等。構(gòu)件版本是構(gòu)件組成文件版本的集合。構(gòu)件版本的變化不僅體現(xiàn)了組成文件的版本變化,同時也反映了構(gòu)件中文件組成的變化。也就是說,組成文件發(fā)生版本演化,或者增加和刪除構(gòu)件中的文件,都會引起構(gòu)件版本的演化。在基于構(gòu)件的系統(tǒng)中,文件版本由系統(tǒng)內(nèi)部控制,用戶只關(guān)注構(gòu)件版本,從而提升了管理層次。圖1反映了構(gòu)件版本與文件版本的關(guān)系: 圖 中虛線箭頭表示構(gòu)件和文件與其不同版本的關(guān)系, 實線箭頭表示構(gòu)件版本由文件版本組成的關(guān)系。從圖中可以看出構(gòu)件的版本2 比版本1 增加了一個文件3, 而且文件版本也發(fā)生了演化。 構(gòu)件版本的演化與文件版本的演化同步進行, 并且隨著文件的版本演化自動產(chǎn)生?;谏鲜鰳?gòu)件與文件關(guān)系模型, 提出并實現(xiàn)了基于構(gòu)件的軟件版本管理系統(tǒng)。 2.2 構(gòu)件的版本管理 ?。?) 以構(gòu)件為粒度的版本管理特點 與 基于文件的版本管理相比, 基于構(gòu)件的版本管理有以下主要特點: ? 構(gòu)件的抽象級別比文件高。 構(gòu)件是應(yīng)用系統(tǒng)中可以明確辨識的構(gòu)成成分。 記錄、維護構(gòu)件的版本比文件的版本管理更有意義。 ? 構(gòu)件的粒度可以比文件大很多。 一個項目中可能有諸多分布的邏輯單元, 這些邏輯單元與構(gòu)件相對應(yīng)。構(gòu)件的數(shù)量較少, 而且整體邏輯意義明顯, 可以更清晰地體現(xiàn)項目的演化歷史。 ? 在構(gòu)件基礎(chǔ)上, 可以體現(xiàn)出系統(tǒng)的層次性、構(gòu)造性等特征。 同時, 構(gòu)件版本管理也可以滿足對文件版本的管理需求, 使版本管理既有大粒度, 又有靈活性。 ?。?) 構(gòu)件版本管理的基本模式 基 于構(gòu)件的版本管理系統(tǒng)采用/ 檢出( Check Out) 、修改、檢入( Check In)0 的基本操作模型, 操作的基本單位是構(gòu)件。 使用者需要先將構(gòu)件從版本庫檢出到工作區(qū), 隨后在工作區(qū)中完成對構(gòu)件的修改, 最后將修改的結(jié)果檢入版本庫。 構(gòu)件組成文件的增刪以及其中任何一個文件的修改都被視為對整個構(gòu)件的修改。 因此, 作為檢入操作的結(jié)果, 版本管理系統(tǒng)會自動生成構(gòu)件的一個新版本。 以構(gòu)件版本為粒度的版本管理系統(tǒng)記錄和管理了開發(fā)人員對構(gòu)件修改的歷史。 (3) 構(gòu)件版本樹 在 基本模式之上, 使用者可以構(gòu)件的某個版本進行分支,建立一個新的開發(fā)流, 以適應(yīng)不同的開發(fā)需求。 構(gòu)件多個分支還可以進行合并。 由此, 一個構(gòu)件的所有版本構(gòu)成了一棵版本樹。 構(gòu)件版本樹是系統(tǒng)對構(gòu)件進行版本管理的基礎(chǔ)。構(gòu)件的版本樹是由版本管理系統(tǒng)維護, 系統(tǒng)需要提供比較完善的版本名自動生成與管理機制。 其基本原則是: ? 無沖突地表示整棵版本樹; ? 有效的區(qū)分版本名與分支名; ? 有利于體現(xiàn)構(gòu)件的開發(fā)過程。 圖2 構(gòu)件版本樹 圖2 是采用的一種比較實用有效的版本樹命名方法。 版本11 0 為構(gòu)件的初始版本, 實心節(jié)點為分支點。 版本11211121 210 與版本11 21 213 合并后形成版本1121 214. 3 以文件為基本粒度實現(xiàn)并發(fā)控制 311 版本控制與并發(fā)控制單位的分離 版本管理系統(tǒng)應(yīng)能對項目組共同開發(fā)軟件系統(tǒng)提供管理支持。 多個開發(fā)人員可以分工開發(fā)不同構(gòu)件, 也可以同時開發(fā)同一構(gòu)件。 為了保證協(xié)同開發(fā)的安全性和正確性, 必須解決構(gòu)件開發(fā)過程中的并發(fā)控制問題。 在基于文件的版本管理系統(tǒng)中, 版本控制與并發(fā)控制的基本單位都是文件。 使用者可以在檢出時對文件加鎖, 防止其它用戶對該文件進行修改; 檢入時, 在生成文件新版本的同時, 要對文件解鎖。 而在基于構(gòu)件的版本管理系統(tǒng)中, 如果把并發(fā)控制的單位定為構(gòu)件, 在需要修改時對構(gòu)件加鎖, 會造成其他使用者無法同時修改構(gòu)件和構(gòu)件中的任何文件。 因此, 提出并實現(xiàn)了以構(gòu)件為版本控制單位, 以文件作為并發(fā)控制單位的管理方法。 3.2 文件的操作模式與并發(fā)控制 在實現(xiàn)基于構(gòu)件的版本管理系統(tǒng)中,構(gòu)件是版本控制單位,而并發(fā)控制則在構(gòu)件內(nèi)部的文件級別上進行管理。對于一個構(gòu)件,使用者可設(shè)定其中文件的操作模式,由此來控制相關(guān)文件的加鎖活動。 文件的操作模式可以分為三種: /只讀0、/排它寫0和/共享寫0、/只讀0表示對文件不加鎖,使用者也不能對文件進行修改,使用者可以使用/只讀0模式來瀏覽文件; /排它寫0表示對文件加鎖,使用者可以對文件進行修改,但不允許其他使用者同時進行修改,這樣可以保證對同一文件的修改是串行化的; /共享寫0則表示對文件不加鎖,使用者可以對文件進行修改,而且允許其他使用者同時對同一文件進行修改。雖然/共享寫0模式可以提高并發(fā)程度,但會帶來多個用戶修改結(jié)果互相沖突的問題。版本管理系統(tǒng)可以分析這種沖突,并提示用戶進行相應(yīng)的合并處理,由此解決了文件內(nèi)容的一致性問題。 在構(gòu)件的修改過程中,文件的操作模式是可以隨時改變的。例如,使用者先用只讀模式檢出構(gòu)件中的各個文件,而在要修改文件時,可將需修改文件的操作模式改為/排它寫0或/共享寫0,然后修改。完成了對構(gòu)件中所有相關(guān)文件的修改,也就完成了對構(gòu)件的修改。這時檢入修改后的構(gòu)件,系統(tǒng)會自動產(chǎn)生該構(gòu)件的一個新版本。如果在使用者檢入之前另一使用者已檢入了構(gòu)件的另一新版本,該使用者就需要先進行更新操作,系統(tǒng)會將構(gòu)件最新版本拿到工作區(qū),與該使用者修改過的版本進行合并后才能檢入。使用者對文件操作模式的修改必須滿足一定的條件。具體轉(zhuǎn)換條件見圖3.[!--empirenews.page--] 3.3 文件的操作權(quán)限管理 操作權(quán)限用于管理特定用戶對構(gòu)件中文件的使用權(quán)限,分為/只讀0和/可寫0兩種。它控制的是用戶對文件的操作能力。用戶操作模式是用戶檢出構(gòu)件時對文件的實際操作。用戶操作模式不能超過操作權(quán)限。例如,擁有/只讀0權(quán)限的用戶只能用/只讀0模式檢出文件,擁有/可寫0權(quán)限的用戶才可以用/只讀0、/排他寫0和/共享寫0模式修改文件。操作權(quán)限與操作模式一樣,都是針對構(gòu)件中的文件。通過操作權(quán)限的管理,可以劃分不同用戶對同一構(gòu)件所承擔的工作任務(wù)。操作模式和操作權(quán)限相結(jié)合,有效地解決了多個用戶協(xié)同開發(fā)同一個構(gòu)件時的并發(fā)控制問題。 圖3 各種文件操作模式間的轉(zhuǎn)換 4 基于構(gòu)件的版本管理系統(tǒng)的實現(xiàn) 在上述研究基礎(chǔ)之上,研制了青鳥配置管理系統(tǒng)JBCM的核心部分?;跇?gòu)件的版本管理系統(tǒng)JBVM. JBVM對基于構(gòu)件的軟件開發(fā)方法提供了充分支持,其最主要的特點是將構(gòu)件與文件版本管理分布于兩個不同層次,在系統(tǒng)設(shè)計方面也就具有相應(yīng)的層次性。本節(jié)主要討論設(shè)計與實現(xiàn)中的關(guān)鍵問題及其解決策略。 4.1 版本庫的組織結(jié)構(gòu) 版本庫是構(gòu)件版本演化歷史的存儲區(qū)。版本庫中記錄的數(shù)據(jù)分為版本構(gòu)件和元數(shù)據(jù)兩類。版本構(gòu)件是用戶交付的各類構(gòu)件,由于同時具有版本信息,故稱為版本構(gòu)件。元數(shù)據(jù)是管理系統(tǒng)維持自身運行所需的各種控制文件與完成各種版本管理功能所需的信息,包含日志、用戶管理、并發(fā)控制、權(quán)限控制、操作模式、統(tǒng)計與審計等信息。 ck; padding-left: 0px; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 20px auto; padding-top: 0px; border-right-width: 0px; max-width: 600px" /> 圖4 版本庫的層次結(jié)構(gòu) 版本管理系統(tǒng)設(shè)計的核心內(nèi)容包括版本庫的組織、結(jié)構(gòu)與維護。 版本庫的組織結(jié)構(gòu)分為兩個層次: 項目層和構(gòu)件層。對于系統(tǒng)開發(fā)人員來說, 版本庫中的項目可以與系統(tǒng)開發(fā)中的工作劃分相對應(yīng), 一個軟件系統(tǒng)的整體或子系統(tǒng)都可以作為一個項目。 而構(gòu)件對應(yīng)于軟件系統(tǒng)結(jié)構(gòu)中最低層的不可再分的基本邏輯單元, 可以是系統(tǒng)開發(fā)過程中需要作為一個整體的文件集合, 例如用于實現(xiàn)一個C+ + 類的所有。 cpp 和。 h文件。 下面是版本庫的一個簡化結(jié)構(gòu)示例圖。 在項目a( 用a.Prj 表達) 下, 有c 和d 兩個構(gòu)件( 用c. Comp 和d. Comp 表達) ,而c 構(gòu)件由e. cpp、f. h 和一個g 目錄組成。 TempFile 是版本庫的臨時文件存儲區(qū)。 4.2 構(gòu)件的增量存儲 構(gòu) 件的不同版本間具有較大的內(nèi)容相似性, 不同版本的存儲有必要使用增量存儲方式, 以減少存儲冗余。 在傳統(tǒng)的文件版本管理系統(tǒng)中, 已較深入地研究了文件的增量存儲技術(shù), 有實際的算法及實現(xiàn), 如最長公共子序列算法[ 5] 等。 根據(jù)基于構(gòu)件的版本管理的特點,提出了按構(gòu)件和文件兩個層次分別進行增量存儲的設(shè)計方案: ?。?1) 對于構(gòu)件中具體文件的修改, 使用傳統(tǒng)的文件逆向增量存儲技術(shù)[ 2] , 保存最新文件版本與增量部分。 ?。?2) 構(gòu)件的版本由附屬目錄及文件的版本組成。 構(gòu)件的增量存儲體現(xiàn)在版本中記錄的是相比前一版本組成成分的不同部分。 ( 3) 對于文件和構(gòu)件存在多個分支的情況, 對各分支獨立進行增量式存儲。 保存每個分支上的最新版本和其他版本相對于各自后一版本的增量。 4.3 構(gòu)件版本的比較與合并 構(gòu)件演化過程中會產(chǎn)生多個分支,各分支都會實現(xiàn)一些不同于其他分支的新特性。有時需要將這些特性都合并到一個版本中。為了保證在多個用戶協(xié)同工作時的正確性,也經(jīng)常需要合并多個用戶分別修改過的構(gòu)件版本。構(gòu)件不同版本的合并采用如下策略:不同版本添加的文件有選擇地添加到合并版本中,修改過的文件逐一進行合并。 構(gòu)件版本的比較是版本合并的基礎(chǔ)。在合并之前,可以通過構(gòu)件版本的比較得到不同版本間的差異。除此之外,為了查看構(gòu)件的演化歷史,實現(xiàn)對構(gòu)件的變化與過程控制,也需要比較構(gòu)件的新老版本;在基于構(gòu)件的版本管理系統(tǒng)中,構(gòu)件版本的比較分為兩個層次。底層是文件級的比較,通過比較不同版本文件的具體內(nèi)容,得到文件內(nèi)容的差異。上層是構(gòu)件級的比較,通過比較構(gòu)件不同版本組成成分,來獲取構(gòu)件整體的變化情況。在JBVM系統(tǒng)中,通過構(gòu)件級別上的比較則可分析出構(gòu)件的不同版本各自包含哪些文件,以及分別對哪些文件進行了修改。 5 結(jié)束語 本 文著重討論了基于構(gòu)件的軟件版本管理模型, 以及相應(yīng)系統(tǒng)的設(shè)計與實現(xiàn)。 基于構(gòu)件的思想不僅可以應(yīng)用于版本控制, 配置管理中的其它功能, 例如配置支持、構(gòu)造支持、審計控制、統(tǒng)計報告、過程支持和團隊支持等方面都可以建立在構(gòu)件的基礎(chǔ)上。 我們將進一步研究以構(gòu)件為粒度配置支持、構(gòu)造支持和變化控制方法。