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