Javadream

          A long way and a dream.

          網(wǎng)址在這里:http://forum.javaeye.com/viewtopic.php?t=627&postdays=0&postorder=asc&start=0

          說實在的,這是很理想化的設計方案,真的,我的想法也一樣,之所以是這樣,主要是因為我看了一本Struts的書,是奧來理出版的,里面就是這樣的一個概念,雖然那本書里并沒有嚴格按照這樣的思路來做.不過也可以看出這是很完美的,但也是不可取的方案.

          不可取的地方在哪里?性能問題,主要是從Service層上來的實體都可進行數(shù)據(jù)轉換(DT),生成View層的DTO,單個實體是一次轉換,多個實體,比如set,iterator等,就要n次轉化,而這些僅僅是為了使視圖層和Service層分離,這是不明智的.
          不過這樣的模式的出現(xiàn)也是有原因的.因為應用這個Service層可能會有多樣的客戶端,在適應多種客戶端的就要用到這些東西,比如客戶端是一個Swing GUI程序?那么他需要的是一個序列化的數(shù)據(jù)包,而這個數(shù)據(jù)庫僅僅列出的就是健值對,為了設計簡單,這個客戶端就不應該知道服務器端的類以及類的聯(lián)系,它僅僅依賴于Service層提攻的DTO,那么就要用到DTO,OK,現(xiàn)在明白robin的設計想法是相當合理,而且重用性很高的.這是大型J2EE程序所常用的方法.

          但對于專用于Web而永遠不打算有其它客戶端的中小Web程序來言,上面的方法已經(jīng)有些不合時宜了,可以說沒有必要死搬了.也就是說設計應該有所退化,至于退化成什么樣子,是很讓人覺得為難的.我現(xiàn)在的思想是:所有實體對象從最頂層的視圖層到最底層的持久層,都是可以共用的,這樣就不存在DT的問題,那么中間過程是怎么樣的呢?
          我的分法是這樣:

          視圖層
          -----
          控制層
          -----
          服務接口層
          -----
          業(yè)務邏輯層
          -----
          持久層
          -----
          數(shù)據(jù)庫層

          穿梭于其中的數(shù)據(jù)杻帶是PO,也可以說它是VO.這些層從上往下依賴,比如說持久層依賴于數(shù)據(jù)庫層,如果數(shù)庫的設計有所變化,必然會導至持久層設計發(fā)生變化,而持久層也因此影響業(yè)務邏輯層,從而產(chǎn)生骨牌效應.雖然這樣的設計是不好的,但是誰能夠解決這樣的事情呢?數(shù)據(jù)庫這樣最底層最核心的東西都改變了,這必然會影響整個程序的行為,比如說數(shù)據(jù)庫要求多加一個計錄評分級別的功能,可是原來的程序里沒有這樣的功能,而且所有的調用接口都沒有寫到這方面的功能,那么不就是整個程序只要和這個功能有關的程序文件都要進行修改,這是不可避免的(如果可以避免,請告訴我方法,小弟永生記住您的大恩).

          為什么要分多一個服務接口層?很簡單,主要是把業(yè)務邏輯脫離特定的Web框架,不論是在Struts、Webwork、JSF,他們都可正常運行,當然你也可以不要這一層,把業(yè)務邏輯寫進Action,這樣從而把程序死死綁定到了某個Web Framework,這樣的好處是,程序的性能有很小的提高,不過苦果是,某一天要改成其它的Web framework呢?我建議的方案是加多一個服務接口層,這樣Action主要的任務就是從接口層取得數(shù)據(jù)轉到視圖層去顯示,這樣Action的重任就很清楚了,它只是一個控制器而已(笑話,那么這些自稱MVC的框架,啟不只是VC而已?哈…………)

          那么什么是業(yè)務邏輯層呢?因為程序并不只是涉及數(shù)據(jù)庫操作,而且常會伴隨一些文件操作,而這些都是對一實體的一次單元操作,而且是可重用的操作.業(yè)務邏輯層就是這樣的單元操作接口,他調用持久層,更確切的說是DAO,得到PO,但后進行相關的操作。

          注意,這里的持久層不是具體到Hibernate的這些ORM,而只是DAO,具體的ORM由具體的DAO實現(xiàn)。

          呵。。。從上面這句話,也許你也會想問一個問題,具體的DAO?對,就是具體的DAO。這里就運用的面向接口編程的思想,層與層之間調用的只是接口而已,每一層都有特定的實現(xiàn),而這些特定的實現(xiàn)是可插拔的,而且不會影響原程序的運行。你可以用Factory模式生成具體的DAO bean,呵…………這是一個痛苦的過程,而且Factory這樣與程序邏輯無關的東西竟然一躍而上進入了我們的代碼,這不是一個好的方法,我們可以用一種IoC框架,Spring就是一個極好的東西,注入我們想要的DAO bean,這樣我們寫代碼就可以專心對接口編程了,我們就沒有必要擔心什么Factory了,呵……

          那么實體呢?他能接口化嗎?從我現(xiàn)在的所掌握的知識來看,他是不可接口化的,他是數(shù)據(jù)的載體,也是一些常規(guī)操作的載體,也正是因為這樣,他是極其重要也是極其簡單的,所以,他不用接口化。

          好了,終于理清這半年來所思考的東西了,大至上我已經(jīng)明白怎樣去合理的規(guī)范化設計一個程序,現(xiàn)在剩下的只是挑選合適的應用框架,然后做第一個Java Web開發(fā)。汗,直到現(xiàn)在我都還沒有真正開發(fā)過Java Web程序呢,呵…………

          Feedback

          # re: 如何理解robin的J2EE數(shù)據(jù)表示?我有自己的異議.  回復  更多評論   

          2006-04-26 17:58 by oxl
          其實理論先行是必要的,也是最好的方法.

          在我身邊很多師弟都是用純JSP寫程序,然后就跑到我跟前大言不慚地說自己會開發(fā)J2EE程序了.呵....開始我不懂時還真給蒙了.呵......

          J2EE?與其說去遵守他的規(guī)則,不如去退化它,成為自己的規(guī)則,既要保持設計靈活,也要保持性能優(yōu)異.但要做到一點,面向接口的編程.

          正確理解MVC是很費時間的,雖然說起來很簡單,但是在任何一個沒有實踐開發(fā)過這樣的程序的人來說是很模糊的概念.我是搞PHP編程出生的,在那種半生不熟的PHP MVC里打過混,甚至寫過自己認為不錯的MVC WEB框架,相當清楚MVC并不好理解,往往會把C和M混淆了.也常把M和P混淆了.然后在不斷的思考和重新理解的過程中,我總結出了上面我認為還算合理的Java Web設計模式.

          快要失業(yè)了,我這么一個偽大專生(連大專都不是真的,頂多是中專畢業(yè))就要餓肚子了.希望在我未餓暈之前完成我的程序吧.我想我很快就有作品了,第一個像樣的作品,一個能拿得出手的作品.就業(yè)難啊,我現(xiàn)在就在努力呢!!

          # re: 如何理解robin的J2EE數(shù)據(jù)表示?我有自己的異議.  回復  更多評論   

          2008-08-20 12:42 by zhuzy
          主站蜘蛛池模板: 广西| 龙山县| 方正县| 凤阳县| 德安县| 天长市| 瑞金市| 宜黄县| 贵港市| 南漳县| 建瓯市| 台州市| 凌源市| 扎鲁特旗| 洪洞县| 庆阳市| 蓬安县| 汝州市| 苏尼特左旗| 青冈县| 镇原县| 巴林左旗| 临澧县| 司法| 钟祥市| 天峻县| 和林格尔县| 曲松县| 邢台县| 潍坊市| 仪征市| 吴川市| 浑源县| 抚远县| 大余县| 苍南县| 朝阳市| 建水县| 昌宁县| 南江县| 讷河市|