999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

插件化軟件開發(fā)方法初探

2018-01-22 01:48:39趙才文
電腦與電信 2017年11期
關(guān)鍵詞:定義方法

趙才文

(亞信科技(成都)有限公司,江蘇 南京 210003)

1 引言

隨著軟件市場的不斷開拓,企業(yè)開發(fā)的軟件產(chǎn)品會(huì)在越來越多的市場進(jìn)行部署。一般情況下,為了減少成本,企業(yè)會(huì)盡量重復(fù)使用現(xiàn)有的開發(fā)人員和產(chǎn)品代碼庫。使用一套產(chǎn)品進(jìn)行部署,雖然能夠滿足大多數(shù)市場的需求,但是某些市場會(huì)有自己的特殊需求,需要軟件企業(yè)為其定制開發(fā)某些功能。由于企業(yè)的人力資源有限,不可能針對每個(gè)市場進(jìn)行完全定制化的研發(fā),這就必然要求企業(yè)具備一種靈活的軟件擴(kuò)展開發(fā)方法,在支持產(chǎn)品化研發(fā)的同時(shí),也能夠支持業(yè)務(wù)的靈活擴(kuò)展,以達(dá)到通過最少的資源支撐最多市場的目的。

2 現(xiàn)有軟件擴(kuò)展方式比較

通過研究,目前比較通用的軟件擴(kuò)展方式主要包含表1所列示的六種方式。

通過對上述軟件擴(kuò)展方法的分析,我們可以得到一個(gè)結(jié)論:最佳的軟件擴(kuò)展方式既有一定的靈活性,又比較容易開發(fā)和部署,容易落地,這樣的擴(kuò)展方式才能有效地被推廣。即一個(gè)好的軟件擴(kuò)展架構(gòu)應(yīng)該具有如下特點(diǎn):

第一,核心模塊和擴(kuò)展點(diǎn)邊界清晰。即軟件中的可擴(kuò)展點(diǎn)和不可擴(kuò)展點(diǎn)的邊界應(yīng)該清晰,開發(fā)人員和運(yùn)維人員容易識別。

第二,擴(kuò)展點(diǎn)要足夠細(xì)粒度。要能夠提供業(yè)務(wù)邏輯任意分支點(diǎn)的擴(kuò)展功能,也就是說擴(kuò)展點(diǎn)能對應(yīng)到代碼行。

第三,支持多層級的擴(kuò)展方式。軟件的擴(kuò)展應(yīng)能夠遞進(jìn)地被擴(kuò)展,即能夠?qū)崿F(xiàn)擴(kuò)展的擴(kuò)展,以達(dá)到能夠基于現(xiàn)有擴(kuò)展進(jìn)行再次擴(kuò)展的效果。

表1 常見軟件擴(kuò)展方式及特點(diǎn)

第四,容易實(shí)現(xiàn),易于配置。能夠提供簡單的擴(kuò)展技術(shù)方案,適合現(xiàn)在初級開發(fā)工程師的開發(fā)水平,且能夠簡單配置。

“插件化軟件開發(fā)方法”能夠較好地解決軟件擴(kuò)展的控制粒度,具備清晰的軟件擴(kuò)展邊界。這種技術(shù)的主要特點(diǎn)如下:

(1)定義嚴(yán)謹(jǐn),邊界清晰:基于擴(kuò)展點(diǎn)(Extension Point)和擴(kuò)展(Extension)的定義實(shí)現(xiàn)軟件功能的擴(kuò)展,嚴(yán)格區(qū)分軟件的核心模塊和擴(kuò)展之間的邊界。

(2)與業(yè)務(wù)邏輯結(jié)合緊密且能靈活調(diào)整:業(yè)務(wù)邏輯中任意位置可以定義擴(kuò)展點(diǎn)以實(shí)現(xiàn)擴(kuò)展,并且能夠按照需求的變更進(jìn)行調(diào)整,非常靈活。

(3)支持多層級的擴(kuò)展方式:可以在擴(kuò)展的基礎(chǔ)上增加擴(kuò)展點(diǎn),實(shí)現(xiàn)多層級的擴(kuò)展。

(4)擴(kuò)展的開發(fā)和管理比較簡單:通過一個(gè)簡單的對接口的實(shí)現(xiàn),即可完成功能的擴(kuò)展,通過一個(gè)配置文件實(shí)現(xiàn)不同插件的切換,比較容易落地。

