Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192604
  • 博文数量: 111
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1240
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 07:46
文章分类

全部博文(111)

文章存档

2015年(2)

2014年(1)

2011年(1)

2010年(7)

2009年(100)

我的朋友

分类: LINUX

2009-08-19 07:13:17


转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

原文发表于《程序员》2007第5期

Firefox的横空出世在很多人的意料之外,其体积小巧功能强大,在安全性、扩展性和可移植性上都有惊人的表现。这样优秀的软件,实在想不出是在 mozilla这棵老树上生出的新花。我们都认为mozilla老了,已经过时了,不是吗?如果不是firefox,我们还记得mozilla吗?

最近因为工作需要,我花了不少时间去研究Mozilla。才知道我的想法错了,mozilla的架构设计非常优秀,不但没有老,而且在持续的焕发出生机。不是别的,正是它优秀的架构孕育了firefox的诞生。

浏览器的复杂度可以和操作系统相提并论,mozilla有数百万行的C++代码。这样复杂的软件,其中到底使用了那些秘技呢?其实,好的设计总是遵 循一些众所周知的设计准则,套句俗语说,差的设计千差万别,好的设计都一个样。Mozilla当然也是遵循了这些设计准则,不过,在实现方法上却有很多创 新之处,让人惊叹不已。

本文就以这些设计准则为主线,来分析一下Mozilla的架构设计:

1. 分离界面和实现。
我们知道,用户界面是最容易变化的,也是最难于自动测试的,分离用户界面和内部逻辑是设计的主要目标之一。在这一方面,mozilla算是非常前卫了:用 标记语言(XUL)开发界面,用编程语言来实现(C++)内部逻辑,再用脚本语言(javascript)把两者胶合起来。XUL的界面描述能 力,javascript的简洁性和C++的性能完美的结合在一起了,mozilla把三者的长处发挥到了极致。它们的关系如下图所示:

o XUL 这是一种用XML来描述用户界面的语言。用XML描述用户界面已经不是什么新鲜事了,像Qt designer和Glade都是用XML文件格式来存放用户界面描述的,但它们都只是纯粹的界面描述。而XUL同时描述了事件处理、风格(style) 和字符串国际化等信息,可以直接被mozilla layout引擎解析执行。

o XBL 这种称为扩展绑定语言(Extensible Binding Language)的东东也是mozilla的一大特色,现在已经被W3C作为标准了。作为程序员,我们都知道公共函数库的重要性,公共函数库可以反复重 用,从而提高开发效率。在开发用户界面时,也会遇到同样的问题,很多界面都比较类似,拷贝/粘贴当然很容易,但以后维护起来就麻烦了。而XUL并没有提供 重用机制,XBL刚好弥补了它的不足。在XUL中可以只描述具有共性的部分,而由XBL对它进行扩展。XBL的功能强大,自身也有组合和继承机制,这大大 提高了可重用性。

o CSS 我们知道Cascading Style Sheets在网页中已经应用多年了,而在浏览器本身实现中使用倒是很少听说。这也没有什么奇怪的,像GTK+中的RC和CSS功能都差不多, 也就是说GNOME应用程序一直都在使用类似于CSS的东西。有了CSS,把应用程序的界面视感(look and feel)与功能独立开来,让两者可以独立变化,这是非常自然的事了。不过CSS在这里,除了可以修改界面风格外,还可以把XBL和XUL关连起来,以完 成对XUL的扩展。

o DTD DTD (Document Type Definition)常用来定义标记(Markup Langugae)语言的语法,功能上与BNF是等价的。不过它在这里,不是为了定义某种语言的语法,而是完成字符串的本地化,只是借了DTD中的实体 (Entity)展开机制罢了。这看起来有些大材小用,不过在XML中使用DTD实体来替换要翻译的字符串,没有比这更好的办法了。

o property 在XUL中用DTD来做字符串本地化,虽然是妙着一招,可是在javascript里它就没有用武之地了。这回该轮到property上场了,在 nsIStringBundle接口的帮助下,javascript可以方便的从property文件中取到所要的字符串。

o Javascript 在XPConnect的支持下,Javascript也可以用来开发COM组件,可以实现任何功能。不过胶合用户界面(XUL)和内部逻辑才是它最拿手的 好戏。当然,其中文档对象模型(DOM)起了非常关键的作用,Javascript通过文档对象模型(DOM)来操作XUL中的元素。

我们以minimo为例,来看看它的实现方法:



上面的代码指明了CSS的文件名和路径。global.css是控制应用程序整体风格的,minimo.css是控制minimo主界面风格的。 CSS的语法很简单,不需要任何编程知识就可以修改它。只要一个文本编辑器,你就可以根据你的爱好,去修改它的字体、颜色和背景图片等风格元素,而且无需 重新编译就可以看到调整后的效果。

          
%minimoDTD;

%brandDTD;
]>

上面的代码指明了DTD的文件名和路径。正如前面所说的,DTD是用来做字符串本地化的,而不是用来描述当前文件语法的。

  


上面的代码指明了properties的文件名和路径。正如前面所说的,properties文件是用来处理javascript里字符串的本地化问题的。

要本地化吗?好办,把这两类文件交给翻译人员就行了。如果你还在把字符串放在可执行文件中,甚至直接嵌到代码里,还在为不同的语言各编译一个版本,那就太老土了,向mozilla学学吧。

                    contentcontextmenu="contentAreaContextMenu"
disablehistory="false"
accessrule="access_content"
src="about:blank"
flex="1"
autocompletepopup="PopupAutoComplete"
onnewtab="BrowserOpenTab()"/>

上面的代码就是真正的界面描述了。我们知道mozilla里面,它也像IE一样,把浏览器核心做成了一个控件,可以嵌入到应用程序自己的窗口 中,minimo就是利用这种机制实现的。这段代码完成了浏览器控件的创建、属性设置和事件关联。简单吧,更重要的是,无须重新编译就看到效果。

  
				
			  
阅读(503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~