国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

利用反射技術(shù)實(shí)現(xiàn)程序結(jié)構(gòu)優(yōu)化設(shè)計(jì)

2014-12-26 16:32:58陳海燕朱宇來林陽馬蕾?,?/span>
科技資訊 2014年28期
關(guān)鍵詞:數(shù)據(jù)類型命名實(shí)例

陳海燕 朱宇來 林陽 馬蕾 ?,?/p>

摘 要:在計(jì)算機(jī)應(yīng)用程序的開發(fā)過程中,軟件結(jié)構(gòu)的前期設(shè)計(jì)對代碼實(shí)現(xiàn)和后期維護(hù)、擴(kuò)展和升級(jí)等工作的影響重大,直接影響軟件的代碼編寫規(guī)模、可擴(kuò)展性等。良好的結(jié)構(gòu)設(shè)計(jì)能夠縮小軟件規(guī)模,提高代碼的復(fù)用率。其中,總線式結(jié)構(gòu)設(shè)計(jì)是維持軟件可擴(kuò)展性的一種方法。將軟件按功能設(shè)計(jì)為不同的模塊(插件),將這些模塊組合在一起,通過總線管理各個(gè)模塊協(xié)同工作。當(dāng)軟件需要擴(kuò)展時(shí),加入新模塊或更新舊模塊就可以實(shí)現(xiàn)。該文講述的是基于總線式的結(jié)構(gòu)設(shè)計(jì)方法,利用.NET框架中的反射(Reflection)機(jī)制對類型信息的描述能力,提出一種模塊組合結(jié)構(gòu)的優(yōu)化方法,用來增強(qiáng)軟件的可維護(hù)性,并保持對用戶自定義數(shù)據(jù)結(jié)構(gòu)的處理能力。

關(guān)鍵詞:軟件開發(fā) 結(jié)構(gòu)設(shè)計(jì) 模塊 總線 插件 優(yōu)化 C# NET 反射

中圖分類號(hào):TH703 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2014)10(a)-0021-02

計(jì)算機(jī)技術(shù)發(fā)展至今,程序結(jié)構(gòu)設(shè)計(jì)思想已經(jīng)逐步成熟。面向?qū)ο蟪绦蛟O(shè)計(jì)、模塊化設(shè)計(jì)等概念已經(jīng)深入人心。應(yīng)用程序的可維護(hù)性已經(jīng)成為衡量軟件質(zhì)量的重要標(biāo)準(zhǔn)。增強(qiáng)程序的可維護(hù)性可通過良好的結(jié)構(gòu)設(shè)計(jì)、模塊化的功能區(qū)分等方法實(shí)現(xiàn)。結(jié)構(gòu)設(shè)計(jì)越清晰,模塊間的耦合度越低、相關(guān)程度越小,程序的可拆分、可組件、可擴(kuò)展的能力越強(qiáng)??偩€—插件式的程序結(jié)構(gòu)設(shè)計(jì)是提高軟件質(zhì)量的重要方法??偩€負(fù)責(zé)各個(gè)模塊的加載、事務(wù)的調(diào)度、資源的分配和消息的管理等。模塊(插件)是一種獨(dú)立的功能單元,完成總線安排的事務(wù)處理、數(shù)據(jù)轉(zhuǎn)換工作。這樣的方法避免了功能修改、擴(kuò)展時(shí),局部功能的改動(dòng)需要修改大量與之相關(guān)的代碼,只需要改動(dòng)模塊這個(gè)功能單元就可以實(shí)現(xiàn)了。這種程序設(shè)計(jì)方法就好比是PC機(jī)的硬件結(jié)構(gòu),主板是所有硬件的平臺(tái),通過主板總線完成各硬件間的消息、數(shù)據(jù)傳遞,進(jìn)行功能組合。若要升級(jí)計(jì)算機(jī)的性能,功能等,只需要升級(jí)個(gè)別部件,或插入特定功能的擴(kuò)展硬件就可以了。

1 模塊獨(dú)立性