3 插件化開發(fā)方法的基本原理

插件化開發(fā)方法和傳統(tǒng)擴(kuò)展方式的不同,在于當(dāng)遇到市場需求變化的時(shí)候,采用基于插件的開發(fā)方式來進(jìn)行擴(kuò)展功能開發(fā)。

3.1 插件的要素

插件化開發(fā)中包括插件、擴(kuò)展點(diǎn)和擴(kuò)展等要素。插件(Plug-in)是指擴(kuò)展點(diǎn)和擴(kuò)展的集合。擴(kuò)展點(diǎn)(Extension Point)代表軟件可被擴(kuò)展的功能點(diǎn)。采用接口方式定義,可以定義缺省實(shí)現(xiàn),一個(gè)擴(kuò)展點(diǎn)可以有多個(gè)擴(kuò)展實(shí)現(xiàn)。擴(kuò)展(Extension)代表擴(kuò)展點(diǎn)接口的實(shí)現(xiàn),基于擴(kuò)展點(diǎn)定義。一個(gè)插件可以包含N個(gè)擴(kuò)展點(diǎn)和擴(kuò)展,一個(gè)擴(kuò)展點(diǎn)可以有N個(gè)擴(kuò)展實(shí)現(xiàn)。這些要素之間的關(guān)系如圖1所示。

圖1 插件要素之間的關(guān)系

3.2 插件類加載方式

插件通過自定義的類加載方式以支持動(dòng)態(tài)的類擴(kuò)展能力,具體類調(diào)用序列圖如圖2所示。

圖2 類調(diào)用序列圖

具體調(diào)用過程如下:PluginUtils類被調(diào)用獲取某個(gè)擴(kuò)展點(diǎn)(Extension Point)對應(yīng)的擴(kuò)展(Extension)的方法,此類直接調(diào)用對應(yīng)的擴(kuò)展(Extension)的實(shí)例;擴(kuò)展(Extension)從PluginClassLoader類加載器加載對應(yīng)的類對象;插件類加載器(PluginClassLoader)獲取對象實(shí)例后,返回給擴(kuò)展(Extension);擴(kuò)展(Extension)返回給PluginUtils,PluginUtils返回給調(diào)用者,調(diào)用者相當(dāng)于調(diào)用了定制化的插件實(shí)現(xiàn)。需要注意的是,其中的PluginClassLoader是一個(gè)繼承自URLClass-Loader的自定義類加載器,將插件的依賴在運(yùn)行期動(dòng)態(tài)加入到系統(tǒng)類加載路徑中,這樣就可以通過loadClass方法獲取擴(kuò)展(Extension)中定義的擴(kuò)展對象實(shí)例。

3.3 配置插件的方法

要配置一個(gè)新的插件,需要增加如下配置:

(1)增加plugin.xml文件,定義插件的信息,包括擴(kuò)展點(diǎn)的定義和擴(kuò)展的定義,每個(gè)擴(kuò)展點(diǎn)還可以定義缺省實(shí)現(xiàn)類。

(2)增加plugin.properties文件,定義項(xiàng)目中使用的插件列表。

3.4 已有產(chǎn)品的重構(gòu)要求

對已有的產(chǎn)品,如果要使用插件化開發(fā)方法,在設(shè)計(jì)上要注意下面幾點(diǎn):

(1)對可擴(kuò)展的業(yè)務(wù)邏輯抽象出接口,并將原有實(shí)現(xiàn)邏輯作為該接口的缺省實(shí)現(xiàn)。

(2)調(diào)用PluginUtils工具類執(zhí)行基于插件的業(yè)務(wù)邏輯。

4 軟件擴(kuò)展場景

在某個(gè)產(chǎn)品的賬號管理模塊中,賬號添加流程如下:用戶登錄后,點(diǎn)擊賬號管理,添加賬號完成后,點(diǎn)擊提交,賬號信息被提交到后臺,直接保存到數(shù)據(jù)庫,新賬號自動(dòng)啟用。如果此產(chǎn)品被部署到某個(gè)新增的市場,用戶提出了一個(gè)新需求,在添加賬號的時(shí)候不要自動(dòng)啟用,要先發(fā)短信通知管理員,管理員確認(rèn)同意后才可以啟用此新增帳號,以防繞過管理員隨意添加賬號。這個(gè)新增的流程就需要基于已有產(chǎn)品代碼進(jìn)行擴(kuò)展。

