<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    domain-specific languages == DSL

    Null

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

    Martinn Flower's blog

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

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

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

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

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

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

    Nokia

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

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

    ??

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

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

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

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

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

    日志

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

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

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

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

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

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

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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 国产曰批免费视频播放免费s| 国产99视频精品免费视频76| 久别的草原电视剧免费观看| 亚洲精品麻豆av| 特级一级毛片免费看| 国产小视频在线观看免费| 亚洲国产欧美日韩精品一区二区三区 | 一级白嫩美女毛片免费| 免费国内精品久久久久影院| 亚洲乱理伦片在线观看中字| 精品久久免费视频| 亚洲AV无码片一区二区三区 | 亚洲AV无码乱码在线观看性色扶| 国产亚洲精品美女久久久久 | 亚洲综合自拍成人| 免费人成视频在线观看网站 | 久久夜色精品国产亚洲 | 无码人妻一区二区三区免费| 国产精品亚洲片夜色在线| 最近中文字幕免费mv视频8| 亚洲а∨精品天堂在线| 亚洲成aⅴ人片久青草影院| a级毛片免费高清视频| 国产亚洲精品xxx| 日本免费大黄在线观看| 亚洲精品一卡2卡3卡三卡四卡| 欧亚精品一区三区免费| 直接进入免费看黄的网站| 亚洲香蕉网久久综合影视| 久久99精品国产免费观看| 久久精品国产亚洲AV久| 国产男女性潮高清免费网站 | 美女在线视频观看影院免费天天看| 亚洲网址在线观看你懂的| 无码国产精品一区二区免费I6| 国产精品手机在线亚洲| 亚洲国产成人久久综合一| 免费看香港一级毛片| a级黄色毛片免费播放视频| 亚洲六月丁香婷婷综合| 亚洲精品国产综合久久一线|