自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

模塊化編程的優(yōu)點(diǎn)與實(shí)現(xiàn)原理概述

原創(chuàng)
開發(fā) 后端 架構(gòu)
模塊化編程是近年來開發(fā)界的一個(gè)關(guān)注焦點(diǎn)。從UNIX系統(tǒng)到Eclipse和NetBeans等IDE,模塊化編程正逐步擴(kuò)展到開發(fā)界的各個(gè)領(lǐng)域,并深入到語言級(jí)的層面,比如Java。本文從歷史角度描述了模塊化編程的優(yōu)點(diǎn),并以NetBeans為例,簡(jiǎn)單介紹了其實(shí)現(xiàn)原理。

【51CTO精選譯文】本文是《Rich Client Programming: Plugging into the NetBeans Platform》(中文版譯名為《NetBeans富客戶端編程權(quán)威教程》,Sun中國(guó)技術(shù)社區(qū)推薦的NetBeans學(xué)習(xí)用書)英文版公開章節(jié),即第二章的節(jié)選譯文,章節(jié)名稱為“模塊化編程的好處”。通過閱讀這一章節(jié),讀者們將對(duì)模塊化編程的起源和實(shí)現(xiàn)原理產(chǎn)生初步的了解,并了解到模塊化編程的優(yōu)點(diǎn)。有關(guān)模塊化編程的實(shí)現(xiàn)部分,本文著重介紹了NetBeans的情況。

51CTO全新Java頻道,關(guān)注Java開發(fā)的前沿

分布式開發(fā)

閉門造車的軟件開發(fā)時(shí)代早已過去。在嵌入式系統(tǒng)之外,幾乎每一位開發(fā)者都需要依賴別人寫的類庫(kù)或框架。這種借助并復(fù)用他人提供的基礎(chǔ)設(shè)施、框架以及類庫(kù)的好處在于使自己能夠?qū)W⒂趹?yīng)用本身的邏輯當(dāng)中。這樣縮短了軟件開發(fā)所需要的時(shí)間。

過去的幾十年間,開源軟件的興起令類庫(kù)的復(fù)用具有雙倍的吸引力。我們現(xiàn)在有針對(duì)多種程序中的各種問題而誕生的現(xiàn)成解決方案,而獲取這些解決方案不用花一文錢。開源產(chǎn)品起于UNIX內(nèi)核,基礎(chǔ)C類庫(kù)和命令行工具,并通過Web服務(wù)器和Web瀏覽器延伸至Ant,Tomcat,JUnit,Javacc等Java工具領(lǐng)域——而這種情況還有無限制發(fā)展的趨勢(shì)。在編寫一個(gè)現(xiàn)代軟件的過程中,集成工作的部分和創(chuàng)新的部分大致是對(duì)半分的。將可用的碎片撿起來并組合到一起是現(xiàn)代應(yīng)用開發(fā)的主要工序。人們不再?gòu)牧汩_始編寫一切。人們?cè)谛枰狧TTP服務(wù)器的時(shí)候?yàn)樗麄兊膽?yīng)用選擇Apache或者Tomcat,在需要數(shù)據(jù)庫(kù)的時(shí)候選擇MySQL或PostgreSQL。應(yīng)用軟件將這些零碎部件粘連起來,并加入自己的邏輯。最終的成品是功能完備的、性能好的、并且在相當(dāng)短的時(shí)間內(nèi)開發(fā)出來的應(yīng)用軟件。

看看Linux版本是如何發(fā)行的。紅帽的Fedora,Mandriva,SUSE,還有Debian,它們所包含的應(yīng)用程序其實(shí)大致上差不多,而且都是同一群人寫的。發(fā)布者不過是簡(jiǎn)單的將它們打包,并提供“膠水”用于統(tǒng)一的安裝。發(fā)行商往往只編寫中央管理軟件和安裝軟件,并提供一些質(zhì)量保證,以確保所有選定的組件能夠協(xié)同工作。這個(gè)過程對(duì)于Linux的普及產(chǎn)生了相當(dāng)理想的效果。有一個(gè)例子可以證明此模型的意義,那就是Mac OS X:它其實(shí)就是個(gè)安裝了一堆蘋果插件的FreeBSD Unix。對(duì)于這樣的軟件,需要注意的一個(gè)重點(diǎn)就是它創(chuàng)建的方式采用了一種分布式開發(fā)模型。軟件的開發(fā)者和發(fā)行者可能完全不認(rèn)識(shí)對(duì)方,也沒有交流過,而他們往往也并不生活在同一個(gè)地域。

