XML曾经很火,什么技术只要跟XML沾边儿就顶上“标准”的光环,后来大家慢慢意识到XML的种种弊端,比如差劲的表达能力,枯燥的解析(SAX),性能低下(DOM),越来越多的人开始理智地使用XML。只把它用在“合适”的时候。程序员中仍然存在滥用XML的惯性,最近还和同事们争论了半天java和xml的使用场景。
先跑下题聊聊java. 近两年越来越多搞Java的人跑去学动态语言,ruby, groovy, scala之类的。 原因在于这些动态语言“表达能力”更好。是的,这些语言更灵活,更精炼。不难理解,后出的编程语言更倾向于合理,毕竟它有前人的宝贵经验可以借鉴。java的一些设计的确令人诟病,比如checked exception, 对泛型支持的不完备。但就从“表达力”来说,我觉得java的表达力不强不弱正正好好。Java的定位本来就是大规模企业级应用,过度灵活的编程语言不易维护。新型的动态语言倾向于过度灵活,虽然支持快速开发,但是我相信在多人,甚至几十人合作开发的项目中,如果对语言非常灵活的特性不加以限制,随着程序的规模一点点增大,维护的难度会陡然加大。而一旦通过convention限制使用语言的一些特性,限制来限制去不就又成java了么?好吧,好吧,我知道这会是个有争议的话题,我就是不相信用ruby能做个ERP出来,五年之后也不会有。这不是这篇文字要讨论的重点,我想说的是,java在表达能力方面已经让一些人不满意了,而XML呢?XML的表达能力比java差了N多个数量级!这年头,骑三轮车回收电脑的都知道程序设计要有弹性,换句话说,能适应变化。于是一个简单的梦想就是,来了新需求,咱不用改code, 改改xml配置就能满足就好了。是的,我也这么希望,尤其在我睡着的时候。以Java这样的面向对象 + 一些动态特性(reflection,dynamic proxy甚至aspectJ)的语言都很难做到如此灵活的应对变化,xml怎么会更容易做到呢?很多人喜欢XML的简单直观。比如我们可以在SWING上面封装一层基于XML的界面引擎,于是GUI就可以简单地写成这种风格:
1: <panel id=”xyz” width=”360” heigh=”720”……>
2:
3: <label id=”label_1” attr_1=”xxx” attr_2=”yyy”/>
4:
5: <textarea id=”textarea_1” attr_1=”xxx” attr_2=”yyy”/>
6:
7: </panel>
它有一个好处就是易于扩展,比如现在又想加一个checked box,只要在里面插入一个<checkbox id=……/>就行了。我承认它的确易于扩展。但是如果你简单封装一下java API,不也是一行code的事儿么?无非就是panel.addChild(new CheckedBox(attr_1, attr_2))之类的这么一句code。难道这就不简单,不直观了?程序一涉及到xml,就涉及到IO, 解析XML,这都是额外的工作量,况且xml中的“对象”(我很难承认complex type算是对象)跟Java里的对象根本不是一码事,从xml里解析出来的表示数据类型的type最后还是要生成对应特定的java对象,这都是麻烦事儿。 多写code的坏处远不止写的时候费事儿,所写的每行code最后都是要维护的,就算code很strong, 我还嫌code太长,滚鼠标滚轮儿累手指头,多个文件放那儿累花眼。总之,但凡xml改一两行能解决的问题,不用xml,就用java也是一两行的工作量,只要稍微花点心思封装好API就行。不用XML可以省不少开发和维护的工作。理想情况下,改改xml就能应对新需求。但现实和理想总是有差距的,一旦xml的schema不足以应对变化,我们就得改xml, 改schema,改解析的code,改业务逻辑的code(这个没法避免)。这不是没事儿找病么?xml是extendable markup language. 它真能比java还extendable?扯淡!
当然XML有它合理的应用场景,我能想到的是四个方面,一定有漏掉的情况,欢迎朋友们补充。
一, 存储树状数据(起码三层以上。三层或三层以下就用java合成也挺方便的);二, 配置信息;三、描述标准协议(比如wsdl); 四,wrap数据以便于传输等(比如soap)
在应用产品中,自己设计xml来辅助应用系统的场景不应该很多。
另有一种使用xml的误区是,把xml暴露给用户让他自己“扩展”。我觉得, 凡是暴露给客户的东西都是UI,平时Swing界面,web界面是GUI,暴露给客户改的xml算是UI. 也许有的人说,一旦弄GUI,就有一堆麻烦事儿,比如i18n啥的,让用户自己配置配置xml就能改动页面不是挺好么,还不用考虑i18n了。问题是,用xml不是“不用”考虑国际化,而是根本没法考虑国际化。
<wallet><money>100</money></wallet> 这个美国人能看懂,对中国人就得用<钱包><钱>100</钱></钱包>
这么做很明显用户体验很差。另外,这也一定程度上暴露了你的实现方式,起码客户知道,哦,原来你是用xml存数据的,schema就是这个样子。
Ajax刚铺天盖地的时候,都用xml传数据,后来越来越多人用Json. Spring和Hibernate等一堆框架在几年前都用巨大的XML来配置,现在越来越多人转向annotation(当然,这个有一定争议)。XML热度减退,大家趋于理性是好事。XML当然很有用,但是程序员们该能想清楚什么是"使用", 什么是"滥用".