現(xiàn)有的類和實(shí)現(xiàn)主要包括三個(gè)部分:(1)領(lǐng)域?qū)ο髮觗omain層的Account實(shí)體類:代表賬號實(shí)體對象,包含id,name,enabled等基本屬性。(2)數(shù)據(jù)訪問層dao層的AccountDao對象:代表數(shù)據(jù)庫訪問對象,提供賬號對象的增加、刪除、修改和查詢方法。(3)業(yè)務(wù)實(shí)現(xiàn)層service層的AccountService對象:代表業(yè)務(wù)邏輯對象,為前臺頁面提供業(yè)務(wù)處理方法,例如增加賬號的業(yè)務(wù)邏輯。service層調(diào)用dao層提供的方法來實(shí)現(xiàn)賬號管理的數(shù)據(jù)庫入庫功能。

4.1 傳統(tǒng)擴(kuò)展方案

在未引入插件化開發(fā)方法之前,通常采用的軟件擴(kuò)展方法是基于類繼承的擴(kuò)展方式。用戶提出了賬號新增流程的擴(kuò)展需求后,我們需要對AccountService.java進(jìn)行改造。(1)新建一個(gè)包:service_a包,用于存放A市場的定制需求。(2)在service_a包中新建類AccountService,實(shí)現(xiàn)定制化的新增賬號業(yè)務(wù)邏輯:即新增賬號缺省為不啟用狀態(tài),先發(fā)消息通知管理員,等管理員確認(rèn)短信后,再改為啟用狀態(tài)。(3)新增針對A市場的前端賬號管理頁面,調(diào)用新增的service_a包中的定制業(yè)務(wù)邏輯代碼。(4)打包部署到現(xiàn)場后,用戶需求得到滿足。

通過上述演示,我們很容易想到如下問題:

(1)傳統(tǒng)方法采用的是先復(fù)制,再修改的方法進(jìn)行擴(kuò)展,而且復(fù)制的級別是類級別,導(dǎo)致大量的重復(fù)代碼。

(2)目前是A省提出定制開發(fā)需求,如果B/C/D…..省也提出定制需求,那么需要復(fù)制的代碼就會(huì)越來越多,代碼重復(fù)的情況越來越嚴(yán)重,導(dǎo)致軟件越來越臃腫,難以維護(hù)。

(3)如果某省覺得A省提出的這個(gè)需求很好,也想在本省采用,那么要把這次代碼都拷貝一份到B/C/D……省的工程中,工作量很大。

(4)因?yàn)閺?fù)制了大量的代碼,如果在復(fù)制的代碼中發(fā)現(xiàn)了一個(gè)軟件缺陷(Bug),那么開發(fā)人員必須在所有復(fù)制的代碼中修改一遍,修改量很大,然后測試人員也必須在每個(gè)版本中測試一遍,測試工作量也很大。

隨著市場的增加,這種基于類繼承復(fù)制的擴(kuò)展方式必然要求越來越多的人員投入,并且不能快速應(yīng)對需求變更,隨之而來的是用戶的滿意度降低甚至是市場份額的丟失。

4.2 插件化開發(fā)方案

使用插件化開發(fā)方式,首先應(yīng)該將A省定制的賬號管理需求變?yōu)橐粋€(gè)可以重用的插件,并且這個(gè)插件是獨(dú)立的,可以按需配置,這樣其他省可以使用“通用版本+功能插件”的方式達(dá)到擁有此功能的目的。

為了使用插件開發(fā),必須使用接口(即擴(kuò)展點(diǎn))的方式進(jìn)行方法調(diào)用,所以我們將AccountService這個(gè)要擴(kuò)展的類進(jìn)行接口化改造,增加一個(gè)IAccountService接口,同時(shí)增加一個(gè)插件工具類PluginUtils,提供獲取插件實(shí)例的方法。表2對每個(gè)新增、修改的類和接口進(jìn)行了基本介紹。

上述用戶管理的插件開發(fā)場景調(diào)用過程如下:

(1)客戶端調(diào)用AccountService對象的addAccount方法;

(2)AccountService調(diào)用了PluginUtils的getExtensionInstance方法,獲取擴(kuò)展點(diǎn)IAccountService當(dāng)前配置的插件實(shí)例;