模塊的獨(dú)立性越強(qiáng),其靈活程度越低。也就是說為了保證模塊的獨(dú)立性,必須不與其他模塊或類型產(chǎn)生依賴關(guān)系,函數(shù)的參數(shù)不能使用其他模塊中的定義類型。所以,使用通用性強(qiáng)的變量類型作為模塊的出入口參數(shù)能夠保證其較高的獨(dú)立性。但在以處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)為核心功能的大型應(yīng)用程序(如地理信息系統(tǒng)、圖形處理系統(tǒng)等)中,每一個(gè)功能模塊都圍繞著復(fù)雜數(shù)據(jù)類型(空間數(shù)據(jù)、圖形數(shù)據(jù)等)進(jìn)行設(shè)計(jì)。若將模塊中處理復(fù)雜數(shù)據(jù)類型的函數(shù)參數(shù)設(shè)計(jì)為自定義的復(fù)雜數(shù)據(jù)類型,必然產(chǎn)生對此種數(shù)據(jù)結(jié)構(gòu)的依賴,模塊獨(dú)立性大幅下降。若將參數(shù)設(shè)計(jì)為簡單變量,則失去了定義這個(gè)復(fù)雜數(shù)據(jù)類型的初衷,可理解性變差,反而使程序開發(fā)變得復(fù)雜。若將此數(shù)據(jù)類型作為公用類型,讓所有模塊都可訪問,雖然既保證了函數(shù)參數(shù)的通用性,也方便了數(shù)據(jù)處理,但必然會(huì)受到這個(gè)公用數(shù)據(jù)類型的限制,這個(gè)數(shù)據(jù)類型的改動(dòng)將涉及所有模塊的代碼重寫,直接降低了程序的可擴(kuò)展性能。

2 結(jié)構(gòu)優(yōu)化原則

該文探討一種模塊的優(yōu)化組合方法,在面對復(fù)雜數(shù)據(jù)結(jié)構(gòu)的情況下,能夠提高模塊的獨(dú)立性。這種方法以總線式結(jié)構(gòu)為基礎(chǔ),利用Microsoft.NET Framework的反射機(jī)制作,管理模塊加載和配置,達(dá)到程序的深層次修改和模塊多維擴(kuò)展的目標(biāo)。此方法遵循的原則是:(1)靈活的模塊組合方式。模塊組合的方法操作簡單,結(jié)構(gòu)靈活,方式多樣,加載的方式必須一致。不僅要求模塊可替換、可擴(kuò)展,還能實(shí)現(xiàn)新老版本模塊的交替使用。(2)明確的模塊間相互依賴關(guān)系。所有模塊不能依賴于下層模塊里的類、屬性、字段、方法等,只能依賴上層模塊。所有模塊之間的關(guān)聯(lián),必須是松耦合關(guān)聯(lián),并且關(guān)聯(lián)方式必須通過頂層模塊調(diào)用。(3)簡潔的接口設(shè)計(jì)。簡化總線和固定模塊的功能,減小接口的數(shù)量和規(guī)模,強(qiáng)化組件、工具的功能,工具的使用必須采用一致的接口調(diào)用。

3 程序結(jié)構(gòu)設(shè)計(jì)優(yōu)化

根據(jù)軟件的業(yè)務(wù)邏輯模型,將模塊各部件封裝成類,變?yōu)楠?dú)立的整體單元,自上而下的將模塊組合設(shè)計(jì)為層次結(jié)構(gòu),可用樹形結(jié)構(gòu)描述。樹形結(jié)構(gòu)的根節(jié)點(diǎn)位置模塊,就是系統(tǒng)總線??偩€并不負(fù)責(zé)所有子模塊的加載,子模塊的加載工作交給另一個(gè)中間件完成??偩€只是一個(gè)容器,提供所有模塊的存儲(chǔ)空間和總線資源的引用方法。將總線也設(shè)計(jì)為模塊,若系統(tǒng)功能改變,總線也可以像其他子模塊一樣,進(jìn)行替換。模塊加載中間件邏輯上位于兩個(gè)模塊中間,實(shí)現(xiàn)宿主模塊和多個(gè)子模塊關(guān)聯(lián)。它為宿主模塊提供子模塊的加載方法,并規(guī)范子模塊,使之符合被載入條件。為了敘述方便,將這個(gè)中間件命名為ModuleLoader,它繼承于被命名為IBus的資源調(diào)用接口,讓被載入子模塊通過接口能夠向上搜索,找到樹形結(jié)構(gòu)的根節(jié)點(diǎn)—總線,子模塊通過總線調(diào)用其模塊的各種功能。ModuleLoader的核心部件是其內(nèi)部維護(hù)了一個(gè)可加載類型的配置列表,當(dāng)向模塊中插入下級(jí)模塊時(shí),只需要向此表中添加一個(gè)類型,由ModuleLoader自動(dòng)完成對這個(gè)類型的所有繼承類型的掃描,并選擇符合條件的加載類型,進(jìn)行實(shí)例化。軟件框架搭建時(shí),讓所有可擴(kuò)展的模塊基類都繼承于ModuleLoader類型,模塊的擴(kuò)展采用繼承的方法。這樣,所有的模塊都具備載入其它模塊和被載入的功能,并且載入的模塊可以被選擇和配置。開發(fā)者可以實(shí)現(xiàn)任意兩個(gè)模塊之間的從屬結(jié)構(gòu)關(guān)聯(lián),從而構(gòu)成復(fù)雜的程序框架結(jié)構(gòu)。

4 ModuleLoader的設(shè)計(jì)

