主题:【原创】斗地主 – 从地主谈编程说起 -- Highway
毛主席教导我们说“千万不要忘记阶级斗争!”所以说地主是要坚定不移批斗的。地主强占良田,欺男霸女已然可恶,然而更令人不能容忍的是他居然拿把小片儿刀跑到信息技术的地盘儿上耍了起来。一边耍一边还啧啧的赞叹道“好刀法,好刀法啊…”这不是反了天了吗?地主婆哪里去了,也不出来管管你们家这位,一任他在这里撒泼放肆!
哈哈,先跟地主开个玩笑。
============================================
地主前些天谈起编程(【原创】地主编程之剑走偏锋),说是尽量给用户一些“合理的缺省设置”。这样可以极大的简化用户日常的工作;对于新手,这些缺省设置可以极大的降低他们犯错的可能,降低他们使用软件的难度。用地主的话就是“急用户所急,帮着用户少走一步;想用户所想,为了用户多走一步”。大家觉得是不是挺“经典”的。看来地主是“太有才”了。
地主所说的这个问题其实是一个非常典型的软件设计问题,程序员们为这个问题没少下功夫,零零总总说来,解决方案已经经历的好几代了,我在这里就大概的回顾一下。
[第一代:命令行参数]
早期的程序很多都是Console app。黑乎乎的,没有图形用户界面。所以用户如果想有什么要求,一般都是通过命令行向程序传达的。Unix的许多程序将命令行发挥到了及至。如果一个程序有30,50个开关,选项什么的别觉着奇怪。举个最简单的例子吧,大家可能都用过DOS/Windows Console下的dir。大多的时候大家什么参数也不带,就是一个dir,这时候呢,缺省参数就在起作用。很多人可能从来没用过其它的开关或是选项。这说明dir的缺省还是不错的,满足了大家的基本要求。
命令行的缺点就是没法保存。每次你都得type in。开关一多了,就显得很不方便。并且大多选项从字面上看不出个所以然来,对于生手来说很不友好。弥补的办法呢就是那长长的命令放在batch文件里面,以后你每次运行这个batch文件就行了。所以如果大家记性好的话就会想起来早期的DOS程序除了XXX.EXE文件外,还有不少XXXX.BAT文件。这些batch文件大多就是为这个目的服务的。
[第二代:初始化文件(xxx.ini)]
在Windows 3.X时代。INI文件变得流行了起来。程序的设置已经用户的定制被保存到INI文件中。INI文件格式很简单,比如说
[Personal_info]
老婆=李小花
情人=刘小翠
比较复杂一点的还将INI文件分成了SECTION,每一段描述一类相关的属性。为了大家读取和更改这些文件,微软还提供了一些很基本的API让大家操作这些文件。说实话,不是很好用。读取到还好说,修改和删除就有些小麻烦了。
INI文件的主要问题就是没有层次。所以的东西都是FLAT的。对于复杂问题就显得力不从心了。比若说情人不止一个,问题就变得有趣了。大家通常的解决办法就是hack ini文件,比如用什么特设符号把这些情人们分开,比如空格,逗号,三个***.
情人=刘小翠 王大妞 Helen Jackon
情人=刘小翠,王大妞, Helen Jackon
情人=刘小翠***王大妞*** Helen Jackon
问题是这些特殊符号不太好选,空格,逗号比如对老外的名字就有问题,用三个***似乎还可以,但是String parse会显得很丑陋。如果你要保存的是comments=Something, 那么***,还是[,]{,}就都可能有问题了,因为comments的内容可能是任何字符,不像名字那么好处理了,是不是?
[第三代:注册库文件]
Windows从9x起,就逐渐开始使用注册库(registration file)了。注册库功能比起ini文件来要强大很多,它可以有层次结构,可以保存文本以及二进制格式的信息。更重要的是这些设置可以使针对某个程序的,也可以是用户私有的。这一点非常重要。也就是说管理员在安装软件的时候可以给程序以一些设置。而具体到每一个用户呢,又可以根据自己的喜好来保存自己的设置。这标志着一个操作系统从单用户体系到多户体系的飞跃(当然了,Unix,Linux从一开始就是多用户体系)。
Windows有专门的API来操作注册库,说不上多好用,但基本上可以解决问题。
注册库文件解决了一些问题,但是好像带来的问题更严重。从理论上说,注册库是一种“中央统一控制”的思路,事实上,很多程序还是“地方自治”更合适。注册库造成的安装/卸载以及DLL冲突问题被广大Windows用户亲切地称为“DLL Hell”。虽然COM/DCOM DLL 是这个人问题的罪魁祸首,但注册库文件也算得上是“协同案犯”了。
现在最被推崇的软件是那种“踏雪无痕”的“纯绿色”软件。也就是软件安装不touch计算机的任何东西,只要求在硬盘上有一亩三分地就成。一应东西都在自己的地盘上解决,决不到处乱窜,shit around。如果想卸载软件,也就是一个简单的文件删除命令。
[第四代:XML Config文件]
从格式和功能上看,XML完全可以满足我们的需求。XML可以很轻松的表达无穷多层次的数据结构,另外XML是看得见的TEXT file,很容易察看和修改。看起来是解决这一问题的不二人选。但使用XML也不是那么容易的一件事情。
第一: 有关XML的API还在不断的演化和变动之中。很多人对到底如何操作XML还感觉着很困惑。有的语言对XML支持还行(比如说.NET),有些呢,则不尽如人意,比如说Java,C++。编辑和修改XML有时候就显得很麻烦,挺费劲儿的。为了小小的XML文件,往往要使用挺大个儿的第三方软件,大有杀鸡用牛刀的味道。
第二,这个XML文件放什么地方也挺麻烦。一般来说,程序的config文件和可执行文件在一个目录中。但这也会造成一些问题。比若说你把你的软件安装到c:\program files\MySoftware\目录下。程序和XML配置文件都放在那里。问题是c:\program files理论上是一个只读目录,除了安装/卸载以外,任何程序都不应该修改或是增删那里的文件。这一点在Vista中更是被极大的强化了。所以说如果你的config文件可能会要改动,那么放在程序所在目录是不太合适的。在XP上,如果用户是Admin还没问题,但对于普通用户,更改config文件的操作就会失败。另外,你一个共享的config文件,怎么保存N个用户的私有设置呢?
[第五代:标准化的API]
既然这是一个程序开发的普遍问题,那么为什么没有人站出来给提供一个标准呢?Good question。经过了这么多年的摸索,人们终于意识到了这个标准的重要性。
Java的对策是一套Preferences API。程序的设置以及用户自己的定制都可以用这套API来操作。Java会检测当前运行的环境而把这些信息保存到“正确”的地方。比如说如果你在Windows上运行Java程序,这些设置就会被保存到注册库文件中去(共享信息放到HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs,个人私有信息放到HKEY_CURRENT_USER\Software\JavaSoft\Prefs)。如果是Linux平台呢,java.util.prefs.FileSystemPreferencesFactory class会妥善安置这是信息,你就不用操心了。
使用Preferences API,你还可以保留数据类型(type),不用像INI文件以及XML文件,一切都是string,你还得作类型转换。不过呢,使用注册库这个法子似乎有些过时了。Java阵营要想想办法了。
.NET的策略似乎更“高明”一些。程序的设置被分成Application scope和User scope两大类。Application scope的设置是共享的,只读的,用户设置是可以更改的。
当你安装程序的时候,xxx.exe和xxx.config(xml格式)被放置到c:\program files下。之后呢,如果用户更改了个人的设置,这个xxx.config文件并没有改动,这满足了c:\program files下文件只读的要求。用户的改动被放置到了神秘的地方。对于用户而言,他感觉不到这些背后的黑幕,只感觉到自己的定制都被很好的保存起来了。下回使用软件,这些设置都被忠实的反映了出来。.NET library在背后做了手脚,把个人的设置放到了%InstallRoot%\Documents and Settings\username\Local Settings之下(如果你没有特殊指定地方的话)。在程序运行的时候,用户设置和xxx.config被合并了起来。如果用户更改了某些User scope的设置,那么用户的设置将被反映出来,否则就使用xxx.config里面的缺省用户设置。
和Java一样,微软的config文件也是type safe的。你可以甚至保存Color, Font一类的东西。另外,Visual studio有GUI帮助你做这件事情,使得问题简化了不少。当然你要是对这个问题有特殊的要求,你可能就要一头扎到.NET的libray里面去了,可以告诉呢,问题并不简单。这些Class你可能就要先搞搞懂。
和Java不同是.NET不再使用注册库文件了。这是一个不小的进步,可以鼓励一下。当然你苦着喊着非要用,那也没人能拦得住你,.NET还提供API。
====================================
这说了大半天的了,谈的都是桌面应用的事儿,那么Web应用呢?哈哈,这个问题就下回再聊吧!
这个沙发要抢
粗看了一下,还真有些共鸣,呵呵。命令行参数太低级了,几乎没用过(倒是偶尔用用batch文件);后来就用初始化文件;再后来又觉着注册库文件比较专业;发现注册库文件有时候挺麻烦(危险?),又迷上XML了;现在返璞归真,还是最喜欢用INI文件。
“标准化的API”是个新东东,有空学习一下。
条条大路通Code
只不过是稍稍忙了一些。这两天有一点点时间,赶紧着灌点水。
原来是.net的XML配置文件啊。
好久没看Java方面的东西了,JDOM在6.0内仍然没有被包括么?
还是 unix 省事,路径加 .rc 文件搞定一切.
少。
是不是 Windows 越用越慢,注册库越用越大,DLL Hell 的问题将通过使用标准化的 API 解决了?