(3)AccountService獲取IAccountService擴(kuò)展點(diǎn)實(shí)例后,調(diào)用其addAccount方法實(shí)現(xiàn)具體業(yè)務(wù)邏輯。

通過上述分析,可以看到,調(diào)用者并不知道調(diào)用了哪個(gè)具體插件,只是通過PluginUtils工具類得到插件實(shí)例后調(diào)用其擴(kuò)展點(diǎn)接口方法。這樣就實(shí)現(xiàn)了調(diào)用者和實(shí)現(xiàn)者的解耦,便于切換不同的實(shí)現(xiàn)。

5 插件化開發(fā)方法的優(yōu)缺點(diǎn)分析

5.1 插件開發(fā)方法的優(yōu)勢

根據(jù)上面的描述,我們可以看出插件化軟件擴(kuò)展方法具備下面的一些優(yōu)點(diǎn):

表2 插件開發(fā)場景關(guān)鍵類和接口

(1)插件的開發(fā)可以和原工程的開發(fā)分離,這樣就可以區(qū)分產(chǎn)品核心開發(fā)團(tuán)隊(duì)和擴(kuò)展開發(fā)團(tuán)隊(duì);也就是說,插件化整體工程的結(jié)構(gòu)分為一個(gè)主工程和多個(gè)插件工程,在主工程中定義了多個(gè)擴(kuò)展點(diǎn)和缺省實(shí)現(xiàn);而在其他獨(dú)立的插件工程中,則定義了一些擴(kuò)展點(diǎn)對應(yīng)的擴(kuò)展;這樣可以針對不同的開發(fā)人員分配不同的代碼讀寫權(quán)限,區(qū)分產(chǎn)品研發(fā)組和插件研發(fā)組,將定制開發(fā)和主版本開發(fā)嚴(yán)格區(qū)分開來,有利于進(jìn)行細(xì)粒度的產(chǎn)品研發(fā)管控,提升產(chǎn)品開發(fā)效率和質(zhì)量。

(2)概念清晰,具備嚴(yán)格的插件、擴(kuò)展點(diǎn)、擴(kuò)展定義方式;在傳統(tǒng)擴(kuò)展方式中,因?yàn)闆]有獨(dú)立的擴(kuò)展概念,開發(fā)人員需要熟悉各種不同的擴(kuò)展方式,比如基于配置文件擴(kuò)展,需要開發(fā)人員和維護(hù)人員熟悉配置文件的屬性定義方式,而這些定義沒有一定的規(guī)則,容易混亂。插件方式則不同,擴(kuò)展點(diǎn)和擴(kuò)展的定義都是在XML中采用固定格式定義,相關(guān)人員熟悉非常快速。

(3)擴(kuò)展點(diǎn)隨意選擇,選擇后進(jìn)行重構(gòu)即可使用插件方式;傳統(tǒng)的開發(fā)方式只能基于已有的API或者配置規(guī)則進(jìn)行擴(kuò)展,基于插件的擴(kuò)展方式則可以在任意代碼行定義擴(kuò)展點(diǎn),也就是說,插件擴(kuò)展點(diǎn)的控制力度可以在代碼的任意行,比傳統(tǒng)方式遞進(jìn)了一個(gè)層級。

(4)調(diào)試和部署簡單方便;傳統(tǒng)方式下,擴(kuò)展代碼和產(chǎn)品代碼揉和在一起,難以區(qū)分和管理。插件擴(kuò)展方式則采用獨(dú)立的打包方式,也就是每個(gè)插件進(jìn)行單獨(dú)打包,然后部署,非常容易區(qū)分和部署。

5.2 插件化開發(fā)方法的缺點(diǎn)和應(yīng)對方法

當(dāng)然,插件開發(fā)也不是非常完美的方案,目前還有下列的不足:首先是目前還不支持前臺頁面插件,當(dāng)前的插件開發(fā)主要是針對后臺代碼進(jìn)行設(shè)計(jì)的,還不支持前端頁面的插件,這個(gè)問題可以用打包的方式暫時(shí)解決,即將需要擴(kuò)展的頁面文件、圖片、腳本等資源在打包的時(shí)候拷貝到主工程。其次目前插件開發(fā)還不支持熱部署,每次更新插件配置后需要重啟整個(gè)應(yīng)用才可以加載最新的插件,這個(gè)問題可以通過增加額外的自動(dòng)定期加載程序?qū)崿F(xiàn)插件的自動(dòng)化熱加載。

