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