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當然很有用,但是程序員們該能想清楚什么是"使用", 什么是"濫用".