Thinking in XiaoQiang
          世人皆有悲哀,只有你不明白
          posts - 56,comments - 150,trackbacks - 0
          打基礎(chǔ)

          級別: 初級

          Bruce Tate
          總裁, J2Life, LLC
          2005 年 5 月 30 日

          輕量級開發(fā)是一個很大的主題,開發(fā)人員經(jīng)常提到這個術(shù)語,但卻很難講明它的意思。本文是一系列講述輕量級開發(fā)的文章中的首篇,介紹了該技術(shù)背后的核心原則及原理。

          1990 年,我發(fā)現(xiàn)了白水漂流并深深愛上了它。我們哪怕是經(jīng)過最小的湍流,都會留一個人在湍流尾部,兩個人在岸邊用繩索拽著。我們認為這可以防止任何糟糕的事情發(fā)生。雖然看起來一切盡在掌握,只是有些不太實際。我們還學(xué)會了從船艙觀察普通的湍流,并設(shè)法互相協(xié)作。對于大多數(shù)危險的湍流,我們花費了更多的時間來保障安全,但是只有少數(shù)情況下,這些措施才起到重大的作用。

          在漂流過程中,使用一種起源于東南部湍急河流的輕量級策略,為我節(jié)省了時間,使我可以劃得更遠,玩得更開心,而無需過多考慮安全問題。在業(yè)務(wù)領(lǐng)域,輕量級開發(fā)讓您可以按時完工,積極響應(yīng)客戶,從而節(jié)省時間和金錢。

          在本系列的文章中,我關(guān)注于輕量級開發(fā)(曾經(jīng)有太多含義的術(shù)語)的基礎(chǔ)。本篇文章作為第一篇,為讀者打好基礎(chǔ),同時對輕量級開發(fā)做出定義。后面的文章由淺入深地講述從過程到原則最后到工具的知識。我也將在更高的級別上關(guān)注原理和架構(gòu)的實現(xiàn),并且提供具體實現(xiàn)的代碼。

          本系列面向沒有經(jīng)過太多輕量級開發(fā)的讀者。如果您已使用了兩年的 Spring 輕量級容器和敏捷過程,您可能會收獲更多。如果您在傳統(tǒng)的開發(fā)過程中使用 Enterprise JavaBeans?(EJB),但想要轉(zhuǎn)向輕量級開發(fā),那么本系列就是為您準(zhǔn)備的。

          我更多地是想在這場席卷整個 Java? 技術(shù)社區(qū)的潮流中,做一些自己的貢獻。輕量級 這個噱頭為諸如 Spring 和 Pico 這樣的容器增添了幾分優(yōu)雅。并且,一些源自輕量級過程的技術(shù),如自動化單元測試,現(xiàn)在也滲透到了很多開發(fā)工作室中。

          戳穿針對輕量級開發(fā)的謠言
          “輕量級開發(fā)”通常與一套開發(fā)方法、框架和設(shè)計原理一起使用。

          • 輕量級方法 包括敏捷過程,例如極限編程(XP)和 Scrum。它們強調(diào)開發(fā)中測試第一,積極調(diào)動客戶和重構(gòu)。
          • 輕量級框架 鼓勵人們使用簡單原始的 Java 對象(POJO)編程,而不是類似 EJB 的重量級面向組件模型。
          • 輕量級設(shè)計模式 使您可以在對象和集成服務(wù)之間進行松散耦合,而無需艱苦地編寫業(yè)務(wù)邏輯或領(lǐng)域模型。

          當(dāng)我們研究這些思想和技術(shù)時,您將會學(xué)到更多關(guān)于它們的知識。但是首先讓我們戳穿一些謠言。

          謠言:輕量級開發(fā)只是一種“玩具”技術(shù)。
          許多開發(fā)工具,如 Microsoft? Visual Basic 或 PHP,它們通常不能駕馭或管理大型企業(yè)項目,因此得到了“玩具”的稱號。像 Spring 和 Hebernate 這樣的輕量級技術(shù)就常常因此而黯淡。實際上,大多數(shù)輕量級技術(shù)用于了企業(yè)開發(fā),因為其他技術(shù)都使我們非常失望。Spring 框架就是作為代替 EJB 的一種輕量級技術(shù)。同樣,XP 方法吸收改進了企業(yè)中的錯誤設(shè)置。我在獲得 Jolt 大獎的 Better, Faster, Lighter Java 一書中,為大家講述了有關(guān)成功部署在我的客戶站點上的一些工具的信息,客戶有一些是財富 500 強中的公司。輕量級技術(shù)在企業(yè)領(lǐng)域內(nèi),正在蓬勃發(fā)展著。

          謠言:輕量級開發(fā)策略構(gòu)建的是“玩具”。
          也許您更傾向于相信輕量級開發(fā)只對構(gòu)建“玩具”應(yīng)用程序有益。而您的目標(biāo)是精確地滿足客戶的需求。讓我們首先明確一下:輕量級技術(shù)完全可以構(gòu)建這種規(guī)模的應(yīng)用程序。實際上,這種巨大的反差經(jīng)常發(fā)生,因為只有簡單、簡潔、無狀態(tài)的設(shè)計才能使基礎(chǔ)設(shè)施更好地工作。

          謠言:輕量級過程使您忽視規(guī)范。
          在輕量級開發(fā)中,您需要認真地規(guī)劃并與客戶磋商需求。您必須構(gòu)建嚴格的自動化單元測試,以優(yōu)化重構(gòu)。當(dāng)放棄變更時,仍可以保持程序完整。而且,測試用例失敗或變更引發(fā)錯誤時,自動化構(gòu)建會通知您。輕量級開發(fā)必須比其他技術(shù)更加注意規(guī)范,但這種規(guī)范源于不同方面。

          我認為這種開發(fā)風(fēng)格超越了單一的技術(shù)或過程。如果您想輕松一些,那么需要選擇使它易于工作的原則、過程和技術(shù)。

          原則
          該說的也說了,該做的也做了,您現(xiàn)在需要決定哪些需要重視,并據(jù)此制定決策。如果我覺得客戶被誤導(dǎo)或漠不關(guān)心,我通常會首先幫助他們建立核心原則。下面的列表是一個不錯的起點:

          • 爭取簡單性。這種觀念應(yīng)該滲入到您所有的工作中。您的過程應(yīng)該剛好生成足夠完成工作的工件。開發(fā)人員應(yīng)該盡量使用最簡單的方法解決問題。您的工具應(yīng)該使您構(gòu)建一個清晰、簡潔的解決方案。
          • 修補漏洞。許多開發(fā)方法可能不鼓勵在過程中進行重構(gòu)或變更,因為這些行為不直接用于產(chǎn)生客戶代碼。輕量級開發(fā)要求可以自由地修補太復(fù)雜或充斥 bug 的代碼。您需要為它做出預(yù)算。
          • 自動化單元測試。您應(yīng)該優(yōu)先編寫測試用例。您可能還沒有在測試第一的開發(fā)中成功過,但測試會間接給您帶來重構(gòu)代碼的便利。我以后會進一步講述:廣泛的單元測試改善您的客戶體驗,并提高代碼的設(shè)計水平,這是因為它強迫您解耦聯(lián)系過于緊密的代碼。
          • 使用短開發(fā)周期并積極調(diào)動客戶參與其中。許多頂級的軟件工作室通過剔除不必要的工件來簡化開發(fā)周期。如果您已經(jīng)順利得到客戶的參與,那么很多的功能規(guī)范會變得越來越?jīng)]必要??蛻魰軡M意這種交互,并感激您的短周期開發(fā),因為這穩(wěn)步提高了客戶的業(yè)務(wù)價值。

          這些原則并不能完全包含您的技術(shù)抉擇和開發(fā)過程,但它有利于您描述開發(fā)體驗。如果經(jīng)理也了解并遵循這些原則,開發(fā)人員就不至于做出無效技術(shù)選擇,或者開發(fā)一些不必要的工件。確立原則后,就該規(guī)劃一個有效過程了。

          過程
          緊湊、快速的開發(fā)過程通常從敏捷開發(fā)方法 當(dāng)中得到靈感。然而,這些方法并不針對每個人。如果您有一個大型團隊,并且沒有實際訪問客戶或合適的代理人,那么傳統(tǒng)方法更適合您一些。但多數(shù)項目都有小團隊 —— 不超過 12 個人,他們可以充分訪問客戶,以靈活使用這種方法。通常,敏捷開發(fā)包括下列原則:

          • 專注現(xiàn)場客戶和代碼,而不是其他設(shè)計技巧。您可以使用其他技巧,但只在它們對您確實有益的情況下。本過程不需要它。
          • 簡化您需要的文檔。為了需要,寧可使用電子表格中的一行來描述,也不使用令人困惑的用例圖。
          • 只做足以完成工作的設(shè)計工作。不要對設(shè)計或性能過分憂心忡忡,使自己陷入絕境。
          • 為了開發(fā),努力進行簡化并保證至少每天都集成您所構(gòu)建的程序,必要時進行重構(gòu)。
          • 自動化測試。

          即使您工作在傳統(tǒng)的機構(gòu),您也可以利用已裁減的開發(fā)過程。技巧是推廣原則 而不是方法。推廣極限編程管理器 —— 或其他冠以極限 的東西,這可能會很艱難。但推廣類似單元測試的原則通常更有意義。實際上,我的許多客戶使用這種技術(shù)同敏捷開發(fā)過程一起為保守的機構(gòu)服務(wù),但他們的老板絲毫不知道有什么發(fā)生了改變。

          用修辭手法描述一下這種技術(shù)。原則 是重拳出擊的輕量級思想。過程是重量級的,實現(xiàn)起來將會很困難。

          技術(shù)
          我已經(jīng)概述了大多數(shù)輕量級開發(fā)人員需要了解的設(shè)計原理,以及利用這些原理的重要開源技術(shù)。

          依賴注入
          最新一代容器稱為輕量級容器,它們使用一個共同設(shè)計原理:依賴注入。 對這個簡單思想來說,這是一個復(fù)雜的術(shù)語。依賴注入讓您將對象和它所依賴的東西交給第三方。然后第三方創(chuàng)建所有對象并將它們綁在一起。比方說,稱為 myDao 的數(shù)據(jù)訪問對象需要一個稱為 ds 的數(shù)據(jù)源。那么該容器會一同創(chuàng)建它們,并設(shè)置一個屬性:

          清單 1. 創(chuàng)建一個第三方匯編程序
          
          myDao = new Dao();
          ds = new DataSource();
          myDao.setDataSource(ds);
          

          當(dāng)然,不創(chuàng)建這種第三方匯編程序的話,您也可以使用框架來做其他附加的工作(如提供配置支持)。Spring 框架、Pico 和 HiveMind 就扮演了這個角色。其他像 JavaServer Faces(JSF) 框架也利用了依賴注入。

          面向?qū)ο缶幊?/SPAN>
          使用面向?qū)ο缶幊蹋ˋOP),您可以編寫通用的功能性模塊(稱為方面) —— 例如,日志、事務(wù)、安全或持久性。AOP 使您可以將這些方面聯(lián)系到 POJO,然后指定一個時間點(如方法開始時或產(chǎn)生異常時)和另一個需要聯(lián)系的方面。例如,您可能想要創(chuàng)建一個外觀事務(wù)對象。您可以在調(diào)用方法時將 TransactionBegin 方面關(guān)聯(lián)到外觀方法。然后在產(chǎn)生異常時將 RollBack 方面關(guān)聯(lián)到外觀的異常。最后,在方法結(jié)束時將 Commit 方面關(guān)聯(lián)到外觀的方法。您在配置中完成這些工作,而不是通過編寫代碼。依靠這種能力,您可以創(chuàng)建一個簡單的 POJO 事務(wù)、安全或遠程訪問。

          您現(xiàn)在已經(jīng)得到了關(guān)于 POJO 的聲明性事務(wù),這對企業(yè)應(yīng)用程序非常有用。使用這些工具,您可以完全放棄 EJB,或者最小化它的作用。而這正是輕量級組件所要做的。

          透明持久性
          持久性也是建立在較簡單的編程模型之上。透明持久性框架通過配置而不是編寫代碼,來使您為應(yīng)用程序添加持久性。因為大多數(shù)應(yīng)用程序是面向?qū)ο蟮模⑶以L問一個關(guān)系數(shù)據(jù)庫,所以一些專家斷言,我們最終將進入對象關(guān)系映射的時代。我目前發(fā)現(xiàn)的頂級持久性解決方案是 SolarMetric 的 Kodo JDO 和 Hibernate(參閱 參考資料)。在后面的文章中我將詳細比較這些解決方案。其他輕量級解決方案,例如 iBATIS 和 Active Record 設(shè)計模式,根本不會試圖進行對象關(guān)系映射。

          結(jié)束語
          在輕量級開發(fā)中,您基本上可以:

          • 合并過程、技術(shù)和原理。
          • 優(yōu)先選擇較簡單的技術(shù)。
          • 在一個穩(wěn)固、輕量級的基礎(chǔ)上,進行構(gòu)建。
          • 盡量爭取最可能的透明性。
          • 使用您可以利用的技術(shù),如依賴注入和 AOP。

          一定要明白,無論技術(shù)還是過程都不能完整定義輕量級開發(fā)。它是一個包羅萬象的概念。伴隨本系列的文章,您將看到對輕量級技術(shù)和原理的各種各樣的討論。我將首先關(guān)注開源框架,并著重講述輕量級容器。后面的文章,我會討論保守公司內(nèi)的輕量級方法實現(xiàn),甚至還有一些超越了 Java 技術(shù)的替代方案。我非常喜歡這個系列的文章,希望您也一樣。

          參考資料

          關(guān)于作者
          Bruce Tate 居住在德克薩斯州的首府奧斯汀,他是一位父親,同時也是山地車手和皮艇手。他是 3 本最暢銷 Java 書籍的作者,其中包括榮獲 Jolt 大獎的 Better, Faster, Lighter Java 一書,最近又出版了 Spring: A Developer's Notebook 一書。他在 IBM 工作了 13 年,現(xiàn)在是 J2Life、LLC 的創(chuàng)始人兼顧問。他潛心研究基于 Java 和 Ruby 的輕量級開發(fā)策略和架構(gòu)。
          posted on 2005-10-27 09:14 小強 閱讀(267) 評論(0)  編輯  收藏 所屬分類: J2EE
          主站蜘蛛池模板: 理塘县| 广德县| 本溪市| 侯马市| 安乡县| 秦皇岛市| 吐鲁番市| 青神县| 中西区| 荔波县| 翁牛特旗| 巴中市| 渭南市| 油尖旺区| 温宿县| 福州市| 定远县| 太湖县| 虞城县| 郯城县| 青铜峡市| 安龙县| 巴青县| 湟源县| 渭南市| 茂名市| 石屏县| 明水县| 女性| 肃南| 邢台县| 梁平县| 兴安盟| 南昌县| 紫金县| 肇庆市| 新津县| 陇川县| 五原县| 穆棱市| 治县。|