陳潔
(西南計(jì)算機(jī)有限責(zé)任公司 重慶市 400060)
當(dāng)前,伴隨科學(xué)技術(shù)水平的日漸提升,許多新技術(shù)、新理念、新方式在軟件開發(fā)工程中得到不錯(cuò)應(yīng)用,有力推動(dòng)著此領(lǐng)域的發(fā)展、完善與更新;在其發(fā)展架構(gòu)中,提出了許多新的設(shè)計(jì)思路,而面向?qū)ο蟪绦蛟O(shè)計(jì)技術(shù)便為其一,此設(shè)計(jì)技術(shù)的主要目的就是將傳統(tǒng)程序設(shè)計(jì)方法當(dāng)中難以得到有效解決的諸如代碼重用問題等,給予有效解決掉。早在上個(gè)世紀(jì)80年代,便有研究率先提出了具有劃時(shí)代意義的DLL 思想。而到了90年代初期,又有人提出了COM,而且還借此對(duì)OLE 進(jìn)行架構(gòu),形成了更加實(shí)用的版本。本文結(jié)合既往研究實(shí)況,對(duì)模塊開發(fā)過程中部分常用技術(shù)作一剖析。
所謂連接庫,從根本上來講,就是由用戶自己所開發(fā),能夠根據(jù)現(xiàn)實(shí)需要加入到最終用戶應(yīng)用程序當(dāng)中,能夠提供一些特定功能或服務(wù)的類與函數(shù)的集合。在二次開發(fā)引信建模軟件過程中,本文結(jié)合實(shí)際需要,單獨(dú)構(gòu)建了一個(gè)符合要求的信號(hào)分析庫,對(duì)引信沖擊實(shí)驗(yàn)當(dāng)中所產(chǎn)生的各種數(shù)據(jù)進(jìn)行處理與分析;需要說明的是,之所以要單獨(dú)劃分,主要目的在于將模塊功能獨(dú)立出來,同時(shí)可以向其他需求較類似的系統(tǒng)提供,以達(dá)到重復(fù)使用的目的。
針對(duì)連接庫來講,其主要有兩大類型,其一為動(dòng)態(tài)連接庫,其二是靜態(tài)連接庫。對(duì)于靜態(tài)連接庫而言,其能夠根據(jù)實(shí)際需要,提供函數(shù)的完成目標(biāo)代碼,若程序需要對(duì)靜態(tài)連接庫當(dāng)中的函數(shù)進(jìn)行調(diào)用,那么在連接過程中,與之相配套的連接程序便會(huì)把靜態(tài)連接庫當(dāng)中與此函數(shù)相關(guān)的全部代碼均拷貝到運(yùn)行文件當(dāng)中。需要說明的是,因靜態(tài)連接庫把目標(biāo)代碼連接至應(yīng)用程序當(dāng)中,當(dāng)程序處于運(yùn)行狀態(tài),若兩個(gè)程序?qū)ν粋€(gè)靜態(tài)庫當(dāng)中的函數(shù)進(jìn)行了調(diào)用,那么在內(nèi)存當(dāng)中,把此函數(shù)進(jìn)行多份拷貝。而對(duì)于動(dòng)態(tài)連接庫而言,其對(duì)于多任務(wù)環(huán)境更為適用:如果兩個(gè)應(yīng)用程序?qū)ν粍?dòng)態(tài)連接庫當(dāng)中的同一個(gè)函數(shù)進(jìn)行了調(diào)用,那么內(nèi)存當(dāng)中僅保留此函數(shù)的一份拷貝,如此一來,內(nèi)存便會(huì)有更高的利用率。
對(duì)于連接連接庫而言,一般情況下,主要采用兩種方式,其一為隱式連接,其二是顯式連接。而重定義方式與函數(shù)聲明方式實(shí)際即為隱式連接方式,本文以顯式連接方式作為重點(diǎn),對(duì)其進(jìn)行相應(yīng)分析。在整個(gè)顯式連接架構(gòu)當(dāng)中,需要用到的函數(shù)主要有兩個(gè),其一為LoadLibrary 函數(shù),其二是GetProcAddress 函數(shù)。針對(duì)第一個(gè)來講,需要把所需要的動(dòng)態(tài)連接庫裝入其中,并且還需要返回庫的句柄;需要強(qiáng)調(diào)的是,若句柄<32,那么便會(huì)出現(xiàn)載入庫失敗的情況,而對(duì)于GetProcAddress 函數(shù)來講,實(shí)際就是利用函數(shù)名字,得到與之相對(duì)應(yīng)的函數(shù)地址,而借助此函數(shù)地址,便能對(duì)動(dòng)態(tài)連接庫當(dāng)中的函數(shù)進(jìn)行訪問;而在完成調(diào)用之后,需要采用FreeLibrary 函數(shù)將資源給釋放出來。
圖1:客戶用COM 組件的基本圖
比如信號(hào)函數(shù)庫,現(xiàn)以其為研究對(duì)象,對(duì)兩種庫的創(chuàng)建與使用作一分析;在實(shí)際操作中,首先要做的便時(shí)創(chuàng)建一個(gè)靜態(tài)庫,可通過Filе →Nеw 這一菜單的操作,將New 對(duì)話框給彈出來;然后從中選定Projects 標(biāo)簽,從其下拉的項(xiàng)目類型列表框當(dāng)中,點(diǎn)擊Win32 Static Library,并且將SigAsys 輸入至Name 當(dāng)中,借此向系統(tǒng)提示要?jiǎng)?chuàng)建一個(gè)靜態(tài)庫文件(SigAsys.lib)。此操作完成后,便可借助菜單(Projеct →Add to Projеct →Filеs),分別將源文件、頭文件以一種比較合理的方式,加入到SigAsys 工程當(dāng)中,并將需要進(jìn)行處理的函數(shù)添加其中,進(jìn)行小波分析以及傅立葉變換;最后,完成編譯連接操作后,于SigAsysebug 目錄下,便可以生成所需要的SigAsys.lib 文件。如此一來,便可生成靜態(tài)連接庫。還需要指出的是,當(dāng)用戶將最終的靜態(tài)連接庫進(jìn)行交付時(shí),僅需結(jié)合實(shí)際要求,提供頭文件與lib 文件,無需提供庫的源代碼。
通常情況下,用戶在設(shè)計(jì)用戶模塊時(shí),同傾向于采取擇動(dòng)態(tài)連接庫的方式,通過動(dòng)態(tài)連接庫的創(chuàng)建,可在Projects 標(biāo)簽頁當(dāng)中,選與之相匹配的“Win32 Dynamic-LinkLibrary"”。如此一來,VisualC++便會(huì)結(jié)合現(xiàn)實(shí)所需,創(chuàng)建工程文件與MAK 文件,以此來更好的滿足動(dòng)態(tài)連接庫的需要。
所謂COM,實(shí)際就是一種語言共享二進(jìn)制代碼與跨平臺(tái)應(yīng)用的方法,其所倡導(dǎo)的是源代碼重用。Windows 借助DLLs,于二進(jìn)制級(jí)事先代碼共享。但需強(qiáng)調(diào)的是,由于其圍繞C 接口而寫,所以,僅能被理解C 或C 進(jìn)行調(diào)用規(guī)范當(dāng)中的語言所使用。因共享代碼主要由編程語言來負(fù)責(zé)實(shí)現(xiàn),而并非DLLs,因此,DLLs 的實(shí)際使用便會(huì)遭到限制。針對(duì)COM 技術(shù)而言,其實(shí)際是基于C++的虛基類上而構(gòu)建,其中,最為核心的即為COM 接口與COM 對(duì)象,如果客戶程序要對(duì)COM 對(duì)象進(jìn)行訪問,那么借助COM 接口是唯一的途徑,而二者之間的調(diào)用關(guān)系見圖1 所示。
從圖1 中可得知,其右邊所代表的是由組件所引出的2 個(gè)接口,其中一個(gè)為IMyInterface1,另外一個(gè)是IMyInterface2,正是借助用戶程序,對(duì)這兩個(gè)接口進(jìn)行訪問,才使得COM 組件所給予的相關(guān)功能得到有效應(yīng)用;另外,在圖當(dāng)中,還設(shè)置有一個(gè)IUnknown 接口,此接口的主要作用就是實(shí)現(xiàn)COM 所對(duì)應(yīng)的一個(gè)重要接口,全部其它接口均繼承于此,能夠根據(jù)現(xiàn)實(shí)需要,提供三個(gè)十分關(guān)鍵的虛函數(shù),從而更好的系統(tǒng)運(yùn)作提供服務(wù)。
比如建立一個(gè)實(shí)例(CLSID_ShellLink 對(duì)象),且請(qǐng)求指向此對(duì)象所對(duì)應(yīng)的IShellLink 接口指針。本文需先借助CoCreateInstance(COM 庫函數(shù)),建立一個(gè)COM 實(shí)例,代碼如下:
其中,對(duì)于pISL 而言,其實(shí)際就是用戶定義所對(duì)應(yīng)的接口指針,如果用戶對(duì)此接口指針已經(jīng)得到,那么便能夠?qū)OM 實(shí)例對(duì)象的方法進(jìn)行調(diào)用,比如將POST 方法應(yīng)用于COM 組件當(dāng)中,便能將一個(gè)對(duì)話框彈出,此時(shí),可進(jìn)行如下調(diào)用:pISL →POST(); //調(diào)用POST 的方法。
針對(duì)此方法而言,其能夠?yàn)閂BA 接口(由OFFICE 系列軟件所提供)的調(diào)用提供助力,如果用戶需要對(duì)OFFICE 系列軟件進(jìn)行使用,基本方法為:自WORD 的類型庫當(dāng)中,將一個(gè)類型庫包裝類給導(dǎo)出來,然后按照標(biāo)準(zhǔn)次序(In-sеrt →AddNеw Class →From a type library),對(duì)其中的對(duì)象進(jìn)行引用,如此一來,便能夠?qū)⒋诵?duì)象連接在一起,并且均融合到客戶程序當(dāng)中。最后便可對(duì)對(duì)象實(shí)例進(jìn)行定義,然后借助實(shí)例進(jìn)行調(diào)用。
對(duì)于此種方法來講,其實(shí)為一種比較簡(jiǎn)便且使用的方法,其能夠借助指令,將類型庫文件直接導(dǎo)入,而在完成編譯后,便能夠生成兩個(gè)文件(后綴名分別為. TLI 與. TLH);此外,還能對(duì)與之相對(duì)應(yīng)的智能指針類型進(jìn)行定義,比如用ADO 對(duì)象與數(shù)據(jù)庫相連接,因ADO 對(duì)象實(shí)為一個(gè)比較典型的COM 對(duì)象,因此,可采用如下方法,在指定程序當(dāng)中進(jìn)行調(diào)用:#import"c:progammе filеSsystеm adomsado15.
當(dāng)對(duì)類型庫文件進(jìn)行引用后,便能夠借助由ADO 所提供的智能指針(_ConnectionPtr 類等),對(duì)方法函數(shù)進(jìn)行調(diào)用。
首先,有助于系統(tǒng)開發(fā)效率與可靠性的提升。針對(duì)可復(fù)用模塊化方法來講,其能夠?qū)ο到y(tǒng)模塊當(dāng)中的共性因素進(jìn)行提取,然后以此為基礎(chǔ),構(gòu)造能夠重復(fù)使用且功能獨(dú)立的模塊,比如設(shè)備管理信息當(dāng)中的打印模塊、轉(zhuǎn)儲(chǔ)模塊及查詢模塊等;為通過對(duì)此些模塊的構(gòu)建與使用,除了能使開發(fā)系統(tǒng)的難度與復(fù)雜性得到降低外,而且還有助于重復(fù)工作的減少;此外,還需要指出的是,通過此些標(biāo)準(zhǔn)程序通過長時(shí)間的運(yùn)行驗(yàn)證,有著比較高的可靠性,這對(duì)于提高軟件質(zhì)量有重要作用。其次,使系統(tǒng)變得更加具有可復(fù)用性與易組合性。通過采用模塊化方法,能使新系統(tǒng)的構(gòu)建過程,成為對(duì)各獨(dú)立可復(fù)用模塊實(shí)施組合與拼裝的過程;另外,還需要說明的是,各模塊無需進(jìn)行修改,或者僅需進(jìn)行簡(jiǎn)單修改便能使用,因而可使系統(tǒng)開發(fā)的靈活性得到大幅提升。再次,可讀性好,結(jié)構(gòu)清晰,而且還使系統(tǒng)的可維護(hù)性得到大幅提升。所謂系統(tǒng)的可維護(hù)性,從基礎(chǔ)層面來分析,其對(duì)系統(tǒng)的生命力尤為關(guān)鍵??蓮?fù)用模塊的軟件結(jié)構(gòu)層次性更為突出,另外,各模塊無論是在具體目標(biāo)上,還是在相關(guān)功能上,均更為明確;還需要指出的是,模塊自身處理程序有著比較好的可讀性與清晰度,各模塊易于維護(hù)與管理;而各個(gè)模塊間獨(dú)立性強(qiáng)。最后,促進(jìn)系統(tǒng)可擴(kuò)展性與適應(yīng)性的提升。通過采取可重用的模塊化設(shè)計(jì),除了囊括可重用的軟件成分外,還使軟件系統(tǒng)的可重用性更好,即便功能需求、環(huán)境等已經(jīng)發(fā)生改變,仍能在確保可靠穩(wěn)定的情況,通過適當(dāng)修改來適應(yīng)新的需求與環(huán)境。
綜上,可復(fù)用模塊化方法具有較好的復(fù)用性、模塊化與系統(tǒng)性特點(diǎn),其軟件工程開發(fā)中,有著突出的應(yīng)用價(jià)值與效能。需要指出的是,在整個(gè)軟件工程架構(gòu)當(dāng)中,模塊模塊為其中的一種較新興學(xué)科,其實(shí)際就是由事先構(gòu)造好的并且專門為重用而設(shè)計(jì)的軟件構(gòu)件,來組裝或建立軟件的一種技術(shù)類型。本文對(duì)軟件工作當(dāng)中的一些常用的模塊可重用技術(shù)進(jìn)行了簡(jiǎn)要分析,主要目的在于推動(dòng)此領(lǐng)域的完善與推新,使相關(guān)技術(shù)更好的服務(wù)與軟件工程建設(shè),推動(dòng)此領(lǐng)域的發(fā)展與完善。