domain-specific languages == DSL

          Null

          posted @ 2006-09-25 09:05 Sheldon Sun 閱讀(108) | 評(píng)論 (0)編輯 收藏

          Martinn Flower's blog

          http://www.martinfowler.com/bliki/

          posted @ 2006-09-25 09:01 Sheldon Sun 閱讀(109) | 評(píng)論 (0)編輯 收藏

          Ruby On Rails與Jdon Framework架構(gòu)比較

          http://java.ccidnet.com/art/297/20060508/547541_1.html 本文試圖比較同屬快速開發(fā)性質(zhì)的Ruby on Rails(以下簡稱RoR)和Jdon Framework(以下簡稱JF)在架構(gòu)上異同,供大家在實(shí)際架構(gòu)選擇中比較。   RoR 是一個(gè)使用Ruby語言寫就的Web應(yīng)用框架,Ruby語言是類似Python, Smalltalk, PHP和Perl的動(dòng)態(tài)類型語言。從新特點(diǎn)層面看,Ruby on Rails并沒有提供比其他已經(jīng)存在的Web應(yīng)用框架新的東西,它的唯一特點(diǎn)就是快速開發(fā)。RoR大概誕生于2004年6月份。   JF是使用Java語言編寫的、基于Ioc/AOP微容器的快速開發(fā)工具。JF是基于JdonSD構(gòu)件庫增刪改查框架基礎(chǔ)上發(fā)展起來的,1.0版本是在2004 年12月底完成。當(dāng)時(shí)推出時(shí)很難定位,時(shí)至今日,它應(yīng)該是Ruby on Rails、Spring和JBoss容器三個(gè)概念的一個(gè)中間體。屬于域驅(qū)動(dòng)開發(fā)框架(DDDD:omain Driven Development framework )。   JF雖是筆者操作完成,其實(shí)它是國人網(wǎng)絡(luò)結(jié)晶的開源產(chǎn)物,很多需求和思想都來自Jdon社區(qū)熱情參與者,看到很多初學(xué)者總是為簡單和靈活做痛苦選擇,為了寫一個(gè)簡單系統(tǒng),要么走入Jsp+JavaBeans誤區(qū),要么被復(fù)雜技術(shù)配置纏身,忘記業(yè)務(wù)本職工作。JF 推出后,道友提出各種建議甚至猛烈批判,這些都形成了JF發(fā)展動(dòng)力,促進(jìn)JF完善。從用戶出發(fā)的簡易之道使JF的起點(diǎn)和立意一下和RoR這樣國外產(chǎn)品走到了一起,下面我們?cè)敿?xì)進(jìn)行一下兩者架構(gòu)比較。 語言之爭   RoR代表的是動(dòng)態(tài)類型語言派別;而Java是一種靜態(tài)類型語言,當(dāng)初Java剛剛誕生時(shí),這種兩種類型派別之爭曾經(jīng)發(fā)生在Java和Smalltalk之間,后來現(xiàn)實(shí)選擇了Java這樣靜態(tài)類型語言,關(guān)鍵原因時(shí)動(dòng)態(tài)類型語言在編程時(shí)難以找出其一些潛在的語言Bug。   但是,隨著軟件工程中單元測試的重視,動(dòng)態(tài)類型語言+單元測試的結(jié)合克服了以上缺憾,從而使得RoR這樣得動(dòng)態(tài)類型語言重新東山再起。   促成RoR受到敏捷工程派別的領(lǐng)域?qū)<遥ㄈ鏜artin Fowler)推崇另外一個(gè)原因是,它被認(rèn)為是一種domain-specific languages(DSL)實(shí)現(xiàn),DSL是一種專門供領(lǐng)域建模專家(也就是系統(tǒng)分析師)使用的語言,這些領(lǐng)域?qū)<也煌诔绦蚋呤郑麄冇幸惶鬃约赫J(rèn)知世界和表達(dá)世界的思維和方式(如UML),因此,他們不感興趣于軟件設(shè)計(jì)細(xì)節(jié),希望軟件能夠按照他們分析設(shè)計(jì)的結(jié)果去運(yùn)行和執(zhí)行就可以了。   其實(shí),DSL并不是一個(gè)全新理念,它已經(jīng)在我們軟件領(lǐng)域中反復(fù)出現(xiàn),例如:我們很多人是關(guān)系數(shù)據(jù)庫領(lǐng)域?qū)<遥裕M管由O/R Mapping這樣工具出現(xiàn),但是并沒有改變這些領(lǐng)域?qū)<冶磉_(dá)方式,他們還是使用SQL等嚴(yán)謹(jǐn)?shù)臄?shù)學(xué)思維來實(shí)現(xiàn)他們的表達(dá)方式。   DSL概念非常好,但是是否有必要重新搞一套DSL語言則涉及很多方面的問題,新的語言總會(huì)在實(shí)踐中有新的陷阱,Java經(jīng)過十多年發(fā)展,成熟和發(fā)展是其特點(diǎn)。   當(dāng)然,別以為RoR頂著DSL新名詞就是一個(gè)非常好的東西,對(duì)其本質(zhì)微詞已經(jīng)不絕于耳,有人認(rèn)為它實(shí)質(zhì)不過就是1994的Visual FoxPro(Ruby on Rails is a Bloody Square Turd ),提出該觀點(diǎn)的作者認(rèn)為:為什么我們?cè)谝粋€(gè)沒有重構(gòu)以及調(diào)試支持的編碼環(huán)境中工作?為什么還要重覆以前的痛苦呢?如果你確實(shí)喜歡RoR的ActiveRecord,為什么不用. NET呢?RoR 不是開發(fā)Web應(yīng)用平臺(tái), RoR is a cult(RoR是宗教崇拜,筆者注:大概因?yàn)槭且驗(yàn)樗^大師級(jí)的人推薦原因).   無論如何,讓我們拋開爭執(zhí),通過比較看看RoR一些特點(diǎn)。 多層架構(gòu)   現(xiàn)在多層架構(gòu)已經(jīng)深入人心,多層主要是指表現(xiàn)層MVC、業(yè)務(wù)層和持久層多層分離的體系,由于Java是一個(gè)技術(shù)自由選擇的世界,因此,每個(gè)層面都有不同的具體框架技術(shù)供選擇, 提供選擇是一種好事,但是又可能是一種壞事,需要應(yīng)用者花費(fèi)精力學(xué)習(xí)和研究,這非常類似我們購物。   在微軟世界,由于各層框架技術(shù)幾乎都是由一家提供的,所以,.NET就索性將這些框架直接集成到IDE開發(fā)工具,對(duì)于有的程序員感覺.NET用起來很快,將開發(fā)工具和框架混合成一體,但這是以綁定為代價(jià)的,甚至有程序員反感Java世界IDE+框架的開發(fā)方式,認(rèn)為在開發(fā)工具之外還會(huì)多一個(gè)框架,并且認(rèn)為違背KISS(keep it simple and stupid)原則,其實(shí)不然,關(guān)鍵是追求KISS原則的同時(shí),不要使自己受制于某個(gè)廠商或平臺(tái),使自己變得簡單以及愚蠢 (失去自己作為客戶的上帝位置,被廠商忽視,成為簡單而愚蠢的人),此為KMSS(keep me simple and stupid)。   在Java世界,多層結(jié)構(gòu)實(shí)現(xiàn)路徑很多,從MVC到持久層框架有各種選擇,例如我們可以使用Struts以及Hibernate組合成一個(gè)J2EE多層 應(yīng)用系統(tǒng)。   Rails也提供了model/view/controller多層實(shí)現(xiàn),但是各層的實(shí)現(xiàn)框架也確定下來,省卻了程序員在多個(gè)框架之間選擇帶來的“麻煩”(這是相對(duì)的)。   而Jdon Framework則類似RoR這種提供缺省各層實(shí)現(xiàn)設(shè)計(jì),表現(xiàn)層在struts基礎(chǔ)上進(jìn)行了CRUD流程抽象;通過提供JdbcTemp實(shí)現(xiàn)持久層技術(shù),當(dāng)然,持久層具體實(shí)現(xiàn)也可以選擇hibernate等其他框架實(shí)現(xiàn),秉承提供缺省的,但是也是可替換的宗旨。   下圖是兩者各層架構(gòu)比較圖:   我們通過上圖可以看出,兩者流程基本一致,所不同的主要是兩點(diǎn):RoR的Action Pack和Active Record,下面我們就這兩點(diǎn)解釋如下: Action Pack   Action Pack是RoR的MVC組件框架:   View templates,相當(dāng)于Struts中的Jsp;   URL routing,相當(dāng)于struts-config.xml流程配置,RoR不是使用XML配置,而是作為腳本代碼,這也是一些人吹噓的RoR無繁多 XML配置真相所在,其實(shí),XML也是一種腳本,從某種意義上來說:XML比語言腳本更簡單易寫(至少語法不多)。   ActionController,初看相當(dāng)于struts的DispatchAction,但是因?yàn)槠浒瑯I(yè)務(wù)邏輯,而我們?cè)趈ava中是不推薦在在控制層action中寫業(yè)務(wù)邏輯的。   ActionController功能在于:RoR可以將瀏覽器的請(qǐng)求直接映射到ActionController類的方法上,這有些類似Struts 中的DispatchAction,但是,在Java中,業(yè)務(wù)邏輯是不推薦寫在表現(xiàn)層的控制類中的,控制類只是負(fù)責(zé)前后臺(tái)流程協(xié)調(diào),是一種 Mediator模式實(shí)現(xiàn),不應(yīng)該讓其加入更多職責(zé);在JF中,業(yè)務(wù)邏輯是寫在Service類中,JF通過自己的命令服務(wù)調(diào)用模式,也可以直接將瀏覽器的請(qǐng)求直接映射到Service類的方法上,例如,調(diào)用http://localhost//MyWeb/abc.do?method=xxx,將直接激活Service類的xxx方法,程序員直接編寫xxx方法內(nèi)容即可。   RoR的Filters過濾器也是Action Pack的一個(gè)部分,主要用來實(shí)現(xiàn)一些通用功能的動(dòng)態(tài)插入,這在JF中是通過AOP攔截器和Decorator模式來實(shí)現(xiàn)的,見AOP vs Decorator 一文,在JiveJdon3.0中,我們通過攔截器實(shí)現(xiàn)了組件方法權(quán)限訪問、以及緩存等通用功能。   Action Pack中還有Helpers功能相當(dāng)于Struts的標(biāo)簽庫,它可以把Model/ActionForm和Action以及html連接在一起,下面是RoR的Helpers如:   Name: <%= text_field "person", "name", "size" => 20 %>   ....   當(dāng)然,RoR的Helpers有很多種類,如Form Helpers/javascriptHelpers等等,相當(dāng)于一個(gè)個(gè)API 庫。它的Ajax & JavaScript helpers倒是很時(shí)髦的。   RoR的Layouts相當(dāng)于Struts的Tiles,這就不多說了。   Scaffolding提供一個(gè)數(shù)據(jù)表的CRUD功能實(shí)現(xiàn),Scaffolding類似代碼生成器,生成CRUD代碼,缺點(diǎn)是,如果你更改了代碼, Scaffolding會(huì)在覆蓋,必須再更改Scaffolding設(shè)置,實(shí)際用起來比較麻煩。而JF的CRUD是一個(gè)MVC流程上的精簡,屬于開發(fā)框架性質(zhì),而不是代碼生成,只需要通過jdonframework.xml配置:                                                       Active Record   RoR有一個(gè)Active Record組件,其實(shí)就是ORM實(shí)現(xiàn),相當(dāng)于Hibernate,它是Martin Fowler的 Active Record pattern實(shí)現(xiàn),它是指一個(gè)既包含數(shù)據(jù)又包含行為的對(duì)象,這些數(shù)據(jù)需要持久保存到對(duì)應(yīng)的數(shù)據(jù)表中。Active Record一個(gè)很明顯的特征是:將數(shù)據(jù)訪問邏輯也包含在這個(gè)domain對(duì)象中,通過這種辦法讓人們可以知道如何從數(shù)據(jù)庫讀寫數(shù)據(jù)。如下圖:   Active Record其實(shí)類似JF中Domain Object + Dao,也就是將Dao中對(duì)數(shù)據(jù)庫的CRUD方法和Domain Object整合在一起,我們知道,Dao模式本質(zhì)是橋模式,通過Dao可以將不同的數(shù)據(jù)庫訪問實(shí)現(xiàn)分離,并且在運(yùn)行時(shí)組合,但是,Martin Fowler將Dao從Domain Object分離出去的對(duì)象稱為貧血對(duì)象。   他的這個(gè)觀點(diǎn)筆者認(rèn)為不是從技術(shù)觀點(diǎn),而是從領(lǐng)域建模角度出發(fā)的,其實(shí)從技術(shù)觀點(diǎn)講,將Dao從Domain Object中分離在設(shè)計(jì)上非常靈活,例如使用JF開發(fā)的JiveJdon3.0中,我們就可以在Dao層中使用Decorator模式(過濾器)加入一層緩存,這樣,雖然我們Dao層使用的SQL實(shí)現(xiàn),我們也是可以實(shí)現(xiàn)持久層緩存,JiveJdon3.0整個(gè)Dao層設(shè)計(jì)相當(dāng)于一個(gè)Hibernate的微型(或者說輕量化),好處是:JiveJdon3.0這樣實(shí)現(xiàn)的緩存可以被各層如表現(xiàn)層直接訪問,減少路徑,提升運(yùn)行性能。 RoR秘籍   通過以上分析,我們也許已經(jīng)明白R(shí)oR和JF定位,大家為什么突然擁戴RoR,這是因?yàn)榇蠹冶容^厭惡XML配置,太復(fù)雜的XML配置只能增加開發(fā)的復(fù)雜性,而JF則在這方面從以下幾個(gè)方面進(jìn)行了努力: 1. 表現(xiàn)層的struts-config.xml配置是模板化的,CRUD流程固化模板化,拷貝粘貼就可以完成配置。 2. JF自身的配置很簡單,只包括兩個(gè)部分Models和Services,配置語法主要集中再M(fèi)odels部分,語法數(shù)量不超過10個(gè),Models負(fù)責(zé)CRUD流程配置,如果你不需要使用CRUD可以不用配置;Services是業(yè)務(wù)類配置,對(duì)于一個(gè)POJO類,只要寫:如下:        class="com.jdon.jivejdon.service.imp.ForumServiceImp"/>        class="com.jdon.jivejdon.service.imp.ForumMessageShell"/> 至于,這些POJO之間的調(diào)用關(guān)系,無需指定,這由JF內(nèi)置IOC微容器自動(dòng)配對(duì)解決。 3. 持久層試圖通過JdbcTemp或SQL語句簡化配置,當(dāng)然Hibernate等java工具也在進(jìn)步,不斷重構(gòu),相信會(huì)越來越簡單。   總結(jié):相比RoR,作為DDD(Domain Driven Development framework )實(shí)現(xiàn)的JF在快速開發(fā)和軟件高質(zhì)量上作了一個(gè)平衡,相當(dāng)于在RoR(快速,但非主流語言)和Spring(高質(zhì)量,但配置煩瑣)之間做了一個(gè)平衡。   JF一直也試圖爭取獲得國外軟件專家的認(rèn)可,可能會(huì)因?yàn)槠渌蛩匚茨苋缭福牵鳛楹蚏oR幾乎同時(shí)誕生的國產(chǎn)JF,作為由國人網(wǎng)民共同參與的結(jié)晶,已經(jīng)用事實(shí)證明,國人有能力靠創(chuàng)新沖刺世界軟件領(lǐng)域的前列。   無論如何,在RoR精神的召引下,Java世界將引來第四代語言4GL時(shí)代,同時(shí)能夠滿足求簡單或求靈活等不同編程心理的需求,迎來新的發(fā)展

          posted @ 2006-09-25 08:54 Sheldon Sun 閱讀(194) | 評(píng)論 (0)編輯 收藏

          再駁Java消亡論和回應(yīng)java消亡論的支持者

          9月14日,我在CSDN上看到了透明的一篇謬文 http://blog.csdn.net/gigix/archive/2006/09/11/1210180.aspx,論調(diào)十分之荒謬。所以,我在公司里冒著被老板發(fā)現(xiàn)的危險(xiǎn),即興寫了一篇短文http://blog.csdn.net/shendl/archive/2006/09/14/1222587.aspx ,予以駁斥。 CSDN的編輯把它和透明的那篇文章放在了一起。跟貼者甚眾,令我沒想到的是,我的文章居然被不少跟貼者駁斥,而且語言極盡諷刺、挖苦之能事。 我并不反對(duì)就技術(shù)問題爭論,也不是不允許別人就我的文章和觀點(diǎn)與我辯論。相反,我一向都非常歡迎同行指正我的錯(cuò)誤,能夠使我有所提高。 但是,多年與人打交道的經(jīng)驗(yàn)讓我深深地相信這樣一個(gè)真理:“你永遠(yuǎn)無法說服不想被你說服的人。” 這次眾多駁斥我的跟貼再一次驗(yàn)證了這樣一個(gè)真理。 我的文章由于成文比較倉促,所以確實(shí)在文筆上有一些漏洞,遣詞造句也不是很妥當(dāng)。但我認(rèn)為,一個(gè)嚴(yán)肅的辯論者,是不會(huì)咬文嚼字的尋找對(duì)方文法上的弱點(diǎn)的。否則的話,除了數(shù)學(xué)公理之外,沒什么話可以說了! 對(duì)于這樣的人,在我眼里,并不是在污辱我的智商(盡管他是這樣以為的),而是在侮辱他自己的智商。這說明他完全不具備與人交流的能力。 如果一定要咬文嚼字,那么所有判斷句都不可以在文章里用了。Java會(huì)消亡嗎?廢話,一定會(huì)。宇宙都會(huì)消亡,什么能不消亡? 論點(diǎn): 透明的意思是,3-5年內(nèi),Ruby將占據(jù)企業(yè)級(jí)應(yīng)用市場的主流。也就是JavaEE和今天的Ruby換個(gè)位子。我認(rèn)為,這是不可能的。Java平臺(tái)至少能夠繼續(xù)占據(jù)、企業(yè)級(jí)應(yīng)用市場主流地位10年。 Java平臺(tái)優(yōu)勢(shì)和對(duì)動(dòng)態(tài)OO的支持 有人說我不懂Ruby,也不懂Java。這我就不敢茍同了。我是不懂Ruby,但并不代表我不懂Ruby,Python,Smalltalk語言為代表的動(dòng)態(tài)面向?qū)ο笳Z言的機(jī)制。對(duì)于Java,我也許不比某些人懂得多,但也絕不會(huì)比一般的Java程序員懂得少。 我對(duì)Ruby的認(rèn)識(shí),僅僅是今年5月Martin Fowler先生在上海交大作的一次演講中Martin Fowler的Ruby編程演示。我還略為研究過Smalltalk和Python的語法。但是它們的類庫,我沒有研究過。 因?yàn)椋疫€不打算靠它們吃飯,那厚厚的專用類庫對(duì)我而言是沒有價(jià)值的。 Spring的AOP實(shí)現(xiàn)需要使用“反射”這種動(dòng)態(tài)技術(shù)。這也是促成我當(dāng)年研究Smalltalk和Python這樣的動(dòng)態(tài)面向?qū)ο笳Z言的原因。我也十分折服于動(dòng)態(tài)面向?qū)ο缶幊碳夹g(shù)的強(qiáng)大能力。我一直認(rèn)為動(dòng)態(tài)OO技術(shù)在未來,將在編程中發(fā)揮越來越大的作用,也一直希望JVM能夠增加更多的動(dòng)態(tài)技術(shù)。我還曾經(jīng)寫過文章為動(dòng)態(tài)OO技術(shù)搖旗吶喊過,此初衷依然不改! Java作為一個(gè)平臺(tái)也確實(shí)有這樣的能力,而且也正在向這個(gè)方面發(fā)展,JVM將會(huì)支持更多的動(dòng)態(tài)OO技術(shù)。 .NET平臺(tái)當(dāng)年推出之時(shí),就以支持多種靜態(tài)面向?qū)ο缶幊陶Z言為賣點(diǎn)。VB.NET,C#,Delphi,托管C++這4種主流的面向?qū)ο缶幊陶Z言都可以在.NET平臺(tái)上運(yùn)行。 同樣都是靜態(tài)面向?qū)ο缶幊陶Z言,它們之間除了關(guān)鍵字不同之外,有什么本質(zhì)上的區(qū)別嗎?沒有!VB.NET和C#是我所熟悉的兩種.NET語言。它們之間本質(zhì)上確實(shí)沒什么區(qū)別。唯一的區(qū)別是,.NET平臺(tái)的技術(shù)更新時(shí),C#會(huì)先得到支持,VB.NET要晚一些。比如,事件機(jī)制,.NET1.1時(shí),VB.NET用的是類似于Java1.0時(shí)的機(jī)制,C#用的是Java更新版本的機(jī)制。我想,應(yīng)該是因?yàn)槲④涀钪匾旵#的緣故吧。 .NET平臺(tái)同時(shí)支持多種類似的語言,雖然在市場上有吸引VB,C++,Delphi,Java等程序員的作用,但在技術(shù)上卻導(dǎo)致了開發(fā)資源的浪費(fèi)。一種技術(shù),要提供多個(gè)語言的實(shí)現(xiàn)。這比Java平臺(tái)只支持Java這一種靜態(tài)面向?qū)ο缶幊陶Z言要低效的多。我在發(fā)現(xiàn)了微軟優(yōu)先關(guān)照C#之后,就決定從VB.NET上轉(zhuǎn)到C#上,以免吃虧!自從Delphi投入.NET平臺(tái)之后,日漸式微,這也是一個(gè)平臺(tái)上不需要多種類似語言的明證!可以預(yù)見,.NET平臺(tái)上C#獨(dú)大的趨勢(shì)還會(huì)繼續(xù)下去。 .NET支持多種類似語言的另一個(gè)問題是,分裂了開發(fā)者社區(qū)。VB.NET,C#,Delphi,還有J#,托管C++,它們的語言原理和能力實(shí)際上都差不多,都是靜態(tài)面向?qū)ο笳Z言,但是,由于語法不同,就分裂成了幾個(gè)開發(fā)者社區(qū),彼此交流都不方便。 在我上一篇文章的評(píng)論者中,有人說我說錯(cuò)了,Java平臺(tái)上除了Java之外還有Beanshell等語言。拜托!兄弟,你的理解力沒什么問題吧?我說的是Java平臺(tái)上只有一種官方支持的靜態(tài)面向?qū)ο缶幊陶Z言。就是和.NET比較而言的。 Java平臺(tái)官方支持C++,C#,VB.NET,Delphi,J#嗎? Beanshell是一種動(dòng)態(tài)面向?qū)ο笳Z言,而且Sun官方可沒有支持它! 現(xiàn)在,Java平臺(tái)正在增強(qiáng)對(duì)動(dòng)態(tài)編程能力的支持。目前,開源社區(qū)提供了Beanshell,JRuby,JPython,Groovy等面向?qū)ο缶幊陶Z言。我相信,最后,在Java平臺(tái)上也會(huì)只剩下一種主流的動(dòng)態(tài)面向?qū)ο缶幊陶Z言。未來,Java平臺(tái)上會(huì)剩下兩種主流的編程語言:靜態(tài)面向?qū)ο缶幊陶Z言類型是Java;動(dòng)態(tài)面向?qū)ο缶幊陶Z言是上面中的一種,也許是Groovy,也許是JRuby。 將來,我們Java程序員將有2件編程利器:Java和動(dòng)態(tài)OO語言。對(duì)于編程問題,將能夠更加游刃有余!底層的API類庫,既可以是Java,也可以是其它動(dòng)態(tài)OO語言所編寫。反正都一樣是.class文件,Java和動(dòng)態(tài)OO語言都可以調(diào)用。 這就是未來!Ruby和Python這兩種平臺(tái)將會(huì)繼續(xù)慘淡的過日子,也許不會(huì)消亡,但成不了主流。不是因?yàn)樗鼈兊恼Z法不好,機(jī)制不行,而是因?yàn)樗鼈內(nèi)鄙貸ava平臺(tái)上那樣多的API,也缺少熟悉這些API的程序員。 它們的靈魂將會(huì)飛到Java平臺(tái)上,以JRuby,JPython的形式生存下來,在Java平臺(tái)上發(fā)展起來。 靜態(tài)OO語言和動(dòng)態(tài)OO語言的優(yōu)劣 接下來,再談一談靜態(tài)OO語言和動(dòng)態(tài)OO語言的優(yōu)劣的問題。 我欣賞動(dòng)態(tài)OO語言,smalltalk雖然出現(xiàn)的很早,開發(fā)者甚少,但是在它的社區(qū)中卻誕生許多著名的程序員和設(shè)計(jì)模式等思想。MVC模式,XP極限編程等我所尊敬的技術(shù)都出自smalltalk。 但是,靜態(tài)OO語言一直占據(jù)著主流的地位,也不是沒有原因的。除了編譯型語言的執(zhí)行速度比解釋型語言快之外,靜態(tài)OO語言還有其它的優(yōu)勢(shì)。速度的快慢,在今天來看,并不是十分重要。Java比C++慢一些,但現(xiàn)在測試下來,C++最多比Java快一倍而已(不要跟我說某一個(gè)程序速度差很多,我這里指的是一般的程序,不作特別的優(yōu)化和劣化處理)。只要速度不是相差一個(gè)數(shù)量級(jí),就不是問題。 靜態(tài)OO語言意味著更嚴(yán)格的語法,更多的編輯和編譯時(shí)的檢查步驟。更強(qiáng)的糾錯(cuò)能力,不正是編程語言發(fā)展的一個(gè)標(biāo)準(zhǔn)嗎?不是可以更好的提高效率嗎? 5月份那次看Martin Fowler先生演示編寫Ruby程序,IDE弱弱的報(bào)錯(cuò)能力讓Martin先生也傷了不少腦筋! 不錯(cuò),Ruby不需要給變量聲明類型。想指向哪個(gè)類型,就指向哪個(gè)類型。但是,指錯(cuò)了呢?只有在運(yùn)行時(shí)才能發(fā)現(xiàn)類型指錯(cuò)了。如果這是個(gè)復(fù)雜的程序,有很多執(zhí)行路徑呢?如果測試人員沒能夠窮盡所有這些可能的路徑呢?這個(gè)錯(cuò)誤豈不是會(huì)漏給用戶? 不錯(cuò),借助于測試驅(qū)動(dòng)開發(fā),是可以降低出錯(cuò)幾率。但是,測試驅(qū)動(dòng)開發(fā)也不是測試的銀彈,不能保證能夠找出所有的錯(cuò)誤。而且,靜態(tài)編程語言也可以使用測試驅(qū)動(dòng)開發(fā)技術(shù)。 市場預(yù)測 我預(yù)測,未來3-5年,Java平臺(tái)和.NET平臺(tái)都會(huì)增加對(duì)動(dòng)態(tài)OO語言的支持力度,它們上面的動(dòng)態(tài)OO語言將會(huì)達(dá)到實(shí)用化的程度。而Python和Ruby將會(huì)繼續(xù)維持現(xiàn)在這樣的市場規(guī)模。仍然處于邊緣。Python和Ruby的解釋器平臺(tái)不會(huì)得到多大范圍的應(yīng)用。就像今天,Web2.0的那些小網(wǎng)站帶來了Web2.0的概念,但最后是門戶網(wǎng)站Yahoo,Sina等占據(jù)了Web2.0的市場。 DSL特定領(lǐng)域語言 接下來,說說DSL特定領(lǐng)域語言的問題。Matin Fowler最近轉(zhuǎn)調(diào)了。我記得原來他非常支持XML格式的作用。但是,最近他說Ruby是最合適的DSL語言。盡管我仍然十分敬佩Martin Fowler先生,但是對(duì)他的這個(gè)觀點(diǎn),我不敢茍同。我認(rèn)為,DSL語言還是應(yīng)該使用xml格式,而不是使用Ruby這種類英語的編程語言來描述。 DSL可以說是一種“元數(shù)據(jù)”。用來描述程序。現(xiàn)在有2種元數(shù)據(jù):標(biāo)注和配置文件。 1.標(biāo)注是.net首先引入的。Java在5.0之后也引入了。標(biāo)注寫在源代碼中,和關(guān)鍵字一樣,只是標(biāo)注是可以自定義的。 標(biāo)注的優(yōu)點(diǎn)是,簡單。缺點(diǎn)是表達(dá)能力不強(qiáng)。 2.配置文件,一般又分為3種:屬性文件,一般文本文件和xml文件。 屬性文件中的數(shù)據(jù)是以“名—值”對(duì)的形式表示的。缺乏數(shù)據(jù)之間的關(guān)系結(jié)構(gòu)。表達(dá)能力不強(qiáng)。 文本文件,就是直接在文本中按照規(guī)定的語法寫上一段文本。類似自然語言,只是語法的限制很強(qiáng)。語法檢查,是一個(gè)大問題。如果沒有按照語法寫,就會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。 Xml文件,是層次結(jié)構(gòu)的。它的前身是層次數(shù)據(jù)庫。它的格式嚴(yán)謹(jǐn),語法容易驗(yàn)證,規(guī)則容易定義。只是稍微復(fù)雜一點(diǎn),需要寫上元素名。 但是,總的來說,XML文件格式的DSL還是功能最強(qiáng)大,語法驗(yàn)證能力最強(qiáng),目前也是首先的DSL語言的載體。 除了使用元數(shù)據(jù)之外,直接使用編程語言也是可以實(shí)現(xiàn)高等級(jí)的功能的。如,傳統(tǒng)的不使用xml配置文件的Java編程。Java作為一種編譯語言,需要編譯,不使用xml等配置,就不是很方便。 而Ruby作為解釋型語言,直接修改源代碼是非常方便的。我想這大概就是Martin Fowler先生關(guān)于使用Ruby作為DSL的原因吧。 但是,使用DSL語言的用戶,他懂Ruby嗎?懂編程嗎?愿意查看和修改源代碼嗎?我們中國的用戶懂英語嗎? 我認(rèn)為,DSL使用XML文件還是首選! OO就是銀彈! 最后,談?wù)勱P(guān)于OO的問題。有網(wǎng)友說我“言必OO?OO就是銀彈嗎?”。這里我回答他:OO就是銀彈! 我Blog上的副標(biāo)題是:“以O(shè)O為中心,堅(jiān)定不移的走Spring道路”。 面向?qū)ο缶幊蹋o我們帶來了多少API類庫。Int,String等基本的數(shù)據(jù)類型,以及順序、條件、循環(huán)3種控制流這樣簡單、細(xì)粒度的元素,通過類被封裝了起來,今天已經(jīng)能夠通過層層疊疊的類支持對(duì)現(xiàn)實(shí)世界的種種對(duì)象的模擬和抽象。 借助于類庫,眾多的DSL特定領(lǐng)域語言已經(jīng)被廣泛使用。今天的java程序員使用了更多的配置文件(這就是DSL)來編程。如Ant配置文件,Hibernate配置文件,Spring配置文件等等。 最近,我正在學(xué)習(xí)jBPM。jBPM也是一個(gè)Java類庫。通過Java類,它提供了一個(gè)DSL語言框架。我們能夠使用xml配置文件,編寫DSL語言:jpdl,bpel規(guī)范的。實(shí)現(xiàn)工作流、BPM等。 當(dāng)然,除了OOP之外,還有AOP。但是,AOP只是OOP的補(bǔ)充。OOP能夠?qū)崿F(xiàn)絕大部分的抽象模擬任務(wù)。 認(rèn)為OO無用的程序員,可能工作在嵌入式開發(fā)等與硬件有關(guān)的工作領(lǐng)域。他們的編程領(lǐng)域中,業(yè)務(wù)邏輯比較簡單,不需要過多的抽象層次。 但是,這并不能成為否定OO作用的理由。你用不著OO,并不代表OO沒用,并不代表OO不是銀彈。 OO已經(jīng)給我們帶來了多大的變化啊!Java的成功就是一例。 還是毛主席的那句話:“沒有調(diào)查,就沒有發(fā)言權(quán)”。對(duì)此我也是深有體會(huì)的,曾經(jīng)也犯過很多錯(cuò)。對(duì)于自己不懂的領(lǐng)域,硬是認(rèn)為別人的說法荒謬。后來,自己真正了解了那個(gè)領(lǐng)域之后,才知道“今是而昨非”啊!

          posted @ 2006-09-25 08:53 Sheldon Sun 閱讀(563) | 評(píng)論 (2)編輯 收藏

          Nokia

          10.?諾基亞(Nokia)鎮(zhèn)的名字來自流經(jīng)當(dāng)?shù)氐囊粭l河流。這條河名為“Nokianvirta”,在芬蘭古語種是黑貂的意思,這種動(dòng)物現(xiàn)在已經(jīng)絕跡。
            9.?諾基亞有時(shí)候被非諾基亞用戶和移動(dòng)軟件開發(fā)人員稱做“aikon”(就是把“Nokia”反過來寫),因?yàn)椤癮ikon”被用在許多SDK軟件包中,包括諾基亞自己的Symbian?S60?SDK。
            8.?和其他手機(jī)不同,諾基亞的通話計(jì)時(shí)器不會(huì)在通話連接的時(shí)候自動(dòng)開啟,而是在通話開始的時(shí)候開啟(除了S60系列手機(jī),比如諾基亞6600)。
            7.?諾基亞名列《財(cái)富》2006年最受推崇企業(yè)第20名(網(wǎng)絡(luò)通訊行業(yè)中的第1,非美國公司中的第4)。
            6.?在亞洲,數(shù)字4從來沒有出現(xiàn)在諾基亞手機(jī)的任何型號(hào)中,因?yàn)?在南亞和東亞的許多地區(qū)被認(rèn)為是不吉利的。
            5.?諾基亞公司字體是AgfaMonotype?Nokia?Sans字體,最初由Eric?Spiekermann設(shè)計(jì)。此前在廣告和手機(jī)用戶手冊(cè)中,諾基亞最常用的是Agfa?Rotis?Sans字體。
            4.?諾基亞手機(jī)收到短信時(shí)的“特殊”鈴聲是摩斯密碼的“SMS”(短信服務(wù)),“漸強(qiáng)”短信鈴聲是摩斯密碼的“Connecting?People”(當(dāng)時(shí)是翻譯成“科技以人為本”來著嗎?),“標(biāo)準(zhǔn)”短信鈴聲是摩斯密碼的“M”(代表“Message”,“信息”)。
            3.?諾基亞現(xiàn)在是世界上最大的數(shù)碼相機(jī)制造商,因?yàn)樗呐恼帐謾C(jī)銷售量超過了任何一個(gè)相機(jī)廠商。
            2.?實(shí)際上第一個(gè)商用GSM通話是1991年在赫爾辛基通過諾基亞支持的網(wǎng)絡(luò)打出的,打電話的人是芬蘭副總理Harri?Holkeri,用的是一個(gè)諾基亞手機(jī)。
            1.?諾基亞標(biāo)志性的鈴聲"Nokia?tune"實(shí)際上是改編自19世紀(jì)的吉他作品《Gran?Vals》,作者是西班牙音樂家Francisco?Tárrega。這個(gè)鈴聲在諾基亞手機(jī)中最早名為“Grande?Valse”。在1998年,這支鈴聲已經(jīng)廣為人知并被稱做“Nokia?Tune”,諾基亞將其改名并沿用至今

          posted @ 2006-09-23 19:34 Sheldon Sun 閱讀(134) | 評(píng)論 (0)編輯 收藏

          ??

          這兩天右眼總跳, 有點(diǎn)不祥的預(yù)感。。。

          posted @ 2006-09-08 11:12 Sheldon Sun 閱讀(94) | 評(píng)論 (0)編輯 收藏

          Jboss 設(shè)置根訪問方法

          在WAR包中添加JBOSS-WEB.XML, 設(shè)置他的/ 否則訪問將直接訪問到ROOT.war 研究了一個(gè)多小時(shí), 不管效率高不高, 反正搞定了!!!

          posted @ 2006-09-05 16:30 Sheldon Sun 閱讀(165) | 評(píng)論 (0)編輯 收藏

          日志

          無聊的一天, 躺在床上聽一天收音機(jī)!

          西班牙贏了希臘奪冠, 無所謂, 只要美國不贏就好, 不是討厭美國隊(duì), 讓他們認(rèn)識(shí)一下自己的位置也好, 要不每次都象很“鳥”的樣子,把隊(duì)長的位置看的比比賽還重要, 整天吵啊吵, 這下老實(shí)了吧!!!!!

          posted @ 2006-09-03 20:31 Sheldon Sun 閱讀(111) | 評(píng)論 (0)編輯 收藏

          Hibernate-繼承關(guān)系對(duì)應(yīng)

          Hibernate對(duì)繼承關(guān)系的對(duì)應(yīng)主要有三種策略: 對(duì)每個(gè)類對(duì)應(yīng)一個(gè)表: 這樣在COMPANY一方不能設(shè)置SET屬性; 不能進(jìn)行查詢, 只能對(duì)每個(gè)類進(jìn)行單獨(dú)的查詢! 容易在多對(duì)一的一方產(chǎn)生冗余數(shù)據(jù)。而且產(chǎn)生冗余字段(E.G Company <-- --> Employee) 只對(duì)父類設(shè)定對(duì)應(yīng)的表: 在父類內(nèi)設(shè)定子類區(qū)別字段, 對(duì)每個(gè)子類特有的字段, 在父類內(nèi)中都存在。 這樣在父類的映射文件中, 設(shè)定Domanatrator屬性, 用來制定SUBCLASS的TYPE, 子類有SUBCLASS TARGET 對(duì)應(yīng)父類的DOMANATROTOR屬性, 并且制定自己的屬性。支持多態(tài) 缺點(diǎn)是不能保證數(shù)據(jù)完整性, 因?yàn)閷?duì)每一個(gè)子類單獨(dú)的字段, 父類的表必須允許其值為空。 對(duì)父類和子類單獨(dú)見表, 用外鍵進(jìn)行關(guān)聯(lián): 用JOIN-SUBCLASS TARGET進(jìn)行外鍵關(guān)聯(lián), 并用KEY TARGET來指定關(guān)聯(lián)屬性。支持多態(tài), 但查詢用到外連接, 不易性能。 SUMMARY: 對(duì)關(guān)系數(shù)據(jù)完整性要求較高用第一種方法, 子類的獨(dú)立字段不是很多用第二種方法, 否則用第三種方法。

          posted @ 2006-08-30 08:23 Sheldon Sun 閱讀(546) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共5頁: 上一頁 1 2 3 4 5 
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 青岛市| 澎湖县| 吉隆县| 东兴市| 玉山县| 榆林市| 当涂县| 阳新县| 银川市| 香港| 宁国市| 浦城县| 彩票| 日土县| 新乡县| 浮山县| 文化| 长寿区| 延长县| 建阳市| 临泽县| 苍南县| 绵阳市| 金湖县| 仁化县| 通辽市| 新乡县| 赤水市| 偏关县| 通州市| 日照市| 申扎县| 台湾省| 沂水县| 齐河县| 沂源县| 广东省| 山东省| 周宁县| 河东区| 清涧县|