人在江湖

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            82 Posts :: 10 Stories :: 169 Comments :: 0 Trackbacks

          XML曾經(jīng)很火,什么技術(shù)只要跟XML沾邊兒就頂上“標(biāo)準(zhǔn)”的光環(huán),后來(lái)大家慢慢意識(shí)到XML的種種弊端,比如差勁的表達(dá)能力,枯燥的解析(SAX),性能低下(DOM),越來(lái)越多的人開(kāi)始理智地使用XML。只把它用在“合適”的時(shí)候。程序員中仍然存在濫用XML的慣性,最近還和同事們爭(zhēng)論了半天java和xml的使用場(chǎng)景。

          先跑下題聊聊java. 近兩年越來(lái)越多搞Java的人跑去學(xué)動(dòng)態(tài)語(yǔ)言,ruby, groovy, scala之類的。 原因在于這些動(dòng)態(tài)語(yǔ)言“表達(dá)能力”更好。是的,這些語(yǔ)言更靈活,更精煉。不難理解,后出的編程語(yǔ)言更傾向于合理,畢竟它有前人的寶貴經(jīng)驗(yàn)可以借鑒。java的一些設(shè)計(jì)的確令人詬病,比如checked exception, 對(duì)泛型支持的不完備。但就從“表達(dá)力”來(lái)說(shuō),我覺(jué)得java的表達(dá)力不強(qiáng)不弱正正好好。Java的定位本來(lái)就是大規(guī)模企業(yè)級(jí)應(yīng)用,過(guò)度靈活的編程語(yǔ)言不易維護(hù)。新型的動(dòng)態(tài)語(yǔ)言傾向于過(guò)度靈活,雖然支持快速開(kāi)發(fā),但是我相信在多人,甚至幾十人合作開(kāi)發(fā)的項(xiàng)目中,如果對(duì)語(yǔ)言非常靈活的特性不加以限制,隨著程序的規(guī)模一點(diǎn)點(diǎn)增大,維護(hù)的難度會(huì)陡然加大。而一旦通過(guò)convention限制使用語(yǔ)言的一些特性,限制來(lái)限制去不就又成java了么?好吧,好吧,我知道這會(huì)是個(gè)有爭(zhēng)議的話題,我就是不相信用ruby能做個(gè)ERP出來(lái),五年之后也不會(huì)有。這不是這篇文字要討論的重點(diǎn),我想說(shuō)的是,java在表達(dá)能力方面已經(jīng)讓一些人不滿意了,而XML呢?XML的表達(dá)能力比java差了N多個(gè)數(shù)量級(jí)!這年頭,騎三輪車回收電腦的都知道程序設(shè)計(jì)要有彈性,換句話說(shuō),能適應(yīng)變化。于是一個(gè)簡(jiǎn)單的夢(mèng)想就是,來(lái)了新需求,咱不用改code, 改改xml配置就能滿足就好了。是的,我也這么希望,尤其在我睡著的時(shí)候。以Java這樣的面向?qū)ο?+ 一些動(dòng)態(tài)特性(reflection,dynamic proxy甚至aspectJ)的語(yǔ)言都很難做到如此靈活的應(yīng)對(duì)變化,xml怎么會(huì)更容易做到呢?很多人喜歡XML的簡(jiǎn)單直觀。比如我們可以在SWING上面封裝一層基于XML的界面引擎,于是GUI就可以簡(jiǎn)單地寫(xiě)成這種風(fēng)格:

             1: <panel id=”xyzwidth=”360heigh=”720”……>
             2:  
             3: <label id=”label_1attr_1=”xxxattr_2=”yyy/>
             4:  
             5: <textarea id=”textarea_1attr_1=”xxxattr_2=”yyy/>
             6:  
             7: </panel>

          它有一個(gè)好處就是易于擴(kuò)展,比如現(xiàn)在又想加一個(gè)checked box,只要在里面插入一個(gè)<checkbox id=……/>就行了。我承認(rèn)它的確易于擴(kuò)展。但是如果你簡(jiǎn)單封裝一下java API,不也是一行code的事兒么?無(wú)非就是panel.addChild(new CheckedBox(attr_1, attr_2))之類的這么一句code。難道這就不簡(jiǎn)單,不直觀了?程序一涉及到xml,就涉及到IO, 解析XML,這都是額外的工作量,況且xml中的“對(duì)象”(我很難承認(rèn)complex type算是對(duì)象)跟Java里的對(duì)象根本不是一碼事,從xml里解析出來(lái)的表示數(shù)據(jù)類型的type最后還是要生成對(duì)應(yīng)特定的java對(duì)象,這都是麻煩事兒。 多寫(xiě)code的壞處遠(yuǎn)不止寫(xiě)的時(shí)候費(fèi)事兒,所寫(xiě)的每行code最后都是要維護(hù)的,就算code很strong, 我還嫌code太長(zhǎng),滾鼠標(biāo)滾輪兒累手指頭,多個(gè)文件放那兒累花眼。總之,但凡xml改一兩行能解決的問(wèn)題,不用xml,就用java也是一兩行的工作量,只要稍微花點(diǎn)心思封裝好API就行。不用XML可以省不少開(kāi)發(fā)和維護(hù)的工作。理想情況下,改改xml就能應(yīng)對(duì)新需求。但現(xiàn)實(shí)和理想總是有差距的,一旦xml的schema不足以應(yīng)對(duì)變化,我們就得改xml, 改schema,改解析的code,改業(yè)務(wù)邏輯的code(這個(gè)沒(méi)法避免)。這不是沒(méi)事兒找病么?xml是extendable markup language. 它真能比java還extendable?扯淡!

          當(dāng)然XML有它合理的應(yīng)用場(chǎng)景,我能想到的是四個(gè)方面,一定有漏掉的情況,歡迎朋友們補(bǔ)充。

          一, 存儲(chǔ)樹(shù)狀數(shù)據(jù)(起碼三層以上。三層或三層以下就用java合成也挺方便的);二, 配置信息;三、描述標(biāo)準(zhǔn)協(xié)議(比如wsdl); 四,wrap數(shù)據(jù)以便于傳輸?shù)?比如soap)

          在應(yīng)用產(chǎn)品中,自己設(shè)計(jì)xml來(lái)輔助應(yīng)用系統(tǒng)的場(chǎng)景不應(yīng)該很多。

          另有一種使用xml的誤區(qū)是,把xml暴露給用戶讓他自己“擴(kuò)展”。我覺(jué)得, 凡是暴露給客戶的東西都是UI,平時(shí)Swing界面,web界面是GUI,暴露給客戶改的xml算是UI. 也許有的人說(shuō),一旦弄GUI,就有一堆麻煩事兒,比如i18n啥的,讓用戶自己配置配置xml就能改動(dòng)頁(yè)面不是挺好么,還不用考慮i18n了。問(wèn)題是,用xml不是“不用”考慮國(guó)際化,而是根本沒(méi)法考慮國(guó)際化。

          <wallet><money>100</money></wallet> 這個(gè)美國(guó)人能看懂,對(duì)中國(guó)人就得用<錢(qián)包><錢(qián)>100</錢(qián)></錢(qián)包>

          這么做很明顯用戶體驗(yàn)很差。另外,這也一定程度上暴露了你的實(shí)現(xiàn)方式,起碼客戶知道,哦,原來(lái)你是用xml存數(shù)據(jù)的,schema就是這個(gè)樣子。

          Ajax剛鋪天蓋地的時(shí)候,都用xml傳數(shù)據(jù),后來(lái)越來(lái)越多人用Json. Spring和Hibernate等一堆框架在幾年前都用巨大的XML來(lái)配置,現(xiàn)在越來(lái)越多人轉(zhuǎn)向annotation(當(dāng)然,這個(gè)有一定爭(zhēng)議)。XML熱度減退,大家趨于理性是好事。XML當(dāng)然很有用,但是程序員們?cè)撃芟肭宄裁词?使用", 什么是"濫用".

          posted on 2011-05-07 00:22 人在江湖 閱讀(3062) 評(píng)論(9)  編輯  收藏 所屬分類: design

          Feedback

          # re: XML的濫用 2011-05-07 12:46 Unmi
          好像還是沒(méi)理出個(gè)理來(lái),沒(méi)看到強(qiáng)有力的證明。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-07 18:18 rox
          和樓主感同身受。
          XML不是不好,是被神話和濫用了。
          XML使用上,最方便的莫過(guò)于Flex的ActionScript,太方便了。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-10 06:36 jacklondon
          有幾點(diǎn)不同意樓主:
          1. xml 在 GUI 編程中的應(yīng)用。
          我覺(jué)得還算正常。純 Java 之所以不適合,是因?yàn)閷?duì)同樣的工作,Java 可以有多種寫(xiě)法,會(huì)造成所見(jiàn)即所得的顯示問(wèn)題。以下摘自我之前的博客:
          Java 語(yǔ)法中并沒(méi)有支持 GUI design time 的語(yǔ)法標(biāo)簽,對(duì)于編譯器來(lái)說(shuō),在設(shè)計(jì)時(shí)從Java 代碼還原到設(shè)計(jì)窗口技術(shù)上太難。 JBuilder 允許程序員修改向?qū)Мa(chǎn)生的 jbInit 函數(shù),結(jié)果是 JBuilder 的 GUI design 經(jīng)常出笑話,比如 JBuilder 好幾個(gè)版本都存在的 GUI 設(shè)計(jì)時(shí)只認(rèn)識(shí) this.setSize 不認(rèn)識(shí) this.setBounds 的問(wèn)題。 Netbeans 干脆不允許程序員修改 initComponents 函數(shù),是好是壞還不一定。一般而言,Netbeans 對(duì)于每一個(gè)可視化的 .java 文件都會(huì)生成一個(gè) .form 文件。對(duì)于 Netbeans 編譯器來(lái)說(shuō),在設(shè)計(jì)時(shí)從Java 代碼還原到設(shè)計(jì)窗口是通過(guò)解析 .form 文件,這樣技術(shù)難度下降很多,也不會(huì)像 JBuilder 一樣經(jīng)常出低級(jí)笑話。
          免費(fèi)的 Java GUI 開(kāi)發(fā)工具 Netbeans 介紹
          http://blog.csdn.net/jacklondon/archive/2003/04/19/14262.aspx
          2. 國(guó)際化用 xml 很正常。之前很多程序都有 ini 文件,這樣做國(guó)際化,好處在于可以讓熱心的用戶(不懂編程的用戶)幫忙翻譯。樓主所說(shuō)“一定程度上暴露了你的實(shí)現(xiàn)方式”沒(méi)有什么道理。我用 ini /xml 暴露了什么?
          ----歡迎大家試用我們的單點(diǎn)登錄系統(tǒng) http://zhegui.biz  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-10 08:01 人在江湖
          Jacklondon, 你舉的兩個(gè)例子跟我的想法沒(méi)有沖突。
          第一個(gè)例子:
          你說(shuō)XML可以在GUI里使用,是基于特定的IDE的支持,<B>不是你自己設(shè)計(jì)出一個(gè)基于xml的引擎</B>。NetBeans這么做是因?yàn)樗荌DE。我絕不相信哪個(gè)應(yīng)用產(chǎn)品先基于Swing封裝出來(lái)一套xml引擎,然后讓developer寫(xiě)xml, 而不用寫(xiě)java, 那使用這套引擎的人就根本不必是java developer了。 所謂"GUI Design出笑話"是IDE的問(wèn)題,不是swing的問(wèn)題。design time form文件應(yīng)該是生成出來(lái)的吧?不是自己手敲xml就生成class, 讓JDK解析的吧?我認(rèn)為有強(qiáng)烈需求要求程序員用xml寫(xiě)GUI背后的原因是程序員本身不是swing developer.基于swing封裝成客戶化的更方便的component(更方便的意思就是更不靈活),一定比封裝成xml引擎更簡(jiǎn)單.
          第二個(gè)例子,國(guó)際化不是functional層面的,“熱心的用戶”是幫程序員做事情的,不是真正產(chǎn)品的consumer. 我不喜歡的是,強(qiáng)迫使用產(chǎn)品的用戶edit xml.  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-11 00:08 jacklondon
          @人在江湖
          所謂"GUI Design出笑話"是IDE的問(wèn)題,不是swing的問(wèn)題----第一,沒(méi)有人提到Swing;第二,如果所有 Java IDE 都無(wú)法解決這些問(wèn)題,就說(shuō)明 Java 語(yǔ)法不適合用于“用戶界面設(shè)計(jì)”。注意,這里談的是“設(shè)計(jì)時(shí)”問(wèn)題,不是“運(yùn)行時(shí)”問(wèn)題。
          如果說(shuō)國(guó)際化用 xml/ini 是強(qiáng)迫用戶 edit xml ,那么你用什么技術(shù)談得上算是不強(qiáng)迫?如果按微軟的風(fēng)格,是要用資源dll 的,這更強(qiáng)迫翻譯人員非用 visual studio 不可,更不可取。至少國(guó)際化用 xml/ini,是可以讓別人用操作系統(tǒng)自帶工具(windows/linux 都可帶有可修改 xml/ini 的文本編輯器),不用另外找工具。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-11 07:43 人在江湖
          @jacklondon
          哈哈,首先還是感謝你在我的博客里發(fā)表技術(shù)看法,喜歡看到有見(jiàn)地的想法。
          我們沒(méi)有在討論同一個(gè)問(wèn)題,你說(shuō)“設(shè)計(jì)時(shí)”,只有IDE才涉及到“設(shè)計(jì)時(shí)”的問(wèn)題,我博客里舉的例子是說(shuō)程序員"手敲XML"還是"手敲java"寫(xiě)應(yīng)用程序的界面。我覺(jué)得從易用性角度說(shuō),兩者沒(méi)區(qū)別,但封裝到“手敲XML”的成本要高出很多很多,所以根本不可取。
          至于國(guó)際化的問(wèn)題....
          我舉的例子是功能性的,不是i18n的,所以這個(gè)例子是
          <wallet><money>100</money></wallet> 這個(gè)美國(guó)人能看懂,對(duì)中國(guó)人就得用<錢(qián)包><錢(qián)>100</錢(qián)></錢(qián)包>

          用戶修改xml來(lái)做國(guó)際化,修改的是content,不是標(biāo)簽本身。把resource property放xml里我覺(jué)得沒(méi)有問(wèn)題,那么樣子會(huì)是
          <key name="abc.txt"> wallet </key>
          <key name="abc.txt"> 錢(qián)包 </key>
          我沒(méi)說(shuō)非得把key翻譯成 鑰匙。 因?yàn)閕18n用途的xml結(jié)構(gòu)比輔助功能的xml簡(jiǎn)單得多,對(duì)于復(fù)雜的xml結(jié)構(gòu)(功能性質(zhì)的),<B>標(biāo)簽本身是有含義的,所以標(biāo)簽本身有i18n的必要</B>。你跟我說(shuō)的不是一回事。盡管我覺(jué)得用properties文件夠用了,不知道為什么一定要用xml. 對(duì)比java, 一涉及到xml就要多考慮I/O和解析。對(duì)比properties文件,一涉及到xml就要格外考慮解析。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-18 15:34 greatghoul
          我是不喜歡使用xml的,感覺(jué)寫(xiě)起來(lái)很累,還是annotation好用些

          相比之下,yaml要比xml好用多了。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用 2011-05-19 00:23 jacklondon
          1. 在應(yīng)用產(chǎn)品中,自己設(shè)計(jì)xml來(lái)輔助應(yīng)用系統(tǒng)的場(chǎng)景不應(yīng)該很多===樓主沒(méi)有說(shuō)出個(gè)道道來(lái)。
          2. 用 xml不是“不用”考慮國(guó)際化,而是根本沒(méi)法考慮國(guó)際化====沒(méi)有任何道理。用 ini/xml 做多語(yǔ)言的軟件多了,我現(xiàn)在在用的 notepad++ 好像就是,dreamweaver 也是。
          3. 起碼客戶知道,哦,原來(lái)你是用xml存數(shù)據(jù)的,schema就是這個(gè)樣子。====那有如何?你知道又如何?你認(rèn)為把軟件做到別人看不明白才是水平?軟件好用、符合用戶要求才是水平。  回復(fù)  更多評(píng)論
            

          # re: XML的濫用[未登錄](méi) 2011-05-19 17:52 Frank
          xml 是可以國(guó)際化的,可以看
          Best Practices for XML Internationalization
          http://www.w3.org/TR/xml-i18n-bp/

          就是太麻煩了, Best Practice 就有24條之多,看起來(lái)那是相當(dāng)?shù)谋罎?

          xml 處理起來(lái)比較麻煩, 尤其在沒(méi)有好的engine, 自己 parse 那是相當(dāng)?shù)耐纯啵潜┞督o客戶,那就更麻煩了  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 西青区| 建昌县| 区。| 达拉特旗| 政和县| 龙里县| 孟连| 云南省| 额敏县| 苏尼特右旗| 纳雍县| 关岭| 贺兰县| 涿州市| 乌拉特前旗| 安塞县| 鸡东县| 沈阳市| 安国市| 山西省| 台湾省| 珠海市| 洞口县| 阜新市| 贵南县| 江西省| 临潭县| 萍乡市| 绥德县| 龙南县| 师宗县| 绥棱县| 莒南县| 遵义县| 民乐县| 安图县| 福清市| 石狮市| 牡丹江市| 中方县| 曲水县|