- 8
- Apr
很久没Tweak了,因为上段时间研究Django去了。
一不小心还有16天就要发布Ubuntu 8.04了,我得抓紧时间编写Tweak 0.3了。
Tweak 0.3的内核几乎是脱胎换骨的(注意,是内核,而非功能),因为0.3版本要支持大多数Linux发行版,不在仅限于Ubuntu。
为此,我大动干戈,几乎重写了所有底层代码(幸亏只是底层)。
-----
支持其他发行版并不难,难的是同时支持几个版本的GNOME平台:如2.18、2.20和最新的2.22(哎,用户的要求可真多)。
比如创建一个选项,来决定“接交流电时的CPU策略”。但是,这个键值,在2.18和2.20的位置是不一样的。如果用“硬编码”,就只能在源代码中写道:“if gnome == 2.18: then.... elif gnome == 2.20 then....”。
还有些选项,是新的版本才有选项,如“右键点击标题栏后触发的事件”。这个功能在GNOME 2.20以后才出来,同样的,“硬编码”的话就要用:“if gnome >= 2.20 then...”之类的了。
之前的Tweak 0.2就是这样写的,好处是方便、快速,缺点显而易见了,做软件就要做长久,三年后,GNOME都出6个版本了,最坏的打算就要在代码中增加六个判断语句,另外新的GNOME一定会有新的选项增加,那么,更少不了几个单独的判断了。代码中全是一块块If,而且无止境,这样就不好维护和继续发展了。
因此,要把底层的判断单独设计出来,在最上层的编码中,根本不需要考虑这个选项在哪个版本中会有不同,或者不能用。
想了很久,终于想到了一个好办法,解决了上述两个问题。
我的解决办法是使用XML来存储对应键值和用“工厂”来创建选项。
首先,XML文件中保存了所有软件要用到的键值,其中版本间存在差异的,就用version属性标识出来。
接着,在软件开启的第一步,来获取当前GNOME的版本,第二步,用XML处理函数,根据当前桌面的版本,智能的载入相关键值,并在内存中存为静态的一份。这样就把不同版本的键值位置问题给解决了。
然后,用工厂创建。工厂在创建时,会根据键值的信息,找对应的完整键值,若找不到,就返回None,找到就创建。
最后,用包装器包装所有的创建好的选项,因为大多数选项都是归在一类里的,要用包装器包装好。包装器也算一个工厂,它看到有None的东西,就不包装它,跳过。最后呈现出来的,就是对应这个系统的一些调节选项了。版本是好应好的,不具备的特性也不会显示。
大概就是这样的处理过程,无论要实现多少选项,都只用到了一句If语句:在第二步解析XML载入键值时判断。
在实际的编码中,这个方法也确实成功了。以上,也算是一种设计模式吧?
现在编码进程良好,而且在Ubuntu 7.04、7.10、8.04和Arch Linux都将进行测试。
看着代码越来越整齐、层次越来越鲜明而且兼容性越来越好,真是太高兴了!
下面是在Arch Linux下的截图,还没怎么处理过。

期待中……
弱弱的问一句,工厂的概念
加油。这是个好东西。
是repertory吧。
哈~~你的ubuntu tweak该考虑改成Gnome Tweak了~
建议叫gTweaker不错的
太棒了。。终于看到更新了。。
本本挂了后。第一次回来。。
又有新进步了o。。