6 結(jié)束語

綜上所述,插件化開發(fā)是一種簡便易行的軟件擴(kuò)展方法,通過在軟件中定義擴(kuò)展點(diǎn)和擴(kuò)展,進(jìn)而組織為插件進(jìn)行部署,可以實(shí)現(xiàn)軟件核心模塊和軟件定制模塊的分離。當(dāng)然,這種軟件擴(kuò)展方式也有各種不足,需要我們在實(shí)踐中不斷進(jìn)行完善。不同的軟件產(chǎn)品對擴(kuò)展方式的要求也是不同的,不能一切照搬,需要按照實(shí)際情況進(jìn)行選擇。

[1]劉婧.電信行業(yè)自助終端支撐系統(tǒng)架構(gòu)研究[D].西安:西安電子科技大學(xué),2009.

[2]王麗華,王治民,任雁銘,等.插件化I E C 61850通信模塊設(shè)計(jì)與實(shí)現(xiàn)[J].電力系統(tǒng)自動(dòng)化,,2012,36(5):82-85.

猜你喜歡
定義方法
永遠(yuǎn)不要用“起點(diǎn)”定義自己
海峽姐妹(2020年9期)2021-01-04 01:35:44
定義“風(fēng)格”
學(xué)習(xí)方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
修辭學(xué)的重大定義
山的定義
主站蜘蛛池模板: 狠狠色丁香婷婷| 国产精品亚洲一区二区三区z| 亚洲三级a| 亚洲av片在线免费观看| 国产成人亚洲综合a∨婷婷| v天堂中文在线| 丝袜亚洲综合| 在线观看无码av五月花| 99久久亚洲综合精品TS| 国产chinese男男gay视频网| 亚洲av无码专区久久蜜芽| 亚洲成a人片77777在线播放| 青青久视频| 午夜福利亚洲精品| 亚洲成人网在线播放| 亚洲伊人天堂| 四虎永久在线视频| 91色在线观看| 亚洲美女视频一区| 999国内精品视频免费| 久久综合伊人77777| 少妇高潮惨叫久久久久久| 午夜啪啪福利| 亚洲人成网站观看在线观看| 国产第一福利影院| 亚洲人成网站观看在线观看| 伊人五月丁香综合AⅤ| 激情無極限的亚洲一区免费| 国产激情第一页| 狂欢视频在线观看不卡| 91啦中文字幕| 国产无码性爱一区二区三区| 国产精品手机视频一区二区| 亚洲国产天堂久久九九九| 91区国产福利在线观看午夜| 国产在线观看成人91| 亚洲色无码专线精品观看| 婷婷亚洲天堂| 亚亚洲乱码一二三四区| 国产精品 欧美激情 在线播放| 久久黄色小视频| 欧美日在线观看| 女人毛片a级大学毛片免费| 日韩不卡高清视频| 亚洲香蕉伊综合在人在线| 日韩欧美国产三级| 天天综合网色| 欧美亚洲国产日韩电影在线| 91久草视频| 国产精品人莉莉成在线播放| 久久综合五月| 国产在线一区视频| 天天躁日日躁狠狠躁中文字幕| 日韩大片免费观看视频播放| 亚洲中文字幕无码爆乳| 最新国产网站| 国产福利一区在线| 久久精品中文字幕少妇| 中文字幕在线日韩91| 国产精品专区第1页| 成人国产精品网站在线看| 成人毛片免费观看| 国产第一页免费浮力影院| 极品性荡少妇一区二区色欲| 人妻少妇乱子伦精品无码专区毛片| 国产精品无码一区二区桃花视频| 草草线在成年免费视频2| 日韩色图区| 波多野结衣爽到高潮漏水大喷| 中文字幕av一区二区三区欲色| 久久国语对白| 国产美女91视频| 亚洲系列中文字幕一区二区| 亚洲综合中文字幕国产精品欧美| 久久精品最新免费国产成人| 一本无码在线观看| 熟妇丰满人妻| 久久国产精品麻豆系列| 一级成人a毛片免费播放| 热思思久久免费视频| 不卡无码h在线观看| 四虎国产精品永久在线网址|