這種分布式開發(fā)有如下特征。第一,應(yīng)用程序(或操作系統(tǒng))的源代碼不再處于某一個(gè)開發(fā)者完全的掌控之中。源代碼被散布至世界各地。毫無疑問,構(gòu)建這樣的軟件與傳統(tǒng)那種源代碼完全在你家中的代碼庫(kù)的應(yīng)用構(gòu)建是完全不同的。

#t#另外我們需要了解的是,也沒有一個(gè)人對(duì)整個(gè)項(xiàng)目的時(shí)間表有完全的掌控。不單單是源代碼,開發(fā)者們也遍布世界各地,并以他們自己的時(shí)間表工作。這種情況并不像聽起來的那樣不尋?;虿豢孔V。如果你曾經(jīng)為超過五十人的項(xiàng)目制定過時(shí)間表,那么你一定會(huì)明白,對(duì)整個(gè)項(xiàng)目進(jìn)程擁有“完全的掌控”最多只是一個(gè)安慰自己的幻想。你隨時(shí)需要準(zhǔn)備好拋棄某個(gè)特性,或是發(fā)布這個(gè)或那個(gè)組件的一個(gè)老版本。同樣的模式也適用于分布式開發(fā)。

每個(gè)人都有這樣一個(gè)權(quán)利:使用一個(gè)新版本或舊版本類庫(kù)的自由。

使用外部庫(kù)并使用它們組建應(yīng)用程序,這意味著人們能夠花費(fèi)更少的時(shí)間和精力創(chuàng)造更復(fù)雜的軟件。代價(jià)則是,我們需要管理這些類庫(kù),確保它們的兼容性。這不是一個(gè)簡(jiǎn)單的任務(wù)。但是,對(duì)于如今高度復(fù)雜系統(tǒng)的組建,也沒有其他既實(shí)用、性價(jià)比又高的開發(fā)模式了。

你對(duì)Java模塊化規(guī)范有何看法?歡迎到Java頻道的后院參與討論!

#p#

模塊化應(yīng)用程序

針對(duì)分布式開發(fā)的挑戰(zhàn),其技術(shù)解決方案就是模塊化。在一大塊緊密耦合的代碼中,每個(gè)單元都可能與其他單元進(jìn)行直接的接口。而模塊化應(yīng)用則正相反,它由小塊的、分散的代碼塊組成,每一塊都是獨(dú)立的。于是,這些代碼塊可以由不同的團(tuán)隊(duì)進(jìn)行開發(fā),而他們都有各自的生命周期和時(shí)間表。最終的成果則可以由另一個(gè)獨(dú)立的個(gè)體,即發(fā)行者,進(jìn)行集成。

51CTO編輯推薦:OSGi,成熟的Java模塊化規(guī)范

對(duì)于Java而言,將一組類庫(kù)放在Java類路徑上并運(yùn)行一個(gè)應(yīng)用程序在很早以前就實(shí)現(xiàn)了。NetBeans平臺(tái)在類庫(kù)的管理方面已經(jīng)走的相當(dāng)遠(yuǎn):它積極的參與類庫(kù)的加載過程,并強(qiáng)制每一個(gè)類庫(kù)都滿足其他類庫(kù)對(duì)自己的最低版本需求。這樣的類庫(kù)被稱為模塊。NetBeans模塊系統(tǒng)是一個(gè)運(yùn)行時(shí)容器,它確保了系統(tǒng)在運(yùn)行時(shí)的完整性。

版本控制

