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

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

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

    隨筆-199  評論-203  文章-11  trackbacks-0
    在不分層的系統里,我們可以將所有的代碼都寫到一個地方,比如struts的Action類。在這里,我們不僅要處理頁面邏輯,還要做業務邏輯,還要做數據訪問。比如說:

      
         public String addUser() {

      if(user == null) {

      return FAIL_NO_USER;

      }

      Result result = null;

      if(Role.ADMIN.equals(user.getRole())) {

      result = doSomethingForAdmin(user) ;

      } else {

      result = doSomethingForOthers(user);

      }

      Transaction trans = sess.beginTransaction();

      Query query = sess.createQuery("update Result set level = :level");

      query.setParameter("level", result.getLevel());

      query.executeUpdate();

      trans.commit();

      sess.close();

      return SUCCESS;

      }


      那么上面的代碼,哪些部分是頁面的部分,哪些是業務處理,哪些是數據訪問呢?我認為,這個劃分方法是:Action里只做和頁面相關的事,不操作業務對象;Service不依賴于任何表現技術,不操縱任務用于表現的對象,對于業務對象,尤其是跨多個業務對象的操作,要放到Service里面來;最后,單純的業務對象的存取,組裝放到DAO里完成。上面所說的業務對象,就是像上例中role, result等和業務相關的對象,而SUCCESS, inputID等,則是頁面相關的部分。因些,可以將上例改為:

      
         public String addUser() {

      if(user == null) {

      return FAIL_NO_USER;

      }

      Result result = service.process(user);

      dao.update(result);

      return SUCCESS;

      }

      在service里:

      public Result process(User user) {

      Result result = null;

      if(Role.ADMIN.equals(user.getRole())) {

      result = doSomethingForAdmin(user) ;

      } else {

      result = doSomethingForOthers(user);

      }

      return result;

      }

      在dao里:

      public void update(Result result) {

      Transaction trans = sess.beginTransaction();

      Query query = sess.createQuery("update Result set level = :level");

      query.setParameter("level", result.getLevel());

      query.executeUpdate();

      trans.commit();

      sess.close();

      }


      這樣分層,看起來會顯得很麻煩,但事實上確實是大有好處,首先:

      代碼更易讀。每一層的每個方法的意義和目的更加明確,讀以起來受的干擾更少。

      拆開后的每一層都更容易測試。

      具體如何分層,還需要在開發中,多多體會,這沒有絕對的界限,也許一開始放在action里的頁面的控制后來會上升為業務規則,并被其它地方重用,然后被移入service;也許某一塊對數據的存取也變得非常復雜,包含了業務邏輯,然后被移入service;也有可能發現以前寫的service根本沒有想像的那樣的業務邏輯,只是幫助做了一些頁面的流程控制,然后被重構成Action的一個方法,等等。

    posted on 2009-05-14 18:13 Werther 閱讀(5802) 評論(8)  編輯  收藏

    評論:
    # re: 區分Action, Service 和 Dao功能 2009-05-14 19:39 | too young too simple
    too young too simple sometimes native

    在實際開發中 這樣的分層是對效率的極大浪費  回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-14 19:58 | Edward's
    @too young too simple
    實際開發就是這樣吧  回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-14 20:49 | stone2083
    根據需求來決定的。
    系統分層,和公司設立部門的概念是同樣的。

    一個創業型公司,很可能整個公司就一個人:即是老板,又是程序員,同時還是業務員,等等,
    如同一個系統中,一個action做了所有的業務;

    一個中型公司,有一個老板,有一個技術人員,有一個業務人員,有一個運營人員,等等,
    如同一個系統中,有action層,biz層,service層,dao層等,通過jar包依賴調用;

    一個大型公司,有CEO,有技術部們,有業務部門,有運營部門,等等,
    如同系統模型中,每個模塊存在獨立service系統服務,依賴dao api,依賴search engine api,依賴DW api等;
    前臺又有不同的業務系統,有自己的action,依賴biz層,biz層又依賴獨立模塊的service api;
    系統之間的依賴,采用SOA架構等

    不同的企業規模,決定不同的公司組織架構;
    不同的產品需求,決定不同的系統架構;



      回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-15 09:11 | guest
    其實biz層,service層兩者可以合并為一層,你們覺得如何  回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-15 12:23 | stone2083
    一般應用中,biz層和service層的概念就是同一個,硬做分層,是脫了褲子放屁 ,自找麻煩。 :)

    當公司規模大了,應用龐大了,復雜了:
    比如,當web應用有幾十,上百個;task應用幾十,上百個。。。
    該如何控制和維護業務人員編寫的biz和dao呢?

    于是乎,就需要抽象出service層(核心組件服務/核心產品服務),service依賴dao api,search engine api,dw api等等,并且通過某些協議,暴露自己的service api

    前臺應用(web應用,task應用等),通過biz層,調用不同service api(不再涉及dao等底層服務)

    如此一來,底層實現發生變化,比如數據庫重構等,只要維持service api不變,不會涉及前臺應用的變動。

    如同上面說的,要不要biz,service,還是根據應用規模來決定的。

      回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-16 23:22 | jinfeng_wang
    to 樓上:
    是不是“脫了褲子放屁”,得取決于你的腸道的功能好不好,不小心有一天,你就會以為是放屁,其實是拉稀。

    順手牽羊式的“脫褲子放屁”,絕對是減少“莫名其妙”問題出現可能性的一個絕佳機會。 在系統演變的越來越復雜的時候,是沒有心思和時間再去演變你的原有代碼結構的。

    如果你的公司,允許你隨意改動“既成的可運行”的代碼,麻煩你說一下,你公司名字。

      回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-05-21 13:25 | stone2083
    比喻很形象,也比較能說明問題。站在技術角度上,我非常認同你說的觀點。
    對于一家長期發展的公司,系統演變會越來越復雜,前期為了貪圖方便的設計,總有一天,會帶來無窮的痛楚。這些俺都明白。目前也在經歷這些痛楚。

    但是,確實也存在很多系統,本身業務并不復雜(比如外包公司接手的一次性的小項目),并且也很難看到未來的發展方向(比如針對一些創業型公司的項目),之后重寫+數據遷移的方案代價遠遠小于系統重構的代價,那么我,決不會采用復雜的架構,把簡單問題復雜化。
    PHP,ROR(使用action+model,沒有過多分層)的項目,在中小型項目中,比較流行的,也能說明一些問題。

    很多的系統,如果能標標準準按照action->biz->dao的結構寫,已經是相當不錯了(通過一些應用拋出的錯誤異???,很多甚至在jsp上書寫大量的業務邏輯,或者在action屬性大量的業務邏輯)。要在biz層抽象出biz->service的概念的系統,并不是太多。(至少是中型公司及以上,才需要考慮的)

    我說這些,不是為了否決樓上的說辭--其實我是非常認同的觀點。
    我只是想表明,任何的架構設計,都是需要根據需求以及未來的發展,來決定的。  回復  更多評論
      
    # re: 區分Action, Service 和 Dao功能 2009-06-26 17:20 | API
    受益良多  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 中文字幕精品亚洲无线码二区| 成人毛片免费视频| 国产亚洲精品福利在线无卡一| MM1313亚洲国产精品| 在线视频免费国产成人| 国产成人综合亚洲绿色| 国产免费午夜a无码v视频| 免费国产高清毛不卡片基地| 亚洲精品和日本精品| 免费人成在线观看视频高潮| 亚洲国产精彩中文乱码AV| 鲁大师在线影院免费观看| 亚洲免费观看在线视频| 美女黄网站人色视频免费国产| 色窝窝亚洲AV网在线观看| 亚洲人成影院在线观看| 国产羞羞的视频在线观看免费| 久久久久久亚洲AV无码专区| 曰曰鲁夜夜免费播放视频 | 亚洲免费在线视频播放| 最新亚洲精品国偷自产在线| 四虎影视在线永久免费看黄| 久久久精品视频免费观看| 亚洲AV无码国产丝袜在线观看| 亚洲精品视频在线免费| 在线看亚洲十八禁网站| 国产AⅤ无码专区亚洲AV| 亚洲成人在线免费观看| 国产精品亚洲色图| 亚洲大尺度无码无码专区| 中国在线观看免费高清完整版| 青青草国产免费国产是公开| 亚洲大片在线观看| 日韩免费一级毛片| 亚洲免费在线视频| 国产亚洲视频在线观看| 亚洲AV无码AV男人的天堂| 国产jizzjizz视频全部免费| 久久aⅴ免费观看| 精品国产日韩亚洲一区在线| 亚洲精品线在线观看|