ModuleLoader的關(guān)鍵功能是實(shí)現(xiàn)模塊的動(dòng)態(tài)加載。其原理是它實(shí)現(xiàn)了對模塊子類的掃描功能,這種掃描功能利用了.NET Framework提供的反射機(jī)制(Reflection),該項(xiàng)可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類型(包括類、結(jié)構(gòu)、委托、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等。樹形結(jié)構(gòu)中的每個(gè)ModuleLoader中都內(nèi)含擴(kuò)展類型配置集,利用反射的功能,掃描配置集中類型的子類信息,檢查配置狀態(tài),當(dāng)條件符合時(shí),創(chuàng)建這個(gè)類型的實(shí)現(xiàn),加入到實(shí)例列表中。當(dāng)需要擴(kuò)展一個(gè)模塊時(shí),只需要修改其宿主模塊的配置集信息,ModuleLoader會(huì)自動(dòng)搜索到這個(gè)類,實(shí)例化該類型,替換原有模塊。ModuleLoader由兩部分組成:(1)配置工具部分包括:用于存儲(chǔ)所有的可擴(kuò)展類型和狀態(tài)的集合、用于獲取模塊子類信息的掃描工具、用于自動(dòng)創(chuàng)建配置集信息的構(gòu)造器和用于配置集信息設(shè)計(jì)和獲取的配置器。(2)實(shí)例化工具部分包括:用于保存所有子模塊實(shí)例的對象列表、用于根據(jù)配置集信息創(chuàng)建模塊實(shí)例的構(gòu)造工具、用于增加、刪除、替換模塊實(shí)例的管理工具和用于獲取用戶所需子模塊實(shí)例的對象提取工具。這兩大部分協(xié)同操作,使ModuleLoader不僅可以加載、管理不同類型的多種模塊,也可實(shí)現(xiàn)對模塊不同版本的交替使用,使程序框架中模塊的組合方式更加靈活。

5 命名空間的依賴性

為了提高模塊的獨(dú)立性,消除模塊間的病態(tài)關(guān)聯(lián),必須明確規(guī)范模塊間的相互依賴關(guān)系。利用命名空間的可視范圍來限制模塊間相互依賴的規(guī)范方法是可取的。因?yàn)橄聦用臻g的對象可以訪問上層命名空間的類型,而上層命名空間的對象是無法訪問到下層以及同層其他命名空間的對象資源的。根據(jù)軟件結(jié)構(gòu)的邏輯關(guān)系,確定命名空間的層次,順序,范圍。當(dāng)結(jié)構(gòu)下層的模塊使用另一個(gè)命名空間的模塊時(shí),必須通過ModuleLoader訪問頂層的IBus接口調(diào)用其它模塊對象。并且規(guī)定不準(zhǔn)使用對下層或同層其他命名空間的直接引用。這樣的規(guī)范方法,能夠保證所有調(diào)用都通過頂層總線,避免了模塊之間的非邏輯性關(guān)聯(lián),在一定程序上提高了模塊的獨(dú)立性。

6 接口設(shè)計(jì)

若說命名空間為模塊之間的訪問設(shè)置了阻礙,則接口設(shè)計(jì)就是在不可視的模塊之間搭建了相互使用的橋梁,讓其間產(chǎn)生了相互使用的可能。所以模塊的接口應(yīng)位于命名空間的較高層次,確保特定功能范圍內(nèi)的可視性。接口一旦定義,一般不輕易修改。因此,為通用性高的核心固定模塊設(shè)計(jì)接口,將使用率低,通用性不高的功能設(shè)計(jì)為工具,所有工具只設(shè)計(jì)一種接口的方法較為合理。工具集內(nèi)部也可以按功能設(shè)計(jì)為層次關(guān)系,并用動(dòng)態(tài)加載的方式進(jìn)行管理。但工具的使用必須采用統(tǒng)一的接口調(diào)用方法。這樣的設(shè)計(jì)能夠減少接口的數(shù)量,控制固定接口的規(guī)模,減少接口擴(kuò)展時(shí)的代碼編寫工作量,從而達(dá)到優(yōu)化程序結(jié)構(gòu)的目的。

7 數(shù)據(jù)結(jié)構(gòu)調(diào)用

