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

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

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

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

      
         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;

      }


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

      
         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();

      }


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

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

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

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

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

    評(píng)論:
    # re: 區(qū)分Action, Service 和 Dao功能 2009-05-14 19:39 | too young too simple
    too young too simple sometimes native

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

    一個(gè)創(chuàng)業(yè)型公司,很可能整個(gè)公司就一個(gè)人:即是老板,又是程序員,同時(shí)還是業(yè)務(wù)員,等等,
    如同一個(gè)系統(tǒng)中,一個(gè)action做了所有的業(yè)務(wù);

    一個(gè)中型公司,有一個(gè)老板,有一個(gè)技術(shù)人員,有一個(gè)業(yè)務(wù)人員,有一個(gè)運(yùn)營人員,等等,
    如同一個(gè)系統(tǒng)中,有action層,biz層,service層,dao層等,通過jar包依賴調(diào)用;

    一個(gè)大型公司,有CEO,有技術(shù)部們,有業(yè)務(wù)部門,有運(yùn)營部門,等等,
    如同系統(tǒng)模型中,每個(gè)模塊存在獨(dú)立service系統(tǒng)服務(wù),依賴dao api,依賴search engine api,依賴DW api等;
    前臺(tái)又有不同的業(yè)務(wù)系統(tǒng),有自己的action,依賴biz層,biz層又依賴獨(dú)立模塊的service api;
    系統(tǒng)之間的依賴,采用SOA架構(gòu)等

    不同的企業(yè)規(guī)模,決定不同的公司組織架構(gòu);
    不同的產(chǎn)品需求,決定不同的系統(tǒng)架構(gòu);



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

    當(dāng)公司規(guī)模大了,應(yīng)用龐大了,復(fù)雜了:
    比如,當(dāng)web應(yīng)用有幾十,上百個(gè);task應(yīng)用幾十,上百個(gè)。。。
    該如何控制和維護(hù)業(yè)務(wù)人員編寫的biz和dao呢?

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

    前臺(tái)應(yīng)用(web應(yīng)用,task應(yīng)用等),通過biz層,調(diào)用不同service api(不再涉及dao等底層服務(wù))

    如此一來,底層實(shí)現(xiàn)發(fā)生變化,比如數(shù)據(jù)庫重構(gòu)等,只要維持service api不變,不會(huì)涉及前臺(tái)應(yīng)用的變動(dòng)。

    如同上面說的,要不要biz,service,還是根據(jù)應(yīng)用規(guī)模來決定的。

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

    順手牽羊式的“脫褲子放屁”,絕對(duì)是減少“莫名其妙”問題出現(xiàn)可能性的一個(gè)絕佳機(jī)會(huì)。 在系統(tǒng)演變的越來越復(fù)雜的時(shí)候,是沒有心思和時(shí)間再去演變你的原有代碼結(jié)構(gòu)的。

    如果你的公司,允許你隨意改動(dòng)“既成的可運(yùn)行”的代碼,麻煩你說一下,你公司名字。

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

    但是,確實(shí)也存在很多系統(tǒng),本身業(yè)務(wù)并不復(fù)雜(比如外包公司接手的一次性的小項(xiàng)目),并且也很難看到未來的發(fā)展方向(比如針對(duì)一些創(chuàng)業(yè)型公司的項(xiàng)目),之后重寫+數(shù)據(jù)遷移的方案代價(jià)遠(yuǎn)遠(yuǎn)小于系統(tǒng)重構(gòu)的代價(jià),那么我,決不會(huì)采用復(fù)雜的架構(gòu),把簡單問題復(fù)雜化。
    PHP,ROR(使用action+model,沒有過多分層)的項(xiàng)目,在中小型項(xiàng)目中,比較流行的,也能說明一些問題。

    很多的系統(tǒng),如果能標(biāo)標(biāo)準(zhǔn)準(zhǔn)按照action->biz->dao的結(jié)構(gòu)寫,已經(jīng)是相當(dāng)不錯(cuò)了(通過一些應(yīng)用拋出的錯(cuò)誤異常看,很多甚至在jsp上書寫大量的業(yè)務(wù)邏輯,或者在action屬性大量的業(yè)務(wù)邏輯)。要在biz層抽象出biz->service的概念的系統(tǒng),并不是太多。(至少是中型公司及以上,才需要考慮的)

    我說這些,不是為了否決樓上的說辭--其實(shí)我是非常認(rèn)同的觀點(diǎn)。
    我只是想表明,任何的架構(gòu)設(shè)計(jì),都是需要根據(jù)需求以及未來的發(fā)展,來決定的。  回復(fù)  更多評(píng)論
      
    # re: 區(qū)分Action, Service 和 Dao功能 2009-06-26 17:20 | API
    受益良多  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 精品免费久久久久国产一区| 亚洲国产精品狼友中文久久久| 一级做a爱片特黄在线观看免费看| 亚洲一区二区三区首页| 亚洲精品国精品久久99热| 成人片黄网站A毛片免费| 无码国产精品一区二区免费3p| 一个人看的在线免费视频| 亚洲国产精品网站在线播放| 久久亚洲精品成人av无码网站 | 亚洲а∨精品天堂在线| 亚洲成A∨人片在线观看无码| 亚洲精品少妇30p| 亚洲性日韩精品国产一区二区| 在线观看免费国产视频| 国产香蕉免费精品视频| 久久99国产综合精品免费| 免费毛片a线观看| 国产三级在线免费| 97在线视频免费公开视频| 2022免费国产精品福利在线| 免费夜色污私人影院网站| 美女被爆羞羞网站免费| 国产成人人综合亚洲欧美丁香花| 亚洲乱码av中文一区二区| 亚洲女子高潮不断爆白浆| 亚洲色偷偷色噜噜狠狠99网| 国产人成亚洲第一网站在线播放| 亚洲av极品无码专区在线观看| 亚洲成a人片在线观看中文app| 91亚洲自偷在线观看国产馆| 亚洲欧洲精品一区二区三区| 亚洲国产精品线在线观看| 亚洲一区二区电影| 亚洲日韩在线视频| 久久综合久久综合亚洲| 久久久久亚洲精品无码网址色欲 | 91福利免费视频| 91青青青国产在观免费影视| 99国产精品视频免费观看| 亚洲高清免费在线观看|