將應(yīng)用程序分解為獨(dú)立的類庫(kù),這帶來了一個(gè)新的挑戰(zhàn)——我們需要確保這些互不依賴的零件們能夠在一起工作。這個(gè)問題有多種解決方案,而最流行的一種就是版本控制。每一塊模塊化應(yīng)用都有一個(gè)版本號(hào),常用杜威十進(jìn)制格式表示,比如1.34.8這種數(shù)字組合。新版本的發(fā)布帶來增加的版本號(hào),比如1.34.10,1.35.1,或者2.0。其實(shí)仔細(xì)想來,使用增長(zhǎng)的版本號(hào)來代表兩個(gè)版本的復(fù)雜軟件之間的不同是挺荒謬的。不過這種方法解釋起來很簡(jiǎn)單,而且它的流行也說明了這種方法是十分可行的。

一個(gè)模塊系統(tǒng)的另一個(gè)特點(diǎn)是外部依賴的聲明。很多組件對(duì)外部條件有一定需求。比如說,一個(gè)模塊系統(tǒng)中的組件可能需要一個(gè)XML解析器,或者需要安裝某種數(shù)據(jù)庫(kù)驅(qū)動(dòng),或者需要某種文本編輯器或者瀏覽器才能工作。對(duì)于每一個(gè)需求,另外一個(gè)模塊可以指定其接口的特定版本號(hào)。即使對(duì)外部類庫(kù)的依賴性極低,但每一個(gè)Java程序都對(duì)Java本身有版本要求。一個(gè)真正的模塊系統(tǒng)可以指定理想的最低JDK版本。一個(gè)模塊可能會(huì)有JDK>=1.5,xmlparser>=3.0,webbrowser>=1.5這樣的版本需求。在運(yùn)行時(shí),啟動(dòng)應(yīng)用的模塊代碼的依賴條件需要被滿足,即,XML解析器在3.0版或以上,瀏覽器在1.5版或以上,如此這般。NetBeans模塊系統(tǒng)正是這樣的。使用依賴模式來維持模塊系統(tǒng)中組件之間的依賴性有一個(gè)大前提,那就是我們必須遵循一系列的規(guī)則。第一個(gè)規(guī)則是向后兼容性:如果新版本發(fā)布,那么所有在之前版本下可建立的契約也必須能夠在新版本下工作。這一點(diǎn)說起來很容易,但實(shí)現(xiàn)起來沒那么容易。第二個(gè)規(guī)則是,系統(tǒng)中的組件需要準(zhǔn)確的說明它們需要什么。當(dāng)一個(gè)模塊的依賴性產(chǎn)生改變的時(shí)候,它必須要說出來,這樣系統(tǒng)才能夠準(zhǔn)確的確認(rèn)這些依賴性是否被滿足。因此,如果一個(gè)模塊系統(tǒng)產(chǎn)生了對(duì)新功能的依賴性,比如一個(gè)HTML編輯器,那么你便需要定義這個(gè)新的依賴性(比如,htmleditor>=1.0)。同時(shí)如果你開始使用一個(gè)新的HTML編輯器組件的接口,而這個(gè)接口在1.7版之后才有,那么你需要更新你的依賴型需求到這個(gè)組件的1.7版本:htmleditor>=1.7。在NetBeans模塊系統(tǒng)中,第二個(gè)規(guī)則在實(shí)踐當(dāng)中是相對(duì)容易遵循的,因?yàn)橐粋€(gè)模塊的編譯時(shí)類路徑僅僅包括有依賴性聲明的模塊,而沒有依賴性聲明的模塊是不會(huì)被編譯的。

二級(jí)版本信息

之前我們有關(guān)版本控制方法的討論針對(duì)的是類庫(kù)的規(guī)范版本。規(guī)范版本描述了該類庫(kù)當(dāng)中的公共API的一個(gè)特定快照。

