posts - 12,  comments - 2,  trackbacks - 0

          隨著科技和需求的發(fā)展和變化,現(xiàn)在的軟件變得越來越龐大。這樣,隨之而來的最大挑戰(zhàn)就是軟件在設(shè)計上的越來越復(fù)雜和維護上的越來越困難。為了解決這個問題,軟件架構(gòu)師將軟件切分成比較小的并且易于理解的多個模塊。那么軟件模塊化會給我們帶來什么樣的好處呢?

          • 拆分人力:將軟件模塊化后,我們就可以分配獨立的團隊去處理獨立的模塊,從而將人力拆分開來。這樣既便于管理,又會降低整個軟件的設(shè)計的復(fù)雜性。因為每個獨立的團隊可以專心去設(shè)計和實現(xiàn)其模塊,而不用通盤考慮整個軟件的復(fù)雜性。
          • 抽象化:將軟件模塊化后,我們將整個軟件抽象化成多層、多 模塊的一個集成。這樣使整個軟件易于理解,便于管理。
          • 重用:將軟件模塊化后,每個模塊有其獨立的功能和封裝。這樣這個模塊就可以在多處(甚至是將來其他的軟件中)重用,從而節(jié)省人力。
          • 易于維護:將軟件模塊化后,當(dāng)軟件出現(xiàn)問題后,我們可以容易地定位問題出在那個模塊,而每個模塊又相對較小和易于理解,從而降低了軟件維護的難度。

          基于上述的 4 個優(yōu)點,在當(dāng)前的軟件設(shè)計中,軟件模塊化是軟件架構(gòu)師的主流思想。為了實現(xiàn)軟件模塊化,應(yīng)運而生的就是面向?qū)ο蟮母呒壘幊陶Z言,Java 是其中的典型代表。Java 用其獨有的 Jar 格式文件去包裝 Java 類和其他的資源文件,從而可以將軟件組件封裝成獨立的 Jar 文件。這些 Jar 文件可以相互依賴并共同完成同一個工作,從而實現(xiàn)了軟件的模塊化。但是 Java 卻不能真正的帶給我們軟件模塊化的那 4 個優(yōu)點,為什么呢?為了解釋這個問題,我們需要知道模塊的定義。

          什么是一個模塊?

          一個模塊應(yīng)該有以下 3 個特性:

          • 自包含:一個模塊應(yīng)該是一個業(yè)務(wù)邏輯的整體。它應(yīng)該可以作為一個獨立的整體被移動、安裝和卸載。模塊不是一個原子體,它可以包含多個更小的部分,但這些部分不能獨立存在。
          • 高內(nèi)聚:一個模塊不應(yīng)該做很多不相關(guān)的事情,它應(yīng)該專注于 1 個業(yè)務(wù)邏輯的目標(biāo)并盡全力實現(xiàn)這個目標(biāo)。
          • 低耦合:一個模塊不應(yīng)該關(guān)注其他模塊的內(nèi)部實現(xiàn),松散的聯(lián)系允許我們?nèi)ジ哪硞€特定的模塊,而不會影響到其他的模塊。

          而 Java 語言的 Jar 文件并不能完美的實現(xiàn)一個模塊這 3 個特性,它主要會遇到以下的 3 個問題:

          1. 針對一個 Jar 文件,沒有對應(yīng)的 Java 運行時的概念。Jar 文件只有在開發(fā)和部署的時候有意義,而在 JVM 中,所有的 Jar 文件中的內(nèi)容被簡單地聯(lián)系在一起作為一個單獨的全局的列表,這就是所謂的“Classpath”。這種類加載模式,使 Jar 文件在運行時是不可見的。
          2. Jar 文件沒有標(biāo)準(zhǔn)的元數(shù)據(jù)信息去指明該 Jar 文件所需要的外部依賴文件列表,這樣我們就不能清楚的知道,該 Jar 文件需要和其他的那些 Jar 文件一起工作。另外,現(xiàn)在的 Jar 文件沒有版本信息,這樣,同一 Jar 文件的多個版本就不能同時被加載。
          3. Java 沒有機制在不同的 Jar 文件中隱藏信息。

          這 3 個問題,使 Jar 文件在模塊的“自包含”和“低耦合”這兩個特性上做的不好,從而使 Java 在模塊的“拆分人力”和“易于維護”這兩個優(yōu)點上沒有好的表現(xiàn),而更嚴重的是第 2 個問題,這使 Java 應(yīng)用軟件存在難以處理的版本沖突問題。

          Java 語言為了安全的考慮,它的類加載器(注意不是類加載)是多層立體的并且對其類加載采用了父委托機制。并且,當(dāng)同一個類加載器加載類文件時,JVM 會加載最先發(fā)現(xiàn)類。所以當(dāng)同一個類的新舊兩個版本被分別封裝在兩個不同的 jar 文件中(比如:ClassVersion2.jar 和 ClassVersion1.jar),而這兩個 jar 文件又都在 JVM 的類加載路徑里的話,最先被加載的 Jar 文件中的類才會被使用到。而現(xiàn)在的 Java 應(yīng)用軟件因為長時間的更新維護,同一個模塊的多個版本共存的情況比比皆是,這就會產(chǎn)生版本沖突問題。比如說,在 Java 應(yīng)用軟件中存在一個模塊 ThirdComponent,這個模塊依賴 ClassVersion 模塊而且必須同老版本的 ClassVersion 模塊(ClassVersion1.jar)一起工作,當(dāng)新 ClassVersion 模塊(ClassVersion2.jar)被升級到軟件中后,ThirdComponent 模塊很有可能就不會工作,因為類加載器很有可能會先加載的是 ClassVersion2.jar,而不是 ClassVersion1.jar。其實產(chǎn)生這個問題的根本原因是,Java 的 Jar 文件在自包含上做的不好。Jar 文件只是在軟件的封裝上起到了作用,而在 JVM 運行時中,Java 只關(guān)心類而忽略了 Jar,從而使 Java 的類加載變成了平面的線性的而非立體的網(wǎng)狀的。

          為了解決 Java 在模塊化中存在的問題,OSGi 模塊系統(tǒng)出現(xiàn)了。OSGi 是基于 Java 之上開發(fā)的,它提供了一種建立模塊化的 Java 應(yīng)用程序的方法并定義了這些模塊在運行時中如何相互交互。

          posted on 2010-01-03 16:24 遠帆 閱讀(279) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 宁都县| 武功县| 永昌县| 临城县| 忻城县| 牙克石市| 日喀则市| 阿拉尔市| 福鼎市| 贵港市| 黄平县| 西乌珠穆沁旗| 新巴尔虎右旗| 金坛市| 荆门市| 婺源县| 合肥市| 莲花县| 桐城市| 历史| 隆子县| 五莲县| 义马市| 滦南县| 青海省| 安庆市| 祁连县| 乾安县| 贺兰县| 安徽省| SHOW| 长泰县| 涞水县| 扶沟县| 泸西县| 红桥区| 翼城县| 凤城市| 宁国市| 于都县| 宁安市|