程海水
(江西廣播電視大學(xué) 江西 南昌 330046)
軟件復(fù)用(softreuse)是指在開放軟件過程中,為提高效率,降低成本,充分使用原有的經(jīng)驗(yàn)、思想、方法和產(chǎn)品的一系列活動(dòng)。
現(xiàn)階段,軟件復(fù)用研究主要集中在構(gòu)件技術(shù)上,構(gòu)件技術(shù)對(duì)傳統(tǒng)的系統(tǒng)開發(fā)方式產(chǎn)生了巨大的影響,以其分布性、開放性、可配置性、高效性、易維護(hù)性等優(yōu)點(diǎn)得到了計(jì)算機(jī)軟件行業(yè)人士的充分認(rèn)可。構(gòu)件技術(shù)通過分析行業(yè)領(lǐng)域或者一組相似系統(tǒng),從中提取可以共享的資源,開發(fā)成獨(dú)立部署的成品,供軟件開發(fā)者使用,避免軟件開發(fā)者一切從零開始,大大降低了開發(fā)成本,提高了開發(fā)效率,有效地緩解了軟件危機(jī)問題。
軟件復(fù)用的思想,如子程序、函數(shù)等為早期的軟件開發(fā)人員提供了一種便捷的方法,節(jié)省了時(shí)間和資源。但是隨著信息技術(shù)的不斷發(fā)展,原有的軟件復(fù)用技術(shù)已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足軟件開發(fā)需要,軟件危機(jī)隨之而來(lái)。為了解決軟件開發(fā)成本高、周期長(zhǎng)、維護(hù)難等問題,1968年NATO軟件工程會(huì)議上首次提出了構(gòu)件技術(shù)。
目前對(duì)構(gòu)件的定義還沒有一個(gè)統(tǒng)一的描述。比較有代表性的是Szyperski提出的構(gòu)件定義:“軟件構(gòu)件是一個(gè)僅帶特定契約接口和顯示語(yǔ)境依賴關(guān)系的組合單元,軟件構(gòu)件可以獨(dú)立部署,易于第三方組裝”。本人研究各種有代表性的定義后,認(rèn)為構(gòu)件是指軟件開發(fā)中能夠獨(dú)立部署并被其他系統(tǒng)復(fù)用的單元,它可以小到一段二進(jìn)制代碼、一個(gè)圖,也可以大到系統(tǒng)分析、文檔、包,甚至是子系統(tǒng)等等??蓮?fù)用的構(gòu)件應(yīng)該具有可定制性、自我描述性、有用性、易讀性、兼容性、移植性等特點(diǎn)。
構(gòu)件的接口、實(shí)現(xiàn)、契約(contact)是相分離的,用戶可以根據(jù)需要對(duì)構(gòu)件的屬性進(jìn)行修改從而滿足用戶的特定需要(可定制性)。同時(shí),構(gòu)件需要達(dá)到一定程度的自治,也就是說(shuō)構(gòu)件不需要作大的修改就可以換到另外一個(gè)運(yùn)行環(huán)境中使用。
構(gòu)件可以根據(jù)各種不同的角度進(jìn)行分類,主要是可以按照復(fù)用方式、使用范圍、粒度大小、復(fù)用狀態(tài)、功能用途等角度進(jìn)行分類。比如,按照構(gòu)件復(fù)用方式可以將構(gòu)件分為即插即用的黑匣構(gòu)件和編輯使用的白匣構(gòu)件;按照功能用途可以將構(gòu)件分為在集成環(huán)境中使用的系統(tǒng)構(gòu)件、在構(gòu)件庫(kù)管理中使用的支撐構(gòu)件和專用的領(lǐng)域構(gòu)件;按形態(tài)將構(gòu)件可分為分析構(gòu)件、設(shè)計(jì)構(gòu)件、編碼構(gòu)件和測(cè)試構(gòu)件。
1.接口技術(shù)
構(gòu)件作為一個(gè)獨(dú)立部署的單元,它對(duì)用戶來(lái)說(shuō)是透明的。構(gòu)件只提供接口給用戶使用,而無(wú)需讓用戶了解構(gòu)件內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)代碼。接口是構(gòu)件和用戶之間交互的橋梁。
2.連接件(connector)和角色(role)
連接件表示構(gòu)件之間的交互。連接件作為構(gòu)件之間的交互工具,他既可以表示方法調(diào)用這種簡(jiǎn)單的概念,還可以表示抽象連接,如客戶和數(shù)據(jù)庫(kù)服務(wù)器之間的SQL連接。和構(gòu)件一樣,用戶無(wú)需知道連接件的內(nèi)部構(gòu)造。正如構(gòu)件通過接口與外部交互一樣,連接件通過一組角色(role,即接口)與外界環(huán)境進(jìn)行交互。例如,二元連接件(binary)方法調(diào)用就是一個(gè)帶有調(diào)用者(caller)和被調(diào)用者(callee)兩個(gè)角色的連接件。
3.構(gòu)件和對(duì)象的比較
構(gòu)件技術(shù)的提出很大一部分是源于面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù),構(gòu)件借鑒了對(duì)象的封裝、繼承等許多先進(jìn)思想。因此構(gòu)件和對(duì)象許多共同點(diǎn),比如封裝屬性、繼承性、復(fù)用性、提供接口、定義與運(yùn)用相分離等。構(gòu)件與對(duì)象的區(qū)別在于構(gòu)件比對(duì)象的定義更廣、更大。面向?qū)ο蟮膹?fù)用一般都是指對(duì)類庫(kù)的復(fù)用。而構(gòu)件復(fù)用可以適用很多情況,它可以是代碼、思想、設(shè)計(jì)圖等。另外,為了復(fù)用某一個(gè)對(duì)象類,需要熟悉特定的語(yǔ)言,比如C++,Java等。而構(gòu)件則不需要,構(gòu)件不需要知道內(nèi)部實(shí)現(xiàn)機(jī)制,也不需要知道采用何種編程語(yǔ)言,使用何種平臺(tái)。構(gòu)件適合描述服務(wù)和系統(tǒng)功能,而對(duì)象適合描述功能及其問題域。構(gòu)件的接口一般也會(huì)比對(duì)象復(fù)雜得多。
構(gòu)件模型是構(gòu)件開發(fā)的核心,是構(gòu)件開發(fā)與應(yīng)用的交匯點(diǎn),既是構(gòu)件技術(shù)研究的主要內(nèi)容和成果,又是構(gòu)件技術(shù)運(yùn)用于實(shí)際應(yīng)用系統(tǒng)開發(fā)的主要依據(jù)。目前學(xué)術(shù)界和產(chǎn)業(yè)界流行的構(gòu)件模型主要有從概念 (Concept)、內(nèi)容(Content)和語(yǔ)境(Context)三個(gè)不同的方面來(lái)描述構(gòu)件的3C模型、基于構(gòu)件刻面分類和檢索的REBOOT模型、基于面向?qū)ο笙到y(tǒng),便于使用面向?qū)ο蠼UZ(yǔ)言UML來(lái)描述構(gòu)件內(nèi)部的動(dòng)、靜態(tài)結(jié)構(gòu)、狀態(tài)變化過程的FRISCO模型、以及楊芙清院士等人提出的更多關(guān)注構(gòu)件易理解性、封裝性及構(gòu)件關(guān)系的青鳥構(gòu)件模型。
目前第三方構(gòu)件眾多,如何選取性能優(yōu)越同時(shí)又適用的構(gòu)件越來(lái)越受到大家的關(guān)注。一個(gè)好的構(gòu)件可能本身就是一個(gè)功能強(qiáng)大但又復(fù)雜的軟件。想要充分有效地使用該構(gòu)件,需要深入了解構(gòu)件的功能和屬性,特別是構(gòu)件的接口。這并不是一件非常容易的事。因?yàn)橐粋€(gè)功能強(qiáng)大,結(jié)構(gòu)復(fù)雜的構(gòu)件,它的接口一般擁有上百個(gè)API調(diào)用,即使是開發(fā)該構(gòu)件的程序員可能都很難完全了解每個(gè)API。同時(shí),構(gòu)件的開發(fā)者可能提供的文檔不夠全面或者存在錯(cuò)誤,想要用文檔全面、正確地描述構(gòu)件同樣不是能夠輕易完成的。即使能夠做到,這個(gè)文檔也一定是一個(gè)龐大的、一般用戶難以理解的文檔。
那么如何能夠科學(xué)地評(píng)價(jià)一個(gè)構(gòu)件的好壞呢。構(gòu)件的評(píng)價(jià)取決于很多特定因素和需求,所以不可能有標(biāo)準(zhǔn)的評(píng)價(jià)體系和指標(biāo)。本人借鑒統(tǒng)計(jì)代碼行數(shù)、Halstead方法、Albercht功能點(diǎn)方法等傳統(tǒng)軟件的評(píng)價(jià)方法,認(rèn)為可以主要通過以下幾個(gè)指標(biāo)對(duì)構(gòu)件進(jìn)行評(píng)價(jià):一是用戶查找該構(gòu)件的次數(shù),即檢索次數(shù)。此指標(biāo)反映了構(gòu)件的可識(shí)別復(fù)用的特征;二是構(gòu)件實(shí)際被復(fù)用的次數(shù);三是構(gòu)件的修改次數(shù),修改得越少,說(shuō)明構(gòu)件設(shè)計(jì)的越合理;四是構(gòu)件的復(fù)雜度,復(fù)雜度越低越容易被用戶所接受;五是構(gòu)件的可靠性,出錯(cuò)率越低可靠性越強(qiáng);六是構(gòu)件的耦合率,耦合度越小,構(gòu)件的獨(dú)立性和封裝性越好;七是通用性,可復(fù)用的范圍越大,通用性則越好;八是構(gòu)件的接口,接口應(yīng)該清晰、簡(jiǎn)潔、干凈。
要真正使用構(gòu)件技術(shù)去開發(fā)系統(tǒng),則需要數(shù)量龐大的構(gòu)件群。如何管理這些數(shù)量巨大的構(gòu)件,使這些構(gòu)件的獲取、檢索、組裝等操作方便、有效則顯得非常重要。構(gòu)件庫(kù)就是滿足這種需要的一種工具。它是按照一定的語(yǔ)義和規(guī)范的組織結(jié)構(gòu)形成的構(gòu)件集合。它為系統(tǒng)開發(fā)提供共享構(gòu)件資源和管理。軟件開發(fā)人員要想利用構(gòu)件技術(shù)進(jìn)行系統(tǒng)開發(fā)則必須懂得使用構(gòu)件庫(kù),因?yàn)闃?gòu)件庫(kù)為構(gòu)件編譯、測(cè)試、開發(fā)、檢索、維護(hù)、組裝等操作提供了管理平臺(tái)。