1.軟件復用的特點和現(xiàn)狀
軟件復用就是將已有的軟件成分用于構(gòu)造新的軟件系統(tǒng)??梢员粡陀玫能浖煞忠话惴Q作可復用構(gòu)件,無論對可復用構(gòu)件原封不動地使用還是作適當?shù)男薷暮笤偈褂?,只要是用來?gòu)造新軟件,則都可稱作復用。軟件復用不僅僅是對程序的復用,它還包括對軟件生產(chǎn)過程中任何活動所產(chǎn)生的制成品的復用,如項目計劃、可行性報告、需求定義、分析模型、設(shè)計模型、詳細說明、源程序、測試用例等等。如果是在一個系統(tǒng)中多次使用一個相同的軟件成分,則不稱作復用,而稱作共享;對一個軟件進行修改,使它運行于新的軟硬件平臺也不稱作復用,而稱作軟件移值。
目前及近期的未來有可能產(chǎn)生顯著效益的復用是對軟件生命周期中一些主要開發(fā)階段的軟件制品的復用,按抽象程度的高低,可以劃分為如下的復用級別:
(1)代碼的復用
包括目標代碼和源代碼的復用。其中目標代碼的復用級別低,歷史也久,當前大部分編程語言的運行支持系統(tǒng)都提供了連接(Link)、綁定(Binding)等功能來支持這種復用。源代碼的復用級別略高于目標代碼的復用,程序員在編程時把一些想復用的代碼段復制到自己的程序中,但這樣往往會產(chǎn)生一些新舊代碼不匹配的錯誤。想大規(guī)模的實現(xiàn)源程序的復用只有依靠含有大量可復用構(gòu)件的構(gòu)件庫。如”對象鏈接及嵌入”(OLE)技術(shù),既支持在源程序級定義構(gòu)件并用以構(gòu)造新的系統(tǒng),又使這些構(gòu)件在目標代碼的級別上仍然是一些獨立的可復用構(gòu)件,能夠在運行時被靈活的得新組合為各種不同的應(yīng)用。
(2)設(shè)計的復用
設(shè)計結(jié)果比源程序的抽象級別更高,因此它的復用受實現(xiàn)環(huán)境的影響較少,從而使可復用構(gòu)件被復用的機會更多,并且所需的修改更少。這種復用有三種途徑,第一種途徑是從現(xiàn)有系統(tǒng)的設(shè)計結(jié)果中提取一些可復用的設(shè)計構(gòu)件,并把這些構(gòu)件應(yīng)用于新系統(tǒng)的設(shè)計;第二種途徑是把一個現(xiàn)有系統(tǒng)的全部設(shè)計文檔在新的軟硬件平臺上重新實現(xiàn),也就是把一個設(shè)計運用于多個具體的實現(xiàn);第三種途徑是獨立于任何具體的應(yīng)用,有計劃地開發(fā)一些可復用的設(shè)計構(gòu)件。
(3)分析的復用
這是比設(shè)計結(jié)果更高級別的復用,可復用的分析構(gòu)件是針對問題域的某些事物或某些問題的抽象程度更高的解法,受設(shè)計技術(shù)及實現(xiàn)條件的影響很少,所以可復用的機會更大。復用的途徑也有三種,即從現(xiàn)有系統(tǒng)的分析結(jié)果中提取可復用構(gòu)件用于新系統(tǒng)的分析;用一份完整的分析文檔作輸入產(chǎn)生針對不同軟硬件平臺和其它實現(xiàn)條件的多項設(shè)計;獨立于具體應(yīng)用,專門開發(fā)一些可復用的分析構(gòu)件。
(4)測試信息的復用
主要包括測試用例的復用和測試過程信息的復用。前者是把一個軟件的測試用例在新的軟件測試中使用,或者在軟件作出修改時在新的一輪測試中使用。后者是在測試過程中通過軟件工具自動地記錄測試的過程信息,包括測試員的每一個操作、輸入?yún)?shù)、測試用例及運行環(huán)境等一切信息。這種復用的級別,不便和分析、設(shè)計、編程的復用級別作準確的比較,因為被復用的不是同一事物的不同抽象層次,而是另一種信息,但從這些信息的形態(tài)看,大體處于與程序代碼相當?shù)募墑e。
由于軟件生產(chǎn)過程主要是正向過程,即大部分軟件的生產(chǎn)過程是使軟件產(chǎn)品從抽象級別較高的形態(tài)向抽象級別較低的形態(tài)演化,所以較高級別的復用容易帶動較低級別的復用,因而復用的級別越高,可得到的回報也越大,因此分析結(jié)果和設(shè)計結(jié)果在目前很受重視。用戶可購買生產(chǎn)商的分析件和設(shè)計件,自己設(shè)計或編程,掌握系統(tǒng)的剪裁、擴充、維護、演化等活動。
2.軟件復用的根本因難
軟件復用各方面的困難,無論是技術(shù)問題還是非技術(shù)問題,都影響著軟件復用的廣泛實行。
(1)技術(shù)因素。
構(gòu)件與應(yīng)用系統(tǒng)之間的差異。一些開發(fā)者開發(fā)的構(gòu)件,要做到在被另一些人開發(fā)的系統(tǒng)中使用時正好合適,從內(nèi)容到對外接口都恰好相符,或者作很少的修改,這不是一件簡單的事;構(gòu)件要達到一定的數(shù)量,才能支持有效的復用,而大量構(gòu)件的獲得需要有很高的投入和長期的積累;發(fā)現(xiàn)合用構(gòu)件的困難,當構(gòu)件達到較大的數(shù)量時,使用者要從中找到一個自己想要的構(gòu)件,并斷定它確實是自己需要的,不是一件輕而易舉的事;基于復用的軟件開發(fā)方法和軟件過程是一個新的研究實踐領(lǐng)域,需要一些新的理論、技術(shù)及支持環(huán)境,目前這方面的研究成果和實踐經(jīng)驗都不夠充分。
(2)人的因素。
軟件開發(fā)是一種創(chuàng)造性工作,長期從事這個行業(yè)的人們形成了一種職業(yè)習慣:喜歡自己創(chuàng)造而不喜歡使用別人的東西,特別是當要對別人開發(fā)的軟件作一些修改再使用時,他們常常喜歡自己另寫一個。
(3)管理因素
在軟件生產(chǎn)的管理中,從以往沿習了一些與復用的目標很不協(xié)調(diào)的制度與政策,如計算工作量時,對復用的部分打很大的折扣,甚至不算工作量;另外,不是在項目開始時自覺地向著造就可復用構(gòu)件的方向努力,而是在它完成之后,看看是否能從中找到一些可復用構(gòu)件。這些弊端妨礙了復用水平的提高和復用規(guī)模的擴大,甚至會挫傷致力于復用的人員的積極性。
(4)教育因素
在軟件科學技術(shù)的教育與培訓中,缺乏關(guān)于軟件復用的內(nèi)容,很少有這方面的專門教材及課程,即使在其它教材及課程中提到軟件復用,其篇幅及內(nèi)容也相當薄弱。
(5)法律因素
在法律上還存在一些問題,例如,一個可復用構(gòu)件在某個應(yīng)用系統(tǒng)中出現(xiàn)了錯誤,而構(gòu)件的開發(fā)者和應(yīng)用系統(tǒng)的開發(fā)者不是一個廠商,那么責任應(yīng)該由誰負?此外,在版權(quán)、政府政策等方面也存在一些懸而未決的問題。
另外,軟件產(chǎn)品是一種精神產(chǎn)品,它的產(chǎn)生幾乎完全是人腦思維的結(jié)果,它的價值,也幾乎完全在于其中所凝結(jié)的思想;它的物質(zhì)載體的制造過程與價值含量都是微不足道的。物質(zhì)產(chǎn)品的生產(chǎn)受到人類制造能力的限制,現(xiàn)有的一卻物質(zhì)產(chǎn)品的復雜性都沒有超過這種限度,軟件卻沒有這種限制,只要人的大腦能想到的問題,都可能要求軟件去解決,人腦所能思考的問題的復雜性,遠遠超出了人類能制造的物質(zhì)產(chǎn)品的復雜性,因而使軟件的復用更為困難。
3. OO方法對軟件復用的支持
支持軟件復用是人們對面向?qū)ο蠓椒耐械闹饕M唬彩沁@種方法受到廣泛重視的主要原因之一。面向?qū)ο蠓椒ㄖ蕴貏e有利于軟件復用,是由于它的主要概念及原則與軟件復用的要求十分吻合。
面向?qū)ο蠓椒◤拿嫦驅(qū)ο蟮木幊贪l(fā)展到面向?qū)ο蟮姆治雠c設(shè)計,使這種方法支持軟件復用的固有特征能夠從軟件生命周期的前期階段開始發(fā)揮作用,從而使OO方法對軟件復用的支持達到了較高的級別。與其它軟件工程方法相比,面向?qū)ο蠓椒ǖ囊粋€重要優(yōu)點是,它可以在整個軟件生命周期達到概念、原則、術(shù)語及表示法的高度一致。這種一致性使得各個系統(tǒng)成分盡管在不同的開發(fā)與演化階段有不同的形態(tài),但可具有貫穿整個軟件生命周期的良好映射。這一優(yōu)點使OO方法不但能在各個級別支持軟件復用,而且能對各個級別的復用形成統(tǒng)一的、高效的支持,達到良好的全局效果。做到這一點的必要條件是,從面向?qū)ο筌浖_發(fā)的前期階段---OOA就把支持軟件復用作為一個重點問題來考慮。運用OOA方法所定義的對象類具有適合作為可復用構(gòu)件的許多特征,OOA結(jié)果對問題域的良好映射,使同類系統(tǒng)的開發(fā)者容易從問題出發(fā),在已有的OOA結(jié)果中發(fā)現(xiàn)不同粒度的可復用構(gòu)件。
(1)OOA模型
OOA方法建立的系統(tǒng)模型分為基本模型(類圖)和補充模型(主題圖與交互圖),強調(diào)在OOA基本模型中只表示重要的系統(tǒng)建模信息,較為細節(jié)的信息則在詳細說明中結(jié)出。這種表示策略使OOA基本模型體現(xiàn)了更高的抽象,更容易成為一個可復用的系統(tǒng)構(gòu)架。當這個構(gòu)架在不同的應(yīng)用系統(tǒng)中復用時,在很多情況下可通過不同的詳細說明體現(xiàn)系統(tǒng)之間的差異,因此對系統(tǒng)構(gòu)件的改動較少。
(2)OOA與OOD的分工
OOA只注重與問題域及系統(tǒng)責任有關(guān)的信息,OOD考慮與實現(xiàn)條件有關(guān)的因素。這種分工使OOA模型獨立于具體的實現(xiàn)條件,從而使分析結(jié)果可以在問題域及系統(tǒng)責任相同而實現(xiàn)條件互異的多個系統(tǒng)中復用,并為從同一領(lǐng)域的多個系統(tǒng)的分析模型提煉領(lǐng)域模型創(chuàng)造了有利條件。
(3) 對象的表示
所有的對象都用類作為其抽象描述。對象的一卻信息,包括對象的屬性、行為及其對外關(guān)系等等都是通過對象類來表示的。類作為一種可復用構(gòu)件,在運用于不同系統(tǒng)時,不會出現(xiàn)因該類對象實例不同而使系統(tǒng)模型有所不同的情況。
(4) 一般-特殊結(jié)構(gòu)
引入對一般-特殊結(jié)構(gòu)中多態(tài)性的表示法,從而增強了類的可復用性。通過對多態(tài)性的表示,使一個類可以在需求相似而未必完全相同的系統(tǒng)中被復用。
(5)整體-部分結(jié)構(gòu)
把部分類作為可復用構(gòu)件在整個類中使用,這種策略的原理與在特殊類中使用一般類是一致的,但在某些情況下,對問題域的映射比通過繼承實現(xiàn)復用顯得更為自然。另外還可通過整體-部分結(jié)構(gòu)支持領(lǐng)域復用的策略---從整體對象中分離出一組可在領(lǐng)域范圍內(nèi)復用的屬性與服務(wù),定義為部分對象,使之成為領(lǐng)域復用構(gòu)件。
(6)實例連接
建議用簡單的二元關(guān)系表示各種復雜關(guān)系和多元關(guān)系。這一策略使構(gòu)成系統(tǒng)的基本成分(對象類)以及它們之間的關(guān)系在表示形式和實現(xiàn)技術(shù)上都是規(guī)范和一致的這種規(guī)范性和一致性對于可復用構(gòu)件的組織、管理和使用,都是很有益的。
(7)類描述模板
作為OOA詳細說明主要成分的類描述模板,對于對象之間關(guān)系的描述注意到使用者與被使用者的區(qū)別,僅在使用者一端給出類之間關(guān)系的描述信息。這說明可復用構(gòu)件之間的依賴關(guān)系不是對等的。因此,在繼承、聚合、實例連接及消息連接等關(guān)系的使用者一端描述這些關(guān)系,有利于這些關(guān)系信息和由它們指出的被依賴成份的同時復用。在被用者一端不描述這些關(guān)系,則避免了因復用場合的不同所引起的修改。
(8)使用CASE
由于使用CASE是對用戶需求的一種規(guī)范化描述,因此它比普通形式的需求文檔具有更強的可復用性。每個使用case 是對一個活動者使用系統(tǒng)的一項功能時的交互活動所進行描述,它具有完整性和一定的獨立性,因此很適于作為可復用構(gòu)件。
4. 復用技術(shù)對OO方法的支持
面向?qū)ο蟮能浖_發(fā)和軟件復用之間的關(guān)系是相輔相成的。一方面,OO方法的基本概念、原則與技術(shù)提供了實現(xiàn)軟件復用的有利條件;另一方面,軟件復用技術(shù)也對面向?qū)ο蟮能浖_發(fā)提供了有力的支持。
(1)類庫
在面向?qū)ο蟮能浖_發(fā)中,類庫是實現(xiàn)對象類復用的基本條件。人們己經(jīng)開發(fā)了許多基于各種OOPL的編程類庫,有力地支持了源程序級的軟件復用,但要在更高的級別上實現(xiàn)軟件復用,僅有編程類庫是不夠的。實現(xiàn)OOA結(jié)果和OOD結(jié)果的復用,必須有分析類庫和設(shè)計類庫的支持。為了更好地支持多個級別的軟件復用,可以在OOA類庫、OOD類庫和OOP類庫之間建立各個類在不同開發(fā)階段的對應(yīng)與演化關(guān)系。即建立一種線索,表明每個OOA的類對應(yīng)著哪個(或哪些)OOD類,以及每個OOD類對應(yīng)著各種OO編程語言類庫中的哪個OOP類。
(2) 構(gòu)件庫
類庫可以看作一種特殊的可復用構(gòu)件庫,它為在面向?qū)ο蟮能浖_發(fā)中實現(xiàn)軟件復用提供了一種基本的支持。但類庫只能存儲和管理以類為單位的可復用構(gòu)件,不能保存其它形式的構(gòu)件;但是它可以更多地保持類構(gòu)件之間的結(jié)構(gòu)與連接關(guān)系。構(gòu)件庫中的可復用構(gòu)件,既可以是類,也可以是其它系統(tǒng)單位;其組織方式,可以不考慮對象類特有的各種關(guān)系,只按一般的構(gòu)件描述、分類及檢索方法進行組織。在面向?qū)ο蟮能浖_發(fā)中,可以提煉比對象類粒度更大的可復用構(gòu)件,例如把某些結(jié)構(gòu)或某些主題作為可復用構(gòu)件;也可以提煉其它形式的構(gòu)件,例如use case 或交互圖。這些構(gòu)件庫中,構(gòu)件的形式及內(nèi)容比類庫更豐富,可為面向?qū)ο蟮能浖_發(fā)擔供更強的支持。
(3)構(gòu)架庫
如果在某個應(yīng)用領(lǐng)域中已經(jīng)運用OOA技術(shù)建立過一個或幾個系統(tǒng)的OOA模型,則每個OOA模型都應(yīng)該保存起來,為該領(lǐng)域新系統(tǒng)的開發(fā)提供參考。當一個領(lǐng)域已有多個OOA模型時,可以通過進一步抽象而產(chǎn)生一個可復用的軟件構(gòu)架。形成這種可復用軟件構(gòu)架的更正規(guī)的途徑是開展領(lǐng)域分析。通過正規(guī)的領(lǐng)域分析獲得的軟件構(gòu)架將更準確地反映一個領(lǐng)域中各個應(yīng)用系統(tǒng)的共性,具有更強的可復用價值。
(4)工具
有效的實行軟件復用需要有一些支持復用的軟件工具,包括類庫或構(gòu)件/構(gòu)架庫的管理、維護與瀏覽工具,構(gòu)件提取及描述工具,以及構(gòu)件檢索工具等等。以復用支持為背景的OOA工具和OOD工具在設(shè)計上也有相應(yīng)的要求,工具對OOA/OOD過程的支持功能應(yīng)包括:從類庫或構(gòu)件/構(gòu)架庫中尋找可復用構(gòu)件;對構(gòu)件進行修改,并加入當前的系統(tǒng)模型;把當前系統(tǒng)開發(fā)中新定義的類(或其它構(gòu)件)提交到類庫(或構(gòu)件庫)。
(5)OOA過程
在復用技術(shù)支持下的OOA過程,可以按兩種策略進行組織。第一種策略是,基本保持某種OOA方法所建議的OOA過程原貌,在此基礎(chǔ)上對其中的各個活動引入復用技術(shù)的支持;另一種策略是重新組織OOA過程。
第一種策略是在原有的OOA過程基礎(chǔ)上增加復用技術(shù)的支持,應(yīng)補充說明的一點是,復用技術(shù)支持下的OOA過程應(yīng)增加一個提交新構(gòu)件的活動。即在一個具體應(yīng)用系統(tǒng)的開發(fā)中,如果定義了一些有希望被其它系統(tǒng)復用的構(gòu)件,則應(yīng)該把它提交到可復用構(gòu)件庫中。第二種策略的前提是:在對一個系統(tǒng)進行面向?qū)ο蟮姆治鲋?,己?jīng)用面向?qū)ο蠓椒▽υ撓到y(tǒng)所屬的領(lǐng)域進行過領(lǐng)域分析,得到了一個用面向?qū)ο蠓椒ū硎镜念I(lǐng)域構(gòu)架和一批類構(gòu)件,并且具有構(gòu)件/構(gòu)架庫、類庫及相應(yīng)工具的支持。在這種條件下,重新考慮OOA過程中各個活動的內(nèi)容及活動之間的關(guān)系,力求以組裝的方式產(chǎn)生OOA模型,將使OOA過程更為合理,并達到更高的開發(fā)效率。
軟件復用就是將已有的軟件成分用于構(gòu)造新的軟件系統(tǒng)??梢员粡陀玫能浖煞忠话惴Q作可復用構(gòu)件,無論對可復用構(gòu)件原封不動地使用還是作適當?shù)男薷暮笤偈褂?,只要是用來?gòu)造新軟件,則都可稱作復用。軟件復用不僅僅是對程序的復用,它還包括對軟件生產(chǎn)過程中任何活動所產(chǎn)生的制成品的復用,如項目計劃、可行性報告、需求定義、分析模型、設(shè)計模型、詳細說明、源程序、測試用例等等。如果是在一個系統(tǒng)中多次使用一個相同的軟件成分,則不稱作復用,而稱作共享;對一個軟件進行修改,使它運行于新的軟硬件平臺也不稱作復用,而稱作軟件移值。
目前及近期的未來有可能產(chǎn)生顯著效益的復用是對軟件生命周期中一些主要開發(fā)階段的軟件制品的復用,按抽象程度的高低,可以劃分為如下的復用級別:
(1)代碼的復用
包括目標代碼和源代碼的復用。其中目標代碼的復用級別低,歷史也久,當前大部分編程語言的運行支持系統(tǒng)都提供了連接(Link)、綁定(Binding)等功能來支持這種復用。源代碼的復用級別略高于目標代碼的復用,程序員在編程時把一些想復用的代碼段復制到自己的程序中,但這樣往往會產(chǎn)生一些新舊代碼不匹配的錯誤。想大規(guī)模的實現(xiàn)源程序的復用只有依靠含有大量可復用構(gòu)件的構(gòu)件庫。如”對象鏈接及嵌入”(OLE)技術(shù),既支持在源程序級定義構(gòu)件并用以構(gòu)造新的系統(tǒng),又使這些構(gòu)件在目標代碼的級別上仍然是一些獨立的可復用構(gòu)件,能夠在運行時被靈活的得新組合為各種不同的應(yīng)用。
(2)設(shè)計的復用
設(shè)計結(jié)果比源程序的抽象級別更高,因此它的復用受實現(xiàn)環(huán)境的影響較少,從而使可復用構(gòu)件被復用的機會更多,并且所需的修改更少。這種復用有三種途徑,第一種途徑是從現(xiàn)有系統(tǒng)的設(shè)計結(jié)果中提取一些可復用的設(shè)計構(gòu)件,并把這些構(gòu)件應(yīng)用于新系統(tǒng)的設(shè)計;第二種途徑是把一個現(xiàn)有系統(tǒng)的全部設(shè)計文檔在新的軟硬件平臺上重新實現(xiàn),也就是把一個設(shè)計運用于多個具體的實現(xiàn);第三種途徑是獨立于任何具體的應(yīng)用,有計劃地開發(fā)一些可復用的設(shè)計構(gòu)件。
(3)分析的復用
這是比設(shè)計結(jié)果更高級別的復用,可復用的分析構(gòu)件是針對問題域的某些事物或某些問題的抽象程度更高的解法,受設(shè)計技術(shù)及實現(xiàn)條件的影響很少,所以可復用的機會更大。復用的途徑也有三種,即從現(xiàn)有系統(tǒng)的分析結(jié)果中提取可復用構(gòu)件用于新系統(tǒng)的分析;用一份完整的分析文檔作輸入產(chǎn)生針對不同軟硬件平臺和其它實現(xiàn)條件的多項設(shè)計;獨立于具體應(yīng)用,專門開發(fā)一些可復用的分析構(gòu)件。
(4)測試信息的復用
主要包括測試用例的復用和測試過程信息的復用。前者是把一個軟件的測試用例在新的軟件測試中使用,或者在軟件作出修改時在新的一輪測試中使用。后者是在測試過程中通過軟件工具自動地記錄測試的過程信息,包括測試員的每一個操作、輸入?yún)?shù)、測試用例及運行環(huán)境等一切信息。這種復用的級別,不便和分析、設(shè)計、編程的復用級別作準確的比較,因為被復用的不是同一事物的不同抽象層次,而是另一種信息,但從這些信息的形態(tài)看,大體處于與程序代碼相當?shù)募墑e。
由于軟件生產(chǎn)過程主要是正向過程,即大部分軟件的生產(chǎn)過程是使軟件產(chǎn)品從抽象級別較高的形態(tài)向抽象級別較低的形態(tài)演化,所以較高級別的復用容易帶動較低級別的復用,因而復用的級別越高,可得到的回報也越大,因此分析結(jié)果和設(shè)計結(jié)果在目前很受重視。用戶可購買生產(chǎn)商的分析件和設(shè)計件,自己設(shè)計或編程,掌握系統(tǒng)的剪裁、擴充、維護、演化等活動。
2.軟件復用的根本因難
軟件復用各方面的困難,無論是技術(shù)問題還是非技術(shù)問題,都影響著軟件復用的廣泛實行。
(1)技術(shù)因素。
構(gòu)件與應(yīng)用系統(tǒng)之間的差異。一些開發(fā)者開發(fā)的構(gòu)件,要做到在被另一些人開發(fā)的系統(tǒng)中使用時正好合適,從內(nèi)容到對外接口都恰好相符,或者作很少的修改,這不是一件簡單的事;構(gòu)件要達到一定的數(shù)量,才能支持有效的復用,而大量構(gòu)件的獲得需要有很高的投入和長期的積累;發(fā)現(xiàn)合用構(gòu)件的困難,當構(gòu)件達到較大的數(shù)量時,使用者要從中找到一個自己想要的構(gòu)件,并斷定它確實是自己需要的,不是一件輕而易舉的事;基于復用的軟件開發(fā)方法和軟件過程是一個新的研究實踐領(lǐng)域,需要一些新的理論、技術(shù)及支持環(huán)境,目前這方面的研究成果和實踐經(jīng)驗都不夠充分。
(2)人的因素。
軟件開發(fā)是一種創(chuàng)造性工作,長期從事這個行業(yè)的人們形成了一種職業(yè)習慣:喜歡自己創(chuàng)造而不喜歡使用別人的東西,特別是當要對別人開發(fā)的軟件作一些修改再使用時,他們常常喜歡自己另寫一個。
(3)管理因素
在軟件生產(chǎn)的管理中,從以往沿習了一些與復用的目標很不協(xié)調(diào)的制度與政策,如計算工作量時,對復用的部分打很大的折扣,甚至不算工作量;另外,不是在項目開始時自覺地向著造就可復用構(gòu)件的方向努力,而是在它完成之后,看看是否能從中找到一些可復用構(gòu)件。這些弊端妨礙了復用水平的提高和復用規(guī)模的擴大,甚至會挫傷致力于復用的人員的積極性。
(4)教育因素
在軟件科學技術(shù)的教育與培訓中,缺乏關(guān)于軟件復用的內(nèi)容,很少有這方面的專門教材及課程,即使在其它教材及課程中提到軟件復用,其篇幅及內(nèi)容也相當薄弱。
(5)法律因素
在法律上還存在一些問題,例如,一個可復用構(gòu)件在某個應(yīng)用系統(tǒng)中出現(xiàn)了錯誤,而構(gòu)件的開發(fā)者和應(yīng)用系統(tǒng)的開發(fā)者不是一個廠商,那么責任應(yīng)該由誰負?此外,在版權(quán)、政府政策等方面也存在一些懸而未決的問題。
另外,軟件產(chǎn)品是一種精神產(chǎn)品,它的產(chǎn)生幾乎完全是人腦思維的結(jié)果,它的價值,也幾乎完全在于其中所凝結(jié)的思想;它的物質(zhì)載體的制造過程與價值含量都是微不足道的。物質(zhì)產(chǎn)品的生產(chǎn)受到人類制造能力的限制,現(xiàn)有的一卻物質(zhì)產(chǎn)品的復雜性都沒有超過這種限度,軟件卻沒有這種限制,只要人的大腦能想到的問題,都可能要求軟件去解決,人腦所能思考的問題的復雜性,遠遠超出了人類能制造的物質(zhì)產(chǎn)品的復雜性,因而使軟件的復用更為困難。
3. OO方法對軟件復用的支持
支持軟件復用是人們對面向?qū)ο蠓椒耐械闹饕M唬彩沁@種方法受到廣泛重視的主要原因之一。面向?qū)ο蠓椒ㄖ蕴貏e有利于軟件復用,是由于它的主要概念及原則與軟件復用的要求十分吻合。
面向?qū)ο蠓椒◤拿嫦驅(qū)ο蟮木幊贪l(fā)展到面向?qū)ο蟮姆治雠c設(shè)計,使這種方法支持軟件復用的固有特征能夠從軟件生命周期的前期階段開始發(fā)揮作用,從而使OO方法對軟件復用的支持達到了較高的級別。與其它軟件工程方法相比,面向?qū)ο蠓椒ǖ囊粋€重要優(yōu)點是,它可以在整個軟件生命周期達到概念、原則、術(shù)語及表示法的高度一致。這種一致性使得各個系統(tǒng)成分盡管在不同的開發(fā)與演化階段有不同的形態(tài),但可具有貫穿整個軟件生命周期的良好映射。這一優(yōu)點使OO方法不但能在各個級別支持軟件復用,而且能對各個級別的復用形成統(tǒng)一的、高效的支持,達到良好的全局效果。做到這一點的必要條件是,從面向?qū)ο筌浖_發(fā)的前期階段---OOA就把支持軟件復用作為一個重點問題來考慮。運用OOA方法所定義的對象類具有適合作為可復用構(gòu)件的許多特征,OOA結(jié)果對問題域的良好映射,使同類系統(tǒng)的開發(fā)者容易從問題出發(fā),在已有的OOA結(jié)果中發(fā)現(xiàn)不同粒度的可復用構(gòu)件。
(1)OOA模型
OOA方法建立的系統(tǒng)模型分為基本模型(類圖)和補充模型(主題圖與交互圖),強調(diào)在OOA基本模型中只表示重要的系統(tǒng)建模信息,較為細節(jié)的信息則在詳細說明中結(jié)出。這種表示策略使OOA基本模型體現(xiàn)了更高的抽象,更容易成為一個可復用的系統(tǒng)構(gòu)架。當這個構(gòu)架在不同的應(yīng)用系統(tǒng)中復用時,在很多情況下可通過不同的詳細說明體現(xiàn)系統(tǒng)之間的差異,因此對系統(tǒng)構(gòu)件的改動較少。
(2)OOA與OOD的分工
OOA只注重與問題域及系統(tǒng)責任有關(guān)的信息,OOD考慮與實現(xiàn)條件有關(guān)的因素。這種分工使OOA模型獨立于具體的實現(xiàn)條件,從而使分析結(jié)果可以在問題域及系統(tǒng)責任相同而實現(xiàn)條件互異的多個系統(tǒng)中復用,并為從同一領(lǐng)域的多個系統(tǒng)的分析模型提煉領(lǐng)域模型創(chuàng)造了有利條件。
(3) 對象的表示
所有的對象都用類作為其抽象描述。對象的一卻信息,包括對象的屬性、行為及其對外關(guān)系等等都是通過對象類來表示的。類作為一種可復用構(gòu)件,在運用于不同系統(tǒng)時,不會出現(xiàn)因該類對象實例不同而使系統(tǒng)模型有所不同的情況。
(4) 一般-特殊結(jié)構(gòu)
引入對一般-特殊結(jié)構(gòu)中多態(tài)性的表示法,從而增強了類的可復用性。通過對多態(tài)性的表示,使一個類可以在需求相似而未必完全相同的系統(tǒng)中被復用。
(5)整體-部分結(jié)構(gòu)
把部分類作為可復用構(gòu)件在整個類中使用,這種策略的原理與在特殊類中使用一般類是一致的,但在某些情況下,對問題域的映射比通過繼承實現(xiàn)復用顯得更為自然。另外還可通過整體-部分結(jié)構(gòu)支持領(lǐng)域復用的策略---從整體對象中分離出一組可在領(lǐng)域范圍內(nèi)復用的屬性與服務(wù),定義為部分對象,使之成為領(lǐng)域復用構(gòu)件。
(6)實例連接
建議用簡單的二元關(guān)系表示各種復雜關(guān)系和多元關(guān)系。這一策略使構(gòu)成系統(tǒng)的基本成分(對象類)以及它們之間的關(guān)系在表示形式和實現(xiàn)技術(shù)上都是規(guī)范和一致的這種規(guī)范性和一致性對于可復用構(gòu)件的組織、管理和使用,都是很有益的。
(7)類描述模板
作為OOA詳細說明主要成分的類描述模板,對于對象之間關(guān)系的描述注意到使用者與被使用者的區(qū)別,僅在使用者一端給出類之間關(guān)系的描述信息。這說明可復用構(gòu)件之間的依賴關(guān)系不是對等的。因此,在繼承、聚合、實例連接及消息連接等關(guān)系的使用者一端描述這些關(guān)系,有利于這些關(guān)系信息和由它們指出的被依賴成份的同時復用。在被用者一端不描述這些關(guān)系,則避免了因復用場合的不同所引起的修改。
(8)使用CASE
由于使用CASE是對用戶需求的一種規(guī)范化描述,因此它比普通形式的需求文檔具有更強的可復用性。每個使用case 是對一個活動者使用系統(tǒng)的一項功能時的交互活動所進行描述,它具有完整性和一定的獨立性,因此很適于作為可復用構(gòu)件。
4. 復用技術(shù)對OO方法的支持
面向?qū)ο蟮能浖_發(fā)和軟件復用之間的關(guān)系是相輔相成的。一方面,OO方法的基本概念、原則與技術(shù)提供了實現(xiàn)軟件復用的有利條件;另一方面,軟件復用技術(shù)也對面向?qū)ο蟮能浖_發(fā)提供了有力的支持。
(1)類庫
在面向?qū)ο蟮能浖_發(fā)中,類庫是實現(xiàn)對象類復用的基本條件。人們己經(jīng)開發(fā)了許多基于各種OOPL的編程類庫,有力地支持了源程序級的軟件復用,但要在更高的級別上實現(xiàn)軟件復用,僅有編程類庫是不夠的。實現(xiàn)OOA結(jié)果和OOD結(jié)果的復用,必須有分析類庫和設(shè)計類庫的支持。為了更好地支持多個級別的軟件復用,可以在OOA類庫、OOD類庫和OOP類庫之間建立各個類在不同開發(fā)階段的對應(yīng)與演化關(guān)系。即建立一種線索,表明每個OOA的類對應(yīng)著哪個(或哪些)OOD類,以及每個OOD類對應(yīng)著各種OO編程語言類庫中的哪個OOP類。
(2) 構(gòu)件庫
類庫可以看作一種特殊的可復用構(gòu)件庫,它為在面向?qū)ο蟮能浖_發(fā)中實現(xiàn)軟件復用提供了一種基本的支持。但類庫只能存儲和管理以類為單位的可復用構(gòu)件,不能保存其它形式的構(gòu)件;但是它可以更多地保持類構(gòu)件之間的結(jié)構(gòu)與連接關(guān)系。構(gòu)件庫中的可復用構(gòu)件,既可以是類,也可以是其它系統(tǒng)單位;其組織方式,可以不考慮對象類特有的各種關(guān)系,只按一般的構(gòu)件描述、分類及檢索方法進行組織。在面向?qū)ο蟮能浖_發(fā)中,可以提煉比對象類粒度更大的可復用構(gòu)件,例如把某些結(jié)構(gòu)或某些主題作為可復用構(gòu)件;也可以提煉其它形式的構(gòu)件,例如use case 或交互圖。這些構(gòu)件庫中,構(gòu)件的形式及內(nèi)容比類庫更豐富,可為面向?qū)ο蟮能浖_發(fā)擔供更強的支持。
(3)構(gòu)架庫
如果在某個應(yīng)用領(lǐng)域中已經(jīng)運用OOA技術(shù)建立過一個或幾個系統(tǒng)的OOA模型,則每個OOA模型都應(yīng)該保存起來,為該領(lǐng)域新系統(tǒng)的開發(fā)提供參考。當一個領(lǐng)域已有多個OOA模型時,可以通過進一步抽象而產(chǎn)生一個可復用的軟件構(gòu)架。形成這種可復用軟件構(gòu)架的更正規(guī)的途徑是開展領(lǐng)域分析。通過正規(guī)的領(lǐng)域分析獲得的軟件構(gòu)架將更準確地反映一個領(lǐng)域中各個應(yīng)用系統(tǒng)的共性,具有更強的可復用價值。
(4)工具
有效的實行軟件復用需要有一些支持復用的軟件工具,包括類庫或構(gòu)件/構(gòu)架庫的管理、維護與瀏覽工具,構(gòu)件提取及描述工具,以及構(gòu)件檢索工具等等。以復用支持為背景的OOA工具和OOD工具在設(shè)計上也有相應(yīng)的要求,工具對OOA/OOD過程的支持功能應(yīng)包括:從類庫或構(gòu)件/構(gòu)架庫中尋找可復用構(gòu)件;對構(gòu)件進行修改,并加入當前的系統(tǒng)模型;把當前系統(tǒng)開發(fā)中新定義的類(或其它構(gòu)件)提交到類庫(或構(gòu)件庫)。
(5)OOA過程
在復用技術(shù)支持下的OOA過程,可以按兩種策略進行組織。第一種策略是,基本保持某種OOA方法所建議的OOA過程原貌,在此基礎(chǔ)上對其中的各個活動引入復用技術(shù)的支持;另一種策略是重新組織OOA過程。
第一種策略是在原有的OOA過程基礎(chǔ)上增加復用技術(shù)的支持,應(yīng)補充說明的一點是,復用技術(shù)支持下的OOA過程應(yīng)增加一個提交新構(gòu)件的活動。即在一個具體應(yīng)用系統(tǒng)的開發(fā)中,如果定義了一些有希望被其它系統(tǒng)復用的構(gòu)件,則應(yīng)該把它提交到可復用構(gòu)件庫中。第二種策略的前提是:在對一個系統(tǒng)進行面向?qū)ο蟮姆治鲋?,己?jīng)用面向?qū)ο蠓椒▽υ撓到y(tǒng)所屬的領(lǐng)域進行過領(lǐng)域分析,得到了一個用面向?qū)ο蠓椒ū硎镜念I(lǐng)域構(gòu)架和一批類構(gòu)件,并且具有構(gòu)件/構(gòu)架庫、類庫及相應(yīng)工具的支持。在這種條件下,重新考慮OOA過程中各個活動的內(nèi)容及活動之間的關(guān)系,力求以組裝的方式產(chǎn)生OOA模型,將使OOA過程更為合理,并達到更高的開發(fā)效率。