某些版本的類庫(kù)會(huì)不可避免的遭遇不得不修復(fù)的bug。因此,二級(jí)版本的識(shí)別也應(yīng)該與組件關(guān)聯(lián)起來,那就是這個(gè)組件的實(shí)現(xiàn)版本。與規(guī)范版本不同,一個(gè)實(shí)現(xiàn)版本往往用“Build20050611”這樣的字符串進(jìn)行標(biāo)注,因此只能通過等式來判定。這就提供了一個(gè)二級(jí)識(shí)別機(jī)制,這個(gè)機(jī)制可以用來決定某個(gè)特定的代碼模塊是否有必須修復(fù)的bug。我們知道,在3.1規(guī)范版本中存在的bug未必會(huì)在3.2版本或者3.1版本的其他實(shí)現(xiàn)版本中存在,因此,出于bug修復(fù)或某些特殊處理的需求,將實(shí)現(xiàn)版本與類庫(kù)關(guān)聯(lián)起來是十分有用的。

依賴性管理

#t#版本和依賴性系統(tǒng)需要一個(gè)管理器,以確保這個(gè)系統(tǒng)中的每一部分的需求都得到滿足。這樣的一個(gè)管理器可以檢查每一塊組件的安裝時(shí)間,保持系統(tǒng)的一致性——Linux發(fā)行版的RPM或Debian包就是這樣工作的。描述依賴性的元數(shù)據(jù)在運(yùn)行時(shí)非常重要。有些元數(shù)據(jù)可以讓應(yīng)用進(jìn)行動(dòng)態(tài)類庫(kù)升級(jí)而無需關(guān)閉應(yīng)用。元數(shù)據(jù)還能決定一個(gè)模塊動(dòng)態(tài)加載的依賴性是否滿足。如果沒有滿足,元數(shù)據(jù)將向用戶解釋可能會(huì)遇到的問題。

NetBeans IDE是一個(gè)模塊化應(yīng)用。它的模塊——即組成它的那些類庫(kù)——在運(yùn)行時(shí)被查知并加載。它們可以安裝小塊小塊的功能,如組件,菜單項(xiàng)或服務(wù)等;它們可以在啟動(dòng)時(shí)運(yùn)行代碼,進(jìn)行程序初始化;它們可以通過聲明式注冊(cè)機(jī)制把平臺(tái)和IDE提供的各個(gè)部分注冊(cè)為服務(wù)并在需要時(shí)將其初始化。NetBeans模塊系統(tǒng)使用安裝組件的聲明依賴性為每個(gè)模塊的類路徑進(jìn)行父類路徑配置,并在模塊加載類的時(shí)候決定在哪些JAR文件當(dāng)中搜索。這樣確保了模塊類路徑當(dāng)中不存在任何不屬于其依賴樹的模塊JAR,并強(qiáng)制確保每個(gè)組件都有聲明式依賴性。一個(gè)沒有聲明依賴性的模塊將無法從其他模塊中呼叫代碼,而當(dāng)依賴性沒有被全部滿足時(shí),其他模塊將不會(huì)加載。

原文:The Benefits of Modular Programming

作者:Tim Boudreau,Jaroslav (Yarda) Tulach和Geertjan Wielenga

責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2021-07-14 09:26:51

UPS電源模塊化

2010-02-03 09:01:01

Java動(dòng)態(tài)模塊化

2017-05-18 10:23:55

模塊化開發(fā)RequireJsJavascript

2021-12-16 22:02:28

webpack原理模塊化

2018-03-21 21:31:28

Java9編程Java

2022-09-21 11:51:26

模塊化應(yīng)用

2012-11-08 09:45:44

JavaScriptrequireJS

2021-06-10 18:40:32

ES 標(biāo)準(zhǔn)模塊化

2017-05-18 11:43:41

Android模塊化軟件

2014-04-27 10:16:31

QCon北京2014Andrew Bett

2010-01-20 09:14:49

C語言模塊化

2019-08-28 16:18:39

JavaScriptJS前端

2020-09-17 10:30:21

前端模塊化組件

2012-11-08 10:21:41

JSrequireJavaScript

2020-09-18 09:02:32

前端模塊化

2022-02-17 16:22:41

高壓直流模塊化UPS

2023-12-25 22:24:36

C++模塊Module

2010-03-11 17:24:27

Python編程語言

2009-12-10 11:04:08

Java模塊化OSGiJigsaw

2022-09-05 09:01:13

前端模塊化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)