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