mozilla
是一個(gè)以瀏覽器為中心的軟件平臺(tái),它在我們平臺(tái)中占有重要地位。我們用它來(lái)實(shí)現(xiàn)WEB瀏覽器、WAP瀏覽器、郵件系統(tǒng)、電子書(shū)和幫助閱讀器等應(yīng)用程序。為
此,我最近花了不少時(shí)間去閱讀mozilla的代碼和文檔,我將寫(xiě)一系列的BLOG作為筆記,供有需要的朋友參考。本文介紹一下mozilla中的設(shè)計(jì)亮
點(diǎn)。 近幾年我看了不少大型開(kāi)源系統(tǒng),它們每個(gè)設(shè)計(jì)得都很經(jīng)典,而mozilla無(wú)疑是其中的佼佼者之一。好的設(shè)計(jì)總是遵循一些眾所周知的設(shè)計(jì)準(zhǔn)則,套句俗語(yǔ)說(shuō),差的設(shè)計(jì)千差萬(wàn)別,好的設(shè)計(jì)都差不多。Mozilla也一樣,它也無(wú)非是遵循了一些好的準(zhǔn)則,只是實(shí)現(xiàn)手段有些差異罷了。這里簡(jiǎn)單的說(shuō)一說(shuō),就算是溫故知新吧。 1. 針對(duì)接口編程。 Mozilla
整個(gè)設(shè)計(jì)都是基于組件對(duì)象模型(COM)的,而組件對(duì)象模型(COM)的主要特點(diǎn)就是針對(duì)接口編程。在《設(shè)計(jì)模式》中,作者把針對(duì)接口編程作為設(shè)計(jì)的首要
準(zhǔn)則。針對(duì)接口編程的主要目的就是信息隱藏,隔離變化,把模塊的使用者和實(shí)現(xiàn)者之間的耦合減到最小。而且在XPCOM的幫助下,組件可以動(dòng)態(tài)替換或者增
加,具有更強(qiáng)的靈活性。 2. 分離界面和實(shí)現(xiàn)。 在這一方面,mozilla
算是非常前衛(wèi)了:用標(biāo)記語(yǔ)言(XML)開(kāi)發(fā)界面,用編程語(yǔ)言來(lái)實(shí)現(xiàn)(C++)邏輯,而用腳本語(yǔ)言(javascript)把兩者膠合起來(lái),這可以說(shuō)是把三
者的長(zhǎng)處發(fā)揮到了極致。以前我也有過(guò)類似的想法,當(dāng)時(shí)剛進(jìn)入手機(jī)行業(yè),我發(fā)現(xiàn)各種GUI的不統(tǒng)一,導(dǎo)致手機(jī)程序移植非常困難。當(dāng)時(shí)就想,如果應(yīng)用程序的界
面用HTML來(lái)寫(xiě),應(yīng)用程序的邏輯用C/C++寫(xiě),界面在瀏覽器中運(yùn)行,而應(yīng)用程序的邏輯作為WEB服務(wù)器運(yùn)行。再擴(kuò)展一下HTTP協(xié)議,支持異步事件,
完全可以實(shí)現(xiàn)傳統(tǒng)的應(yīng)用程序。后來(lái)發(fā)現(xiàn)mozilla早就實(shí)現(xiàn)了類似的東東,讓我大跌眼鏡。 另外mozilla也大量應(yīng)用了觀察者模式,這對(duì)分離界面和實(shí)現(xiàn)很有幫助。比如,網(wǎng)絡(luò)操作通常都要花很長(zhǎng)時(shí)間,在此期間要報(bào)告操作的當(dāng)前狀態(tài)。通過(guò)觀察者模式,可以在長(zhǎng)時(shí)間操作中更新?tīng)顟B(tài),而又避免了操作與用戶界面的耦合。 3. 可移植性。 Mozilla
是一個(gè)跨平臺(tái)的軟件,它的基本運(yùn)行平臺(tái)有l(wèi)inux、windows和mac,實(shí)際上它還可以運(yùn)行在其它unix平臺(tái)上,所以可移植性是mozilla是
主要目標(biāo)之一。如果開(kāi)發(fā)過(guò)跨平臺(tái)軟件,你就會(huì)知道開(kāi)發(fā)可移植性軟件是多么困難,特別是大型GUI應(yīng)用程序。Mozilla在可移植性上可謂費(fèi)盡苦心: l 實(shí)現(xiàn)了一套跨平臺(tái)的組件對(duì)象模型(XPCOM),這使得mozilla可以利用組件對(duì)象模型(COM)的好處,而又不限于windows平臺(tái)。 l 實(shí)現(xiàn)了一套可移植運(yùn)行庫(kù),對(duì)各種操作系統(tǒng)的接口作了抽象,隔離上層模塊對(duì)操作系統(tǒng)的依賴。 l 實(shí)現(xiàn)了自己國(guó)際化機(jī)制,包括編碼轉(zhuǎn)換、編碼檢測(cè)和字符串翻譯等等。 l 對(duì)GUI作了抽象,實(shí)現(xiàn)了widget和gfx兩個(gè)庫(kù),前者負(fù)責(zé)窗口/控件的處理,后者負(fù)責(zé)圖形/圖像的繪制??梢杂貌煌腉UI作為實(shí)現(xiàn)后端。 4. 可擴(kuò)展性。 對(duì)于瀏覽器來(lái)說(shuō),可擴(kuò)展性也是非常重要的。由于它涉及的東西太多,專業(yè)的功能應(yīng)該由專業(yè)的廠商去做,而不是全部由瀏覽器來(lái)實(shí)現(xiàn)。比如像flash播放、視頻播放和pdf閱讀等等都應(yīng)該從瀏覽器中分離出來(lái)。Mozilla提供了兩種擴(kuò)展機(jī)制,一種稱為plugin,另外一種稱為extension。這可能有點(diǎn)讓人混淆,我是這樣理解的: l plugin用來(lái)增強(qiáng)現(xiàn)有功能,比如wml browser plugin可以把wml轉(zhuǎn)換成html,而media player plugin可以播放音/視頻文件。所有的plugin都要實(shí)現(xiàn)指定的接口。 l extension用來(lái)擴(kuò)展新功能,這些功能可能與瀏覽器有關(guān),也可能無(wú)關(guān),像help extension就是用來(lái)實(shí)現(xiàn)幫助功能的。Extension不必實(shí)現(xiàn)特定的接口。 5. 穩(wěn)定性(內(nèi)存問(wèn)題檢測(cè))。 用C/C++開(kāi)發(fā)的應(yīng)用程序,最大的毛病就是容易出現(xiàn)內(nèi)存泄露和越界,即使有多年開(kāi)發(fā)經(jīng)驗(yàn)的老手也可能在此栽了跟頭。有人說(shuō),有很多工具可以幫助檢測(cè)內(nèi)存問(wèn)題啊。沒(méi)錯(cuò),但有兩種情況可能讓這些工具失效,一是GUI系統(tǒng),它們通常使用了共享內(nèi)存,大多數(shù)工具對(duì)此都無(wú)能為力。不信的話,你可以用valgrind檢查一下GTK應(yīng)用程序試試。二是自己管理了內(nèi)存,大型系統(tǒng)中,為了高效的利用內(nèi)存,往往實(shí)現(xiàn)了自己的內(nèi)存管理器,工具對(duì)此一無(wú)所知,自然幫不上忙。 Mozilla實(shí)現(xiàn)了自己的內(nèi)存管理器,同時(shí)還實(shí)現(xiàn)多種內(nèi)存問(wèn)題檢查機(jī)制,比如用boehm垃圾回收機(jī)制來(lái)檢查內(nèi)存泄露問(wèn)題。當(dāng)然,對(duì)于C/C++這個(gè)毛病,也是迫不得已,大家都在重復(fù)實(shí)現(xiàn)這些東西,卻沒(méi)有好的重用辦法,這不怪mozilla。 ~~end~~ |
|
來(lái)自: xiaoqdu > 《開(kāi)發(fā)資料》