數(shù)據(jù)結(jié)構(gòu)是決定模塊獨(dú)立性的重要關(guān)鍵問題。在專業(yè)軟件中,多種基本數(shù)據(jù)類型聚合為復(fù)雜的數(shù)據(jù)類型,這種復(fù)雜數(shù)據(jù)類型符合軟件業(yè)務(wù)功能的邏輯模型,能夠便于被各模塊分析、處理。但是數(shù)據(jù)類型一經(jīng)定義,很難擴(kuò)展。當(dāng)大量模塊都使用此種數(shù)據(jù)類型時(shí),增加、改變其中的一個(gè)變量的名稱就可能涉及大量模塊的改動(dòng)。所以數(shù)據(jù)類型經(jīng)邏輯分析組裝好后,也可為其設(shè)計(jì)接口,模塊通過接口調(diào)用復(fù)雜數(shù)據(jù)類型的對象。只要接口不改變,即使數(shù)據(jù)類型變化,所有的模塊還能通接口調(diào)用的方式,對數(shù)據(jù)類型繼承訪問。但使用這種方法時(shí)要注意兩個(gè)問題:(1)若在子模塊中創(chuàng)建復(fù)雜數(shù)據(jù)類型的實(shí)例時(shí),應(yīng)利用ModuleLoader提供的方法動(dòng)態(tài)創(chuàng)建數(shù)據(jù)類型的實(shí)例,并轉(zhuǎn)換為接口類型使用。(2)接口中可能會(huì)變化的屬性,最好使用泛型集合類型定義。模糊化了的屬性類型,能夠保證數(shù)據(jù)類型的擴(kuò)展,不會(huì)某些固定類型的限制,否則也不會(huì)達(dá)到數(shù)據(jù)類型可擴(kuò)展的目的。

8 效率分析

由于對象的多層次引用和動(dòng)態(tài)創(chuàng)建,配置集的頻繁搜索,大量的封箱、拆箱操作等,必然會(huì)犧牲軟件運(yùn)行的時(shí)間和空間效率。但用這種犧牲換取的是良好的模塊封閉性和結(jié)構(gòu)的緊湊性。而且,由于復(fù)雜的動(dòng)態(tài)管理功能被封裝在ModuleLoader里,所以在開發(fā)、使用層次的實(shí)際操作變得十分簡單,犧牲運(yùn)行效率的過程一般發(fā)生在初始化環(huán)境、事務(wù)高度和模塊運(yùn)行的起始環(huán)節(jié),在飛速更新的計(jì)算機(jī)硬件上已經(jīng)顯得微不足道。實(shí)際上,工程師更關(guān)心軟件的結(jié)構(gòu)、擴(kuò)展性和局部操作性能(如空間數(shù)據(jù)的顯示、處理效率),只有對局部模塊內(nèi)部的功能不斷優(yōu)化、升級(jí)、擴(kuò)展,才能真正提高軟件的運(yùn)行效率,而這樣的優(yōu)化和升級(jí)必須建立在良好的結(jié)構(gòu)基礎(chǔ)之上的。

9 結(jié)語

開放的結(jié)構(gòu)、靈活的擴(kuò)展方式、彈性的組合方法讓軟件框架結(jié)構(gòu)的組織變得更加清晰、緊湊,延長了軟件的生命周期。結(jié)構(gòu)設(shè)計(jì)讓程序開發(fā)工作能夠產(chǎn)生良性的優(yōu)化機(jī)制,讓開發(fā)者能夠始終站在巨人的肩膀上,精益求精,不斷創(chuàng)造奇跡,讓工程師有精力將注意力由開發(fā)技術(shù)研究轉(zhuǎn)化為開發(fā)工藝研究。云計(jì)算的時(shí)代即將到來,優(yōu)化模塊結(jié)構(gòu)不僅適用于桌面應(yīng)用程序,也適用于云端服務(wù)單元的創(chuàng)建,在“軟件—服務(wù)”這一思潮涌來之時(shí)也將大有作為。

參考文獻(xiàn)

[1] 馬蕾.基于改進(jìn)身份認(rèn)證協(xié)議的單點(diǎn)登錄系統(tǒng)研究[J].微電子學(xué)馬計(jì)算機(jī),2010,29(7):180-183.

猜你喜歡
數(shù)據(jù)類型命名實(shí)例
詳談Java中的基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
命名——助力有機(jī)化學(xué)的學(xué)習(xí)
如何理解數(shù)據(jù)結(jié)構(gòu)中的抽象數(shù)據(jù)類型
有一種男人以“暖”命名
東方女性(2018年3期)2018-04-16 15:30:02
為一條河命名——在白河源
散文詩(2017年17期)2018-01-31 02:34:08
完形填空Ⅱ
完形填空Ⅰ
基于PBBLOB實(shí)現(xiàn)的文件操作
在.NET環(huán)境下進(jìn)行nashRemoting開發(fā)
牟定县| 衡水市| 白银市| 商洛市| 运城市| 伊金霍洛旗| 广水市| 桃江县| 遂溪县| 睢宁县| 巴马| 黄石市| 蚌埠市| 和平区| 凤山县| 武乡县| 汝南县| 库尔勒市| 江口县| 文水县| 沈丘县| 房产| 新余市| 宜城市| 化州市| 都江堰市| 英吉沙县| 巴林右旗| 阳新县| 平潭县| 上饶市| 柘荣县| 新民市| 神池县| 广灵县| 城固县| 连山| 修武县| 白银市| 扎鲁特旗| 舟曲县|