[深入的思考] 為什么要采用java這個(gè)平臺(tái)?


          從開發(fā)項(xiàng)目的類別角度看java平臺(tái)

          基于B/S結(jié)構(gòu)的系統(tǒng),在這個(gè)方向上的競(jìng)爭(zhēng)是激烈的,有專注于此的LAMP(Linux + Apache + Mysql + Php);也有剛剛興起的Rails(Ruby Frameworks)甚至是號(hào)稱快速開發(fā)的ASP.NET;當(dāng)然了java在這個(gè)領(lǐng)域里的MVC框架數(shù)都數(shù)不完,比如Struts . Webwork等,然而即便是如此,選擇java作為開發(fā)的理由也是不充分的,因?yàn)樵谶@個(gè)梯隊(duì)里java頂多排名最后。

          基于C/S結(jié)構(gòu)的系統(tǒng),在這個(gè)方面java顯然沒(méi)有考慮周到,面對(duì)VB 、DELPHI、vc這些個(gè)如狼似虎的快速開發(fā)IDE,JAVA實(shí)在是顯得異常的淡薄,即使你找到了一個(gè)可以匹敵這些個(gè)ide的工具,面對(duì)第三方的組件又會(huì)成為一大障礙,所以java在這個(gè)方面又一次的輸了。


          從java所強(qiáng)調(diào)的特性角度看java平臺(tái)

          java的重點(diǎn)是業(yè)務(wù)邏輯!(我以前也是如此堅(jiān)信不移)可是誰(shuí)有能夠說(shuō)別的語(yǔ)言不注重業(yè)務(wù)邏輯呢,業(yè)務(wù)邏輯只是一個(gè)抽象的概念,java只是依靠ejb提出了業(yè)務(wù)組件而已,其他的語(yǔ)言在實(shí)現(xiàn)業(yè)務(wù)邏輯的時(shí)候也可以包裝成POJO的形式,看來(lái)這個(gè)觀點(diǎn)也是失敗的。

          java強(qiáng)調(diào)的是跨平臺(tái)的優(yōu)勢(shì)!這可以理解為初級(jí)的、商業(yè)的、忽悠人的詞匯,面對(duì)眾多動(dòng)態(tài)語(yǔ)言如Python,在若干平臺(tái)上的表現(xiàn),java又如何來(lái)強(qiáng)調(diào)自己這方面的優(yōu)勢(shì)呢?失敗

          java支持分布式應(yīng)用的項(xiàng)目!可笑的言論,分布式根本不是值得炫耀的資本,在java之前的c/s項(xiàng)目中何嘗不是分布式的應(yīng)用呢?失敗


          既然沒(méi)有了這些個(gè)優(yōu)勢(shì),我們看看java到底還剩下些什么?對(duì)了其實(shí)就是應(yīng)用服務(wù)器!然而看過(guò)J2EE WITHOUT EJB的讀者肯定知道Spring所希望達(dá)到的目的,也就是脫離應(yīng)用服務(wù)器概念上的J2EE體系實(shí)現(xiàn),既然在作者的眼里APPLICATION SERVER只不過(guò)是一個(gè)忽悠人的詞匯,那么任何項(xiàng)目都選擇java作為開發(fā)的依據(jù)顯然就是自找苦吃,

          那么什么情況下改選擇java作為開發(fā)的平臺(tái)呢?
          <1> 如果你真的遇到了大型的系統(tǒng)開發(fā)任務(wù),恭喜你,你終于可以看到分布式對(duì)象、集群的優(yōu)勢(shì)了。
          <2> 客戶是一個(gè)java的忠實(shí)fans或者是sun、ibm的金牌合作伙伴之類的,選擇java是不得已的,但記住并不能證明java是最好的實(shí)現(xiàn)方式
          <3> 如果你只想關(guān)心業(yè)務(wù)邏輯的實(shí)現(xiàn),對(duì)于事務(wù)、緩存、查找等服務(wù)的實(shí)現(xiàn)沒(méi)有興趣的話,倒是不妨考慮采用ejb的形式,當(dāng)然前提是你不愿意在尋找合適的替代品的情況下。
          <4> 如果項(xiàng)目迫切的尋找某種框架的支持,選擇java就是對(duì)的,你有眾多優(yōu)秀的、免費(fèi)的、可擴(kuò)展的、天才的框架可以選擇,更多的時(shí)候你是出于尷尬的境地,因?yàn)槿魏我粋€(gè)都讓你心動(dòng)、而這樣的選擇往往是最痛苦、和快樂(lè)的。


          正確的選擇
          <1>
          條件: 如果項(xiàng)目?jī)H僅只是一個(gè)小型的網(wǎng)站系統(tǒng)
          選擇: LAMP、Rails

          <2>
          條件: 項(xiàng)目規(guī)模中等
          并且項(xiàng)目的時(shí)間比較緊,
          項(xiàng)目可以架構(gòu)在windows的系統(tǒng)之上,
          選擇: .Net? / Delphi

          <3>
          條件: 大型的系統(tǒng),有支持分布式對(duì)象、集群的要求;或者SUN / IBM的金牌合作伙伴 ; 想要尋找某種優(yōu)秀的框架來(lái)解決問(wèn)題
          選擇: java是不二的選擇,可是我想問(wèn)一下,在現(xiàn)實(shí)中你能遇到這樣的項(xiàng)目嗎?

          所以,從實(shí)際的角度出發(fā),我們面對(duì)的99%可能都是一些符合條件1,2的系統(tǒng),而選擇java實(shí)在是得不償失的。最后以一段Code Complete中的話來(lái)作為結(jié)束語(yǔ)

          每個(gè)程序員都有很多的工具,但并不存在任何一個(gè)能夠適用于所有工作的工具,因地制宜的選擇正確工具是成為能有效編程的程序員的關(guān)鍵。

          posted @ 2006-03-29 13:49 killvin| 編輯 收藏

          ?

          作者簡(jiǎn)介
          XincChen是Xtremework公司創(chuàng)始人.a自從.NET推出以來(lái),1他已使用.NET幫助很多行業(yè)的用戶開發(fā)了體現(xiàn)其商業(yè)理念的軟件產(chǎn)品.aXincChen是.NET和EAI方面的專家,1他與Microsoft和Accenture等多家技術(shù)領(lǐng)先的公司合作,1為它們的客戶提供了優(yōu)秀的解決方案.a在工作之余,1他喜歡讀書.c寫書.c以及靜靜地休息.aApress出版社的另一本書——《BizTalkc2002cDesigncandcImplementation》——也是出自他的筆下.aXincChen擁有哥倫比亞大學(xué)的統(tǒng)計(jì)學(xué)文科碩士學(xué)位,1現(xiàn)居國(guó)內(nèi),1正在籌建公司在北京的研發(fā)中心.a可通過(guò)xchen@Xtremework.com和作者取得聯(lián)系.

          個(gè)人評(píng)論

          這本書本來(lái)購(gòu)買時(shí)的期望值非常的高,想必是一本細(xì)數(shù).NET框架類的圖書,結(jié)果卻大失所望,而這本書也就因?yàn)槠浼夹g(shù)上的薄弱而消弱了其價(jià)值的表現(xiàn)力,不過(guò)作為一本.NET入門級(jí)的圖書還是比較的合適,但在CSDN上竟然有四顆半的星的待遇實(shí)在不敢恭維。

          而且作者的代碼顯然非常的粗造,竟然連起碼的業(yè)務(wù)級(jí)數(shù)據(jù)校驗(yàn)都沒(méi)有,在一些功能的分解上也是抹漿糊,可以想象作者并沒(méi)有深入的思考而僅僅是去實(shí)現(xiàn)功能而已,猜想這樣的框架很可能是作者對(duì)于以前工作的簡(jiǎn)單抽象而已。

          整體上本書除了第一章應(yīng)用框架介紹 、 第二章應(yīng)用框架解析比較的出彩,尤其是創(chuàng)造性的提出了業(yè)務(wù)假設(shè)(Business assumption)的概念還比較的有深度,其他的章節(jié)只是對(duì)于其SAF框架的介紹,但在技術(shù)實(shí)現(xiàn)上只是對(duì)于.NET的若干相關(guān)服務(wù)的簡(jiǎn)單包裝而已,對(duì)于已經(jīng)在JAVA世界里的人來(lái)說(shuō),SAF框架其實(shí)就是Spring框架在.NET世界的簡(jiǎn)單實(shí)現(xiàn)版本,但相對(duì)于Spring的技術(shù)實(shí)力,作者還需要努力才行,不過(guò)作者顯然是.NET方面的高手,對(duì)于.NET世界提供的雜亂無(wú)章的服務(wù)特性以及服務(wù)的原理非常的清楚,這也難怪在這樣的平臺(tái)上再去"多此一舉"的開發(fā)另外的框架,無(wú)論從技術(shù)上還是推廣上都非常的難!不過(guò)領(lǐng)略一下..NET的秀發(fā)也是多少有所收獲的 :)

          再次強(qiáng)調(diào)這本書僅僅只能夠算作.NET方面的初級(jí)讀物,個(gè)人評(píng)星3.5 ,請(qǐng)朋友們謹(jǐn)慎購(gòu)買。

          posted @ 2006-03-24 14:22 killvin| 編輯 收藏

          wfc是構(gòu)建在B/S結(jié)構(gòu)上的流程定義工具

          具備以下的功能
          1> 實(shí)現(xiàn)了B/S結(jié)構(gòu)上的工作流定義工具(沒(méi)有看到同類型的產(chǎn)品)。
          2> 流程定義格式與具體的工作流格式相分離,并可以在此基礎(chǔ)上實(shí)現(xiàn)其他的流程定義工具產(chǎn)品。
          3> 采用了Buffalo(XML-RPC的javascript實(shí)現(xiàn))實(shí)現(xiàn)與后端Servlet的綁定。
          4> 可以對(duì)具體的節(jié)點(diǎn)進(jìn)行屬性的配置(配置后的數(shù)據(jù)會(huì)被綁定為java的List自動(dòng)傳遞到后端)。

          目前還需要改進(jìn)的
          1> 修改目前工作流的圖標(biāo)(需要分支、狀態(tài)、合并這樣專業(yè)的圖標(biāo))
          2> 解決瀏覽器的刷新問(wèn)題。
          3> 增加線段的表現(xiàn)形式選項(xiàng)
          4> 增加曲線的表現(xiàn)形式,尤其是在多線段的情況下要自動(dòng)調(diào)整為曲線的形式。


          目前的WFC已經(jīng)被Michael Chen(buffalo的作者)收錄在其網(wǎng)站上!地址如下
          http://demo.amowa.net/wfc

          對(duì)于buffalo的關(guān)注早在作者剛發(fā)布的時(shí)候就已經(jīng)開始了,起初不太了解buffalo的作用,然而在具體的工作中尋找基于XML-RPC協(xié)議的產(chǎn)品時(shí)突然明白了它的價(jià)值,不過(guò)說(shuō)簡(jiǎn)單一點(diǎn)buffalo是實(shí)現(xiàn)了基于javascript的對(duì)象的序列化以及反序列化工作。

          posted @ 2006-03-21 17:58 killvin| 編輯 收藏

          通用類圖書

          卓越獎(jiǎng): Prefactoring by Ken Pugh (O'Reilly)

          生產(chǎn)力獎(jiǎng):
          Innovation Happens Elsewhere: Open Source as Business Strategy by Ron Goldman, Richard P. Gabriel (Morgan Kaufmann)
          Producing Open Source Software: How to Run a Successful Free Software Project by Karl Fogel (O'Reilly)
          The Art of Project Management by Scott Berkun (O'Reilly)

          技術(shù)類圖書

          卓越獎(jiǎng):Agile Web Development with Rails by Dave Thomas, David Hansson, Leon Breedt and Mike Clark (Pragmatic Bookshelf)

          生產(chǎn)力獎(jiǎng):
          Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries by Krzysztof Cwalina and Brad Abrams (Addison-Wesley)
          Practical Common Lisp by Peter Seibel (Apress)
          Why Programs Fail: A Guide to Systematic Debugging by Andreas Zeller (Morgan Kaufmann)

          企業(yè)項(xiàng)目管理

          卓越獎(jiǎng): WelcomRisk 2.6 (Welcom)

          生產(chǎn)力獎(jiǎng):
          Corticon Business Rules Management 4.0 (Corticon)
          JBoss 2 Portal (JBoss)
          Visual Studio Team System 2005 (Microsoft)


          數(shù)據(jù)庫(kù)引擎和數(shù)據(jù)工具

          卓越獎(jiǎng): Microsoft SQL Server 2005 (Microsoft)

          生產(chǎn)力獎(jiǎng):
          Berkeley DB 4.4 (Sleepycat Software)
          Google Maps API 2005 (Google)
          MySQL 5.0 (MySQL)

          缺陷跟蹤,變更和配置管理

          卓越獎(jiǎng): Perforce SCM 2005 (Perforce)

          生產(chǎn)力獎(jiǎng):
          FogBugz 4.0 (Fog Creek)
          Guiffy SureMerge 7.0 (Guiffy Software)
          JIRA 3.4 (Atlassian Software)

          設(shè)計(jì)和建模工具

          卓越獎(jiǎng):Lattix LDM 2.0 (Lattix)

          生產(chǎn)力獎(jiǎng):
          Borland Together 2006 for Eclipse (Borland)
          Enterprise Architect 6.0 (Sparx Systems)
          MindManager Pro 6.0 (Mindjet)

          開發(fā)環(huán)境

          卓越獎(jiǎng): Visual Studio Team System 2005 (Microsoft)

          生產(chǎn)力獎(jiǎng):
          Eclipse SDK 3.1 (Eclipse.org)
          IntelliJ IDEA 5.0 (JetBrains)
          Komodo 3.5 (ActiveState)

          類庫(kù)、框架和組建

          卓越獎(jiǎng): .NET Framework 2.0 (Microsoft)

          生產(chǎn)力獎(jiǎng):
          Dundas Chart for .NET 5.0 (Dundas Software)
          Qt 4.0 (Trolltech)
          Spring Framework 1.2.6 (SpringFramework.org)

          移動(dòng)開發(fā)工具

          卓越獎(jiǎng): Crossfire 5.6 (AppForge)

          生產(chǎn)力獎(jiǎng):
          Carbide.c++ Express (Nokia)
          Flash Lite 2.0 (Adobe)
          NetBeans IDE 4.1 (Sun Microsystems)

          項(xiàng)目質(zhì)量管理

          卓越獎(jiǎng): Rally 5.6 (Rally Software Development)

          生產(chǎn)力獎(jiǎng):
          CollabNet Enterprise Edition with Project Dashboard/Task Management 2005 (CollabNet)
          QACenter Enterprise Edition 5.1 (Compuware)
          TargetProcess Suite 1.4 (TargetProcess)

          安全工具

          卓越獎(jiǎng): Elemental Compliance System 1.4 (Elemental)

          生產(chǎn)力獎(jiǎng):
          CodeAssure 2.0 (Secure Software)
          DevPartner SecurityChecker 1.0 (Compuware)
          Fortify Security Tester 1.0 (Fortify)

          測(cè)試工具

          卓越獎(jiǎng):VMTN Subscription 2005 (VMware)

          生產(chǎn)力獎(jiǎng):
          Agitator 3.0 (Agitar Software)
          AQtime 4.7 (AutomatedQA)
          Clover 1.3 (Cenqua)

          實(shí)用程序

          卓越獎(jiǎng):Camtasia Studio 3.0 (TechSmith)

          生產(chǎn)力獎(jiǎng):
          DevPartner Studio 8 (Compuware)
          Fog Creek Copilot 1.2 (Fog Creek Software)
          ReSharper 1.5 (JetBrains)

          Web開發(fā)工具

          卓越獎(jiǎng): Rails 1.0 (rubyonrails.org)

          生產(chǎn)力獎(jiǎng):
          JBoss Application Server 4x (JBoss)
          Macromedia Studio 8 2005 (Adobe)
          Zend Studio - Enterprise Edition 5.0 (Zend)

          名人堂產(chǎn)品獲獎(jiǎng)?wù)?

          ?Visual Studio Professional Edition (Microsoft)

          感慨
          ??? MS在這次的JOLT中屢獲殊榮,深思。。。

          posted @ 2006-03-19 09:32 killvin| 編輯 收藏

          很久都不罵人了,可是一不留心又看到了他寫了惡心文章,實(shí)在是讓人憤慨!這位板橋里人的"大名"是從透明的blog上知道的,首先就是感覺這個(gè)人的腦子有點(diǎn)問(wèn)題!不去評(píng)論他發(fā)布的那個(gè)所謂的框架,就看看他寫的一些文章就足以知道這個(gè)人腦袋非常的混亂,在這樣混亂的情況下寫出來(lái)的文章也就可想而知了,最近這位所謂的"大俠"又開始害人了

          你還在用if else嗎?- http://www.jdon.com/artichect/ifelse.htm


          面向過(guò)程設(shè)計(jì)和面向?qū)ο笤O(shè)計(jì)的主要區(qū)別是:是否在業(yè)務(wù)邏輯層使用冗長(zhǎng)的if else判斷。如果你還在大量使用if else,當(dāng)然,界面表現(xiàn)層除外,即使你使用Java/C#這樣完全面向?qū)ο蟮恼Z(yǔ)言,也只能說(shuō)明你的思維停留在傳統(tǒng)的面向過(guò)程語(yǔ)言上。

          -我很納悶了作者怎么可以從是否使用if else來(lái)判斷一個(gè)設(shè)計(jì)是否符合OO特性呢?我們看到的if else屬于語(yǔ)言這個(gè)層次的東西,而if else僅僅是完成邏輯判斷的語(yǔ)句;如果說(shuō)作者的這個(gè)觀點(diǎn)成立的話,java、c#的語(yǔ)言發(fā)明者應(yīng)該早就明白或者預(yù)測(cè)到if else 的"不OO"的特性,也會(huì)考慮到在語(yǔ)言層面刪除這樣的邏輯判斷語(yǔ)句,但事實(shí)呢?發(fā)明者非但沒(méi)有刪除相反其他語(yǔ)言的發(fā)明者也一起發(fā)明了if else語(yǔ)句?!難道是大師們錯(cuò)了?

          還是以大家熟悉的論壇帖子為例子,如ForumMessage是一個(gè)模型,但是實(shí)際中帖子分兩種性質(zhì):主題貼(第一個(gè)根貼)和回帖(回以前帖子的帖子),這里有一個(gè)樸素的解決方案:
          建立一個(gè)ForumMessage,然后在ForumMessage加入isTopic這樣判斷語(yǔ)句,注意,你這里一個(gè)簡(jiǎn)單屬性的判斷引入,可能導(dǎo)致你的程序其他地方到處存在if else 的判斷。

            如果我們改用另外一種分析實(shí)現(xiàn)思路,以對(duì)象化概念看待,實(shí)際中有主題貼和回帖,就是兩種對(duì)象,但是這兩種對(duì)象大部分是一致的,因此,我將ForumMessage設(shè)為表達(dá)主題貼;然后創(chuàng)建一個(gè)繼承ForumMessage的子類ForumMessageReply作為回帖,這樣,我在程序地方,如Service中,我已經(jīng)確定這個(gè)Model是回帖了,我就直接下溯為ForumMessageReply即可,這個(gè)有點(diǎn)類似向Collection放入對(duì)象和取出時(shí)的強(qiáng)制類型轉(zhuǎn)換。通過(guò)這個(gè)手段我消滅了以后程序中if else的判斷語(yǔ)句出現(xiàn)可能。

          -作者在這里似乎列舉了一個(gè)例子,可是對(duì)于帖子和回帖這樣簡(jiǎn)單的問(wèn)題,只要遵守OO的設(shè)計(jì)師都會(huì)抽象出一個(gè)帖子的父類,然而這又能說(shuō)明什么呢?在具體的業(yè)務(wù)邏輯中難道你不判斷傳遞過(guò)來(lái)的對(duì)象的類別?(現(xiàn)在主題貼與回帖的處理方法是不同的),同樣你無(wú)法避免在具體的編碼中使用if else的可能?!


          最后總結(jié):將if else用在小地方還可以,如簡(jiǎn)單的數(shù)值判斷;但是如果按照你的傳統(tǒng)習(xí)慣思維,在實(shí)現(xiàn)業(yè)務(wù)功能時(shí)也使用if else,那么說(shuō)明你的思維可能需要重塑,你的編程經(jīng)驗(yàn)越豐富,傳統(tǒng)過(guò)程思維模式就容易根深蒂固,想靠自己改變很困難;建議接受專業(yè)頭腦風(fēng)暴培訓(xùn)。

           用一句話總結(jié):如果你做了不少系統(tǒng),很久沒(méi)有使用if else了,那么說(shuō)明你可能真正進(jìn)入OO設(shè)計(jì)的境地了。(這是本人自己發(fā)明的實(shí)戰(zhàn)性的衡量考核標(biāo)準(zhǔn))。

          -顯然作者并不是去討論if else的語(yǔ)言問(wèn)題,而是為自己的"洗腦培訓(xùn)"打廣告!并講這樣的問(wèn)題上升到設(shè)計(jì)模式、禪的境界,可謂是煞費(fèi)苦心呀,沒(méi)有人說(shuō)設(shè)計(jì)模式不好也沒(méi)有人懷疑禪的境界的高深,但不是作者這樣的人靠讀一兩篇文章或者發(fā)布個(gè)所謂的"毫無(wú)實(shí)際意義"的框架就可以領(lǐng)悟到的,還是那句話:長(zhǎng)得丑不要緊,不要出來(lái)嚇人!不過(guò)我還要補(bǔ)充一句就是,不懂不要緊,不要亂說(shuō)免得害人(因?yàn)槲覀兌贾罎妺D罵街的道理,雖然沒(méi)文化但確實(shí)能夠帶來(lái)眼球效應(yīng))。

          posted @ 2006-03-10 11:49 killvin| 編輯 收藏

          該死,鼠標(biāo)癱瘓了!
          本來(lái)以為是Maxthon的問(wèn)題(在鼠標(biāo)單擊的時(shí)候會(huì)關(guān)閉一些窗口,并且是隨機(jī)的?!)還就這樣的問(wèn)題給作者寫了一封信?汗。。。經(jīng)過(guò)仔細(xì)的尋找原因,原來(lái)是自己的鼠標(biāo)的問(wèn)題(這個(gè)鼠標(biāo)跟了我快7年了,Logitech最好的滾軸鼠標(biāo),要300多塊大洋)有點(diǎn)舍不得,又沒(méi)有辦法,該下崗了,一同下崗的也許還有我的鍵盤(TCL的手感級(jí)差!:( )

          不過(guò)為了找原因我倒是廢了一番周折,下載和試用了N多的瀏覽器,也看了很多網(wǎng)上的評(píng)論對(duì)比文章,現(xiàn)在主流的瀏覽器主要就是Opera , Firefox, Maxthon , GreenBrowser , MyIE , TheWorld 等,然而在資源的利用率上這些個(gè)產(chǎn)品都非常的讓人失望,難道就沒(méi)有一款適合于程序員的胃口的瀏覽器?!

          可喜的是偶發(fā)現(xiàn)了GOSURF這款瀏覽器,在眾多的瀏覽器中它的內(nèi)存占用率是最低的,而且它的作者似乎在這方面也是煞費(fèi)苦心,"一味"的強(qiáng)調(diào)速度,甚至對(duì)于鼠標(biāo)手這個(gè)及其流行的功能的加入也是非常的謹(jǐn)慎,可以看出作者是個(gè)很有個(gè)性的程序員,值得期待!

          如果你和我一樣對(duì)資源的利用率近乎苛刻,可以考慮這樣的一款產(chǎn)品 http://gosurfbrowser.com/?ln=cn

          posted @ 2006-03-07 17:42 killvin| 編輯 收藏

          不錯(cuò)的文章
          http://www-128.ibm.com/developerworks/cn/java/j-junit4.html

          JUnit 是 Java? 語(yǔ)言事實(shí)上的 標(biāo)準(zhǔn)單元測(cè)試庫(kù)。JUnit 4 是該庫(kù)三年以來(lái)最具里程碑意義的一次發(fā)布。它的新特性主要是通過(guò)采用 Java 5 中的標(biāo)記(annotation)而不是利用子類、反射或命名機(jī)制來(lái)識(shí)別測(cè)試,從而簡(jiǎn)化測(cè)試。在本文中,執(zhí)著的代碼測(cè)試人員 Elliotte Harold 以 JUnit 4 為例,詳細(xì)介紹了如何在自己的工作中使用這個(gè)新框架。注意,本文假設(shè)讀者具有 JUnit 的使用經(jīng)驗(yàn)。

          JUnit 由 Kent Beck 和 Erich Gamma 開發(fā),幾乎毫無(wú)疑問(wèn)是迄今所開發(fā)的最重要的第三方 Java 庫(kù)。正如 Martin Fowler 所說(shuō),“在軟件開發(fā)領(lǐng)域,從來(lái)就沒(méi)有如此少的代碼起到了如此重要的作用”。JUnit 引導(dǎo)并促進(jìn)了測(cè)試的盛行。由于 JUnit,Java 代碼變得更健壯,更可靠,bug 也比以前更少。JUnit(它本身的靈感來(lái)自 Smalltalk 的 SUnit)衍生了許多 xUnit 工具,將單元測(cè)試的優(yōu)勢(shì)應(yīng)用于各種語(yǔ)言。nUnit (.NET)、pyUnit (Python)、CppUnit (C++)、dUnit (Delphi) 以及其他工具,影響了各種平臺(tái)和語(yǔ)言上的程序員的測(cè)試工作。

          然而,JUnit 僅僅是一個(gè)工具而已。真正的優(yōu)勢(shì)來(lái)自于 JUnit 所采用的思想和技術(shù),而不是框架本身。單元測(cè)試、測(cè)試先行的編程和測(cè)試驅(qū)動(dòng)的開發(fā)并非都要在 JUnit 中實(shí)現(xiàn),任何比較 GUI 的編程都必須用 Swing 來(lái)完成。JUnit 本身的最后一次更新差不多是三年以前了。盡管它被證明比大多數(shù)框架更健壯、更持久,但是也發(fā)現(xiàn)了 bug;而更重要的是,Java 不斷在發(fā)展。Java 語(yǔ)言現(xiàn)在支持泛型、枚舉、可變長(zhǎng)度參數(shù)列表和注釋,這些特性為可重用的框架設(shè)計(jì)帶來(lái)了新的可能。

          JUnit 的停滯不前并沒(méi)有被那些想要廢棄它的程序員所打敗。挑戰(zhàn)者包括 Bill Venners 的 Artima SuiteRunner 以及 Cedric Beust 的 TestNG 等。這些庫(kù)有一些可圈可點(diǎn)的特性,但是都沒(méi)有達(dá)到 JUnit 的知名度和市場(chǎng)占有份額。它們都沒(méi)有在諸如 Ant、Maven 或 Eclipse 之類的產(chǎn)品中具有廣泛的開箱即用支持。所以 Beck 和 Gamma 著手開發(fā)了一個(gè)新版本的 JUnit,它利用 Java 5 的新特性(尤其是注釋)的優(yōu)勢(shì),使得單元測(cè)試比起用最初的 JUnit 來(lái)說(shuō)更加簡(jiǎn)單。用 Beck 的話來(lái)說(shuō),“JUnit 4 的主題是通過(guò)進(jìn)一步簡(jiǎn)化 JUnit,鼓勵(lì)更多的開發(fā)人員編寫更多的測(cè)試。”JUnit 4 盡管保持了與現(xiàn)有 JUnit 3.8 測(cè)試套件的向后兼容,但是它仍然承諾是自 JUnit 1.0 以來(lái) Java 單元測(cè)試方面最重大的改進(jìn)。

          注意:該框架的改進(jìn)是相當(dāng)前沿的。盡管 JUnit 4 的大輪廓很清晰,但是其細(xì)節(jié)仍然可以改變。這意味著本文是對(duì) JUnit 4 搶先看,而不是它的最終效果。

          posted @ 2006-03-05 13:10 killvin| 編輯 收藏

          http://blog.raylife.com/?p=336

          在這個(gè)暖暖的午后享受著陽(yáng)光的溫暖的同時(shí),聽著CUSCO 的專輯實(shí)在是一種享受,我喜歡那種寧?kù)o的音樂(lè),因?yàn)樗鼛Ыo你的除了純凈還是純凈。。。。

          不想被任何的人打擾,城市的喧鬧讓自己的思想變得復(fù)雜,而唯獨(dú)音樂(lè)才能夠真正的喚醒你心靈深處的東西,

          posted @ 2006-03-04 13:23 killvin| 編輯 收藏

          目前在找工作階段,參加了一些公司的面試,對(duì)于目前的一些公司的面試官我真的要說(shuō)上兩句,比如我去一家"非常著名"(至少在程序界是比較有名氣的)的公司去面試,在回答一些無(wú)關(guān)痛癢的自我介紹后,技術(shù)總監(jiān)突然問(wèn)我"Struts是如何解決多配置文件的問(wèn)題的?",當(dāng)時(shí)就把我給問(wèn)住了,主要是自己已經(jīng)很久都沒(méi)有做項(xiàng)目了,對(duì)于Struts也僅僅停留在使用這樣的基礎(chǔ)上,況且當(dāng)時(shí)接觸到的Struts是不支持多配置文件的,所以我只好亂說(shuō)“將配置文件放在classpath就行了”,顯然這樣的答案是技術(shù)總監(jiān)不愿意聽到的,(想必很多的程序員也會(huì)這樣認(rèn)為),可是事情真的就是這樣簡(jiǎn)單嗎?

          標(biāo)準(zhǔn)答案是:在web.xml中配置ActionServlet的config參數(shù),在經(jīng)過(guò)大腦短暫的思考后我斷定我的回答并沒(méi)有錯(cuò)!

          誰(shuí)說(shuō)一定要配置這樣的參數(shù)?那只是ActionServlet的"一廂情愿",如果有一天Struts不高興了,將尋找配置文件的策略更改成:從classpath尋找,你認(rèn)為我說(shuō)的答案還是錯(cuò)誤的嗎?

          所以我想說(shuō)這樣的面試問(wèn)題是弱智的,一個(gè)人不可能知道所有的一切,對(duì)于現(xiàn)在這個(gè)社會(huì)如此眾多的框架產(chǎn)品你怎么可能光靠某個(gè)問(wèn)題就斷定一個(gè)人的能力呢?

          其實(shí)如果他可以這樣問(wèn):你認(rèn)為配置文件的讀取策略可以有多少種?或者如果是你設(shè)計(jì)Struts你會(huì)如何解決多配置文件的問(wèn)題?這樣啟發(fā)式的詢問(wèn)更會(huì)激起面試者的興趣,難道這些個(gè)所謂的技術(shù)總監(jiān)不該反思一下?

          當(dāng)然,不是僅僅一個(gè)這樣的事件引起了自己點(diǎn)憤怒,而是很多很多的所謂的技術(shù)專家的弱智問(wèn)題,不知道磨滅了多少人的熱情!如果你也是遇到了這樣的尷尬,索性問(wèn)他一個(gè)自己非常另類的問(wèn)題-比如"內(nèi)部類如何訪問(wèn)外部類的對(duì)象?"

          該死,請(qǐng)不要再問(wèn)我弱智的問(wèn)題了

          posted @ 2006-03-03 17:53 killvin| 編輯 收藏

          在OSWorkflow中最讓人惱火的就是它的接口定義!我會(huì)就這些接口的混亂展開一系列的分析,今天先說(shuō)說(shuō)Configuration接口

          偶繼承了它的Configuration接口

          import com.company.engine.workflow.store.IWorkFlowStore;
          import com.opensymphony.workflow.StoreException;
          import com.opensymphony.workflow.config.Configuration;
          import com.opensymphony.workflow.spi.WorkflowStore;

          public interface IConfiguration extends Configuration
          {
           /**
            * @deprecated getIWorkflowStore()
            */
              WorkflowStore getWorkflowStore() throws StoreException;
             
              /**
               * return WorkFlowStore which implements the interface of IWorkFlowStore
               * @return
               * @throws StoreException
               */
              IWorkFlowStore getIWorkflowStore() throws StoreException;
             
          }

          你可能奇怪我為何要繼承它的接口(肯定是Bad smell),原因如下,

          IWorkFlowStore 接口定義

          import com.opensymphony.workflow.StoreException;
          import com.opensymphony.workflow.spi.Step;
          import com.opensymphony.workflow.spi.WorkflowEntry;
          import com.opensymphony.workflow.spi.WorkflowStore;

          public interface IWorkFlowStore extends WorkflowStore
          {
           
           public Step createCurrentStep(WorkflowEntry _entry , Step _step) throws StoreException;

          }

          WorkflowStore接口定義

              /**
               * Persists a step with the given parameters.
               *
               * @param entryId The workflow instance id.
               * @param stepId the ID of the workflow step associated with this new
               *               Step (not to be confused with the step primary key)
               * @param owner the owner of the step
               * @param startDate the start date of the step
               * @param status the status of the step
               * @param previousIds the previous step IDs
               * @return a representation of the workflow step persisted
               */
              public Step createCurrentStep(long entryId, int stepId, String owner, Date startDate, Date dueDate, String status, long[] previousIds) throws StoreException;

          看到了吧?

          其實(shí)我只是希望在createCurrentStep時(shí)按照OO的方法執(zhí)行,而不是傳遞那些"Bad Smell"的參數(shù),而OSWorkflow中的WorkflowStore是需要Configuration來(lái)獲取的,此時(shí)為了增加一個(gè)看似合理的方法,需要分別繼承Configuration與WorkflowStore;這還沒(méi)有完,你需要實(shí)現(xiàn)一個(gè)Configuration實(shí)現(xiàn)!!

          import com.company.engine.workflow.store.IWorkFlowStore;
          import com.opensymphony.workflow.StoreException;
          import com.opensymphony.workflow.config.DefaultConfiguration;
          import com.opensymphony.workflow.spi.WorkflowStore;

          public class DefaultIConfiguration extends DefaultConfiguration implements IConfiguration
          {
           
              public static DefaultIConfiguration INSTANCE = new DefaultIConfiguration();
              private transient IWorkFlowStore store = null;

           /**
            * @deprecated getIWorkflowStore()
            */
           public WorkflowStore getWorkflowStore() throws StoreException
           {
            return null;
           }

           public IWorkFlowStore getIWorkflowStore() throws StoreException
           {
            if (store == null)
            {
             String clazz = getPersistence();

             try
             {
              store = (IWorkFlowStore) Class.forName(clazz).newInstance();
             }
             catch (Exception ex)
             {
              throw new StoreException("Error creating store", ex);
             }

             store.init(getPersistenceArgs());
            }

            return store;
           }

          }

          總結(jié)

          1。OSWorkflow與WorkflowStore接口的關(guān)系比較的微妙,它需要借助于Configuration接口的實(shí)現(xiàn)來(lái)獲取到實(shí)際的WorkflowStore對(duì)象。

          2。由于這樣的一種微妙關(guān)系,對(duì)WorkflowStore接口的擴(kuò)展必將連帶著需要擴(kuò)展Configuration接口,而產(chǎn)生這樣的"果凍效應(yīng)"的罪魁禍?zhǔn)拙褪怯捎赪orkflowStore接口與Configuration接口耦合的太緊。

          3。OSWorkflow并沒(méi)有很好的遵守OO的設(shè)計(jì)規(guī)則,尤其在它的參數(shù)傳遞上,非常的差!

          posted @ 2006-03-02 21:04 killvin| 編輯 收藏

          僅列出標(biāo)題
          共5頁(yè): 上一頁(yè) 1 2 3 4 5 下一頁(yè) 
          主站蜘蛛池模板: 凉城县| 泸定县| 武宁县| 马公市| 化德县| 文登市| 武义县| 陆川县| 定结县| 昌图县| 含山县| 平舆县| 定日县| 板桥市| 彰武县| 尚义县| 汤原县| 南涧| 若尔盖县| 商南县| 鹤壁市| 开化县| 收藏| 达尔| 濮阳市| 天镇县| 黔西| 中山市| 伊川县| 永登县| 双鸭山市| 敦煌市| 巴彦淖尔市| 苍梧县| 浦东新区| 湖南省| 科尔| 富锦市| 宁波市| 益阳市| 德庆县|