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

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

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

    隨筆-34  評論-1965  文章-0  trackbacks-0

    通過這一年多的艱苦奮戰,項目就快接近收官之戰。回首過往一年的開發歷程,心中不免有些感慨萬千,故寫下這篇BLOG總結一下經驗與教訓,算是兌現上一篇BLOG的諾言。

    項目簡介

    由于一些商業上的原因,我不能透露項目的細節。不過,我可以與大家分享一下所謂的“架構”。之所以給“架構”兩字加上引號,是因為我不想玷污這個神圣的詞匯。在項目開始選用第三方組件(Component)時,由于種種原因,其實我只有很小選擇余地,所以只能對著一些官方文檔將這些組件并揍在一起。

    圖1 組件圖
    圖1 組件圖

    經驗與教訓

    雖然我們平時說“成功的經驗,失敗的教訓”,但是有時要區分兩者并不容易,因為有些事情雖稱不上成功,卻也不至于失敗。故請允許我暫時將其混成一談。

    #1 分而治之(divide and conquer),重構代碼

    在項目中當復雜業務邏輯變得復雜時,有的程序員沒有膽量去重構舊代碼,而取用保守方式,拼命地添加新的代碼。這樣做的后果就是會導致代碼量激增,難于維護。“分而治之”可以幫助我們理清復雜的業務,提高代碼可重用性。所以任何時候,都不要忘記這個程序基本的方法學。

    #2 盡量不要使用遠程(Remote)EJB

    遠程EJB給我們帶來很多的問題:部置的復雜性,由于網絡傳輸引起的性能問題,EJB安全性問題等。我的同事中有些人堅持使用遠程EJB的原因,他們認為只有使用遠程EJB才實現群集(Cluster)。其實這想法是錯誤,具體可以參考《Marstering Enterprise JavaBeans》第三版中,第8章“EJB Performance Optimization”中“Choosing Between Local Interfaces and Remote Interfaces”和第19章“Clustering”。

    #3 避免在程序中保存狀態(State)

    有的程序員偏愛全局類型變量,而忽略通過參數和返回值進行共享數據。狀態對程序來說其實就是一種負擔,在多線程和分布式的環境下更是如此。還有,編程的另一原則是盡量縮小變量有效范圍(Scope),大家可以參考一下《Code Complete》中一些建議。

    另外,要小心使用靜態變量,切記要通過final關鍵字和Collections.unmodifiableXxxx方法(對于集合類型)使其不可變。如果需要在對象之間共享狀態,可以考慮使用HttpSession或分布式的緩存如(JBoss Cache等)。

    #4 如果使用Hibernate,請確保程序員了解Hibernate中持久化對象生命周期

    在我身邊有很程序員,在使用Hibernate時,沒有花時間了解持久化對象生命周期。他們以普通JDBC的編程風格編寫Hibernate程序。故出現了如下所示的代碼:

        public void myDao() {
            Session session 
    = getSession();
            Cat cat 
    = session.load("kitty");
            cat.setName(
    "Hello Kitty");
            session.saveOrUpdate(cat);
        }
    列表1 代碼示例

    雖然上述代碼功能上沒有問題,但是反映了它的作者沒有了解Hibernate的持久化對象生命周期。這里的session.saveOrUpdate其實是完全沒必要的。如果你不明白個中原因,可以參考Hibernate的官方文檔或《Hiberante In Action》的第四章“Working with persistent objects”。

    #5 設計好你的業務對象模型

    我看過很多項目的代碼中其大量存在所謂的PO(Persistent Object)用于ORM和VO(Value Object)或稱為DTO(Data Transfer Object)用于程序之間傳輸數據,更有甚者,這兩種對象只是相差一兩個屬性。這樣的做法的弊端是代碼中充斥大量林林總總的copyXxx的方法,導致程序出現一些不可預期的行為。

    其實,通過對業務對象分析,尤其是對象之間的關系建立,上述問題中的大部分都是可以避免的。

    #6 不要單獨使用JSF

    經過這兩年過JSF學習與使用,我對JSF是又愛又恨。JSF有不少優點:

    • 類似ASP.NET的事件驅動(Event-Driven)開發模型,簡化了Web應用的開發;
    • 通過EL(Expression Language,表達式語言)雙向值綁定,提高編程效率;
    • 基于組件(ASP.NET中稱之控件)的模型,方便第三方進行擴展。

    不過,同樣JSF缺點也不少:

    • 保存過多的頁面狀態,而除了Session和Application范圍之外的Managed Bean都是沒有狀態,這個不對稱性導致很多問題。所以在很多時候迫使程序員使用Session范圍的Managed Bean。而過度使用Session會加大服務器的內存消耗;
    • 蹩腳的驗證框架等。

    所以,在使用JSF時,我們應該結合其它優秀的框架如JBoss Seam,RichFaces等,達到互相取長補短效果。

    結言

    上述評論,僅代表我本人立場:-)。如有錯誤,還望各位朋友不吝賜教。

    posted on 2008-10-25 01:20 Max 閱讀(19179) 評論(28)  編輯  收藏 所屬分類: 心路歷程

    評論:
    # re: 項目總結 2008-10-25 08:23 | 大道自然
    總結的不錯.但有些問題即然說明了不好的地方,就要給出個好的答案.比如hibernate中的saveOrUpdate.等  回復  更多評論
      
    # re: 項目總結 2008-10-25 10:45 | TiGERTiAN
    @大道自然
    處于Persistent狀態的對象,調用saveOrUpdate是不做任何事情的  回復  更多評論
      
    # re: 項目總結 2008-10-25 11:37 | live2map
    我的理解是采用load方法是獲取Persistent狀態的對象,然后需要removeCache改版它的狀態,這樣用saveOrUpdate有用,save or update完了后,再put in cache,不知道我的理解對不,  回復  更多評論
      
    # re: 項目總結 2008-10-25 20:27 | 久城
    先支持下,不錯。
    第五點還想請教一下,我們項目中一直都是大量的使用DTO。
    你所說的不可預期的行為是什么?有什么好的避免的辦法嗎?  回復  更多評論
      
    # re: 項目總結 2008-10-26 12:13 | xiapir
    前排  回復  更多評論
      
    # re: 項目總結 2008-10-26 22:23 | 雨奏
    @live2map
    你沒必要這樣做啊:如果一個對象處于persistent狀態,你更改了它,Hibernate會在flush的時候自動把它保存到數據庫中的。對于緩存,Hibernate也會根據你制定的策略進行同步

    @久城
    個人認為如果使用了Hibernate,確實沒有必要使用DTO:你把一個detach的對象當作VO或DTO就可以了嘛  回復  更多評論
      
    # re: 項目總結 2008-10-27 10:20 | 西濱(Ivan Chen)
    其實作者已經說清楚了“這里的session.saveOrUpdate其實是完全沒必要的。“

    就是可以不用寫這一句,等到session結束后,Hibernate檢查cat對象發生了改變,會自動更新的。  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-10-27 13:35 | abc
    @西濱(Ivan Chen)
    寫個seam jsf的簡單入門吧!  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-10-28 14:39 | 豬豬
    經驗不錯,但說出了就大概解說下。  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-11-03 15:54 | Allen
    關注中!MAX,如果有機會,我有很多困惑想得到你的解答!msn:xxrrss1987@live.cn  回復  更多評論
      
    # re: 項目總結 2008-11-03 19:58 | 小易
    關注!  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-11-05 21:47 | yxl
    希望MAX兄弟能有更好的博文在博客中出現,期盼................  回復  更多評論
      
    # re: 項目總結 2008-11-07 20:55 | yeshucheng
    作者提到了session的問題,其實這里最主要是需要了解hibernate中的三種狀態,這個最為主要。了解三個狀態的差異區別就知道原因了,呵呵  回復  更多評論
      
    # re: 項目總結 2008-11-07 20:56 | yeshucheng
    題外話,感覺作者的這個項目也是一個很怪異的項目。而且感覺這個項目是在融合或者說兼容其他的項目,這種項目最頭疼。  回復  更多評論
      
    # re: 項目總結 2008-11-11 15:43 | fanwenda
    我支持這個內容
      回復  更多評論
      
    # re: 項目總結 2008-11-11 15:45 | fanwenda
    我知道這個論壇很好www.bjjypw.com 希望大家都支持

    我支持 www.wdjpw.com
    希望大家支持  回復  更多評論
      
    # re: 項目總結 2008-11-24 10:07 | thematrix
    雖然看不怎么懂,但是還是要頂一下。  回復  更多評論
      
    # re: 項目總結 2008-11-26 16:30 | gqs
    支持作者  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-12-09 15:17 | 三少
    我覺得hibernate的saveOrUpdate最好不用,很容易出錯。
    做好save或者是update的判斷就可以了!

    JSF我覺得蠻好的,但是它自己的IOC不夠強大,結合Spring就好多了!  回復  更多評論
      
    # re: 項目總結 2008-12-11 10:21 | zjielove
    雖然自己能力不高 有些看不懂 還是要頂 哈哈  回復  更多評論
      
    # re: 項目總結 2008-12-15 09:29 | kaig
    問一下你們開發了一個什么樣的項目啊(告訴名稱即可,好奇)?但我更希望多一點STRUTS2的交流  回復  更多評論
      
    # re: 項目總結[未登錄] 2008-12-25 14:24 | fungway
    學習。。。  回復  更多評論
      
    # re: 項目總結 2009-02-01 15:19 | tigerkin
    @大道自然
    把session可以close或者flush就可以自動更新  回復  更多評論
      
    # re: 項目總結 2009-02-20 10:55 | Illu
    希望樓主能對存在的問題提出更好的解決方案  回復  更多評論
      
    # re: 項目總結 2009-03-09 15:40 | 龍華城
    文章寫的很不錯,我正在學struts2 ,謝謝你的文章了.  回復  更多評論
      
    # re: 項目總結 2009-03-19 08:11 | dealry
    我想作者是想引導我們去看相關的資料,而不是在這里一一灌輸給我們
    非常感謝 您能把自己的經驗和知識分享
      回復  更多評論
      
    # re: 項目總結 2009-09-17 10:20 | tsscomcn
    精典,收藏了。  回復  更多評論
      
    # re: 項目總結 2010-04-28 17:26 | zisehefeng
    牛人啊。  回復  更多評論
      
    主站蜘蛛池模板: 久久久久亚洲AV无码专区首| 亚洲乱码一区二区三区在线观看 | 国产偷国产偷亚洲高清日韩| 亚洲va中文字幕| 浮力影院第一页小视频国产在线观看免费| 亚洲91精品麻豆国产系列在线| 91情侣在线精品国产免费| youjizz亚洲| 国产老女人精品免费视频| 特级毛片A级毛片100免费播放| 免费吃奶摸下激烈视频| 一区二区三区在线免费| 亚洲女初尝黑人巨高清| 一个人免费日韩不卡视频| 亚洲欧洲日产国码在线观看| aa级一级天堂片免费观看| 亚洲精华国产精华精华液网站| 四虎在线播放免费永久视频 | 日韩免费电影在线观看| 麻豆安全免费网址入口| 亚洲一区AV无码少妇电影☆| 外国成人网在线观看免费视频| 亚洲午夜电影一区二区三区| 国产精品免费看香蕉| 精品国产污污免费网站入口在线 | 久久精品国产亚洲| 在线视频免费观看高清| 精品亚洲成a人在线观看| 亚洲午夜久久久久久噜噜噜| 69视频免费在线观看| 亚洲国产成人无码AV在线影院| 国产成人精品曰本亚洲79ren| 免费国产黄网站在线观看视频| 亚洲欧美国产国产综合一区| 亚洲综合AV在线在线播放| 91精品国产免费久久久久久青草| 日韩国产欧美亚洲v片 | 亚洲1区1区3区4区产品乱码芒果| 免费**毛片在线播放直播| 一级毛片在线免费观看| 国产亚洲欧美日韩亚洲中文色|