立體數(shù)據(jù)模型是Dorado中全新的、最為核心的概念。
Dorado主張數(shù)據(jù)和表現(xiàn)的分離,將界面上的數(shù)據(jù)抽象為專門的數(shù)據(jù)模型,成為一個(gè)獨(dú)立的子系統(tǒng)。下面我們從數(shù)據(jù)流轉(zhuǎn)的角度分析一下WEB應(yīng)用中的數(shù)據(jù)處理過程??聪聢D:
Web應(yīng)用的運(yùn)行過程就是對(duì)數(shù)據(jù)進(jìn)行處理的過程,上圖我們分析的就是從數(shù)據(jù)庫出發(fā)到瀏覽器轉(zhuǎn)一圈,最后通過ORM業(yè)務(wù)邏輯處理重新保存到數(shù)據(jù)庫的這么一個(gè)過程。
我們先分析從數(shù)據(jù)庫到瀏覽器:首先從數(shù)據(jù)開始,以目前最常用的開發(fā)模式分析,例如我們使用Hibernate,那么這些數(shù)據(jù)就會(huì)被ORM處理機(jī)制轉(zhuǎn)換為通過一堆JavaBean描述的對(duì)象,我們稱它們?yōu)轭I(lǐng)域?qū)ο竽P?DomainObject),之后領(lǐng)域?qū)ο罂赡軙?huì)經(jīng)過業(yè)務(wù)邏輯的組裝,重新拼裝或改寫,變成一種全新的格式,也有可能形式上沒有什么變化,但是作用上已經(jīng)發(fā)生了很大的變化,這些對(duì)象我們叫視圖數(shù)據(jù)對(duì)象。這些對(duì)象是為前臺(tái)提供服務(wù)的。之后這些ViewObject通過HTTP傳輸,被response到瀏覽器中,成為瀏覽器前端所有表達(dá)的數(shù)據(jù)。
再來看從瀏覽器到數(shù)據(jù)庫:ViewObject輸出到瀏覽器之后,這些數(shù)據(jù)被展示給客戶,由用戶做各種操作,可能改寫其中的部分信息,最后它們會(huì)被提交到服務(wù)端,并被轉(zhuǎn)換為ViewObject。之后服務(wù)端要抽取這些ViewObject中的信息組裝為ORM中所需要的領(lǐng)域?qū)ο?,再持久化到?shù)據(jù)庫中。
平面數(shù)據(jù)和立體數(shù)據(jù)
要進(jìn)一步分析前面的數(shù)據(jù)處理,我們以平面數(shù)據(jù)和立體數(shù)據(jù)來概括數(shù)據(jù)在前述過程中的兩種數(shù)據(jù)載體形式。
概念:
以數(shù)據(jù)載體形式的角度再度觀察
根據(jù)這平面數(shù)據(jù)和立體數(shù)據(jù)的概念,我們將前面WEB應(yīng)用中的數(shù)據(jù)處理過程的圖,進(jìn)行著色區(qū)分這兩種數(shù)據(jù),其中的立體數(shù)據(jù)被標(biāo)以藍(lán)色
整個(gè)過程充斥著平面到立體,立體到平面,平面到立體的惡性循環(huán),整個(gè)過程非常不流暢。這也是傳統(tǒng)WEB開發(fā)中相對(duì)比較麻煩和復(fù)雜的一個(gè)重要原因。在關(guān)系數(shù)據(jù)庫到DomainObject端的相互轉(zhuǎn)換我們尚可以依靠Hibernate這些相對(duì)成熟的ORM工具幫助我們以較小的代價(jià)完成轉(zhuǎn)換工作,但是在Java端到瀏覽器端立體到平面,平面到立體的轉(zhuǎn)換過程中卻需要我們完全靠自己的手工完成。
對(duì)數(shù)據(jù)形式進(jìn)行一些歸納
通過上面的分析,我們對(duì)數(shù)據(jù)形式進(jìn)行一些歸納:
數(shù)據(jù)的本質(zhì)是立體的,現(xiàn)實(shí)生活的檢驗(yàn)我們知道對(duì)象之間都是引用的關(guān)系;
為什么需要引入立體數(shù)據(jù)模型?根據(jù)前面的分析,其實(shí)我們不難看出如下兩點(diǎn):
綜合以上兩點(diǎn),我們需要在Client端提供立體數(shù)據(jù)模型以提高界面的友好度、同時(shí)改善應(yīng)用數(shù)據(jù)處理過程的流暢性。即將下圖紅框中的部分變?yōu)榱Ⅲw數(shù)據(jù)模型:
我們將上圖再簡化一下,就總結(jié)為如下圖:
從左邊平面DataSet到右面立體DataSet就是我們的目標(biāo)。
首先進(jìn)一步了解兩個(gè)概念: 數(shù)據(jù)載體
數(shù)據(jù)集
Dorado中的數(shù)據(jù)載體 Dorado在Server端不提供專用的數(shù)據(jù)載體對(duì)象,而是直接使用POJO Bean/Map以及List/Set來作為數(shù)據(jù)載體。
Dorado的數(shù)據(jù)集——DataSet Dorado中提供了DataSet作為數(shù)據(jù)集的描述,DataSet主要的生命周期在Client端。相對(duì)Dorado5而言,Dorado中DataSet的功能被極大的弱化了。其最重要的用途就是為其管理那堆數(shù)據(jù)賦予一個(gè)ID,以便于數(shù)據(jù)感知控件能夠找到這些數(shù)據(jù)。另外DataSet不再局限于二維表結(jié)構(gòu)數(shù)據(jù),而是可以支持非常自由的數(shù)據(jù)形式:
想象如下這樣一個(gè)人事組織架構(gòu)的場(chǎng)景。
這是一個(gè)部門組織樹,頂級(jí)節(jié)點(diǎn)下包含三個(gè)子部門,其中第一個(gè)部門下有三個(gè)員工,第三個(gè)部門下又包含了兩個(gè)子部門,另外這個(gè)部門的內(nèi)部還有三個(gè)員工。如果我們采用平面數(shù)據(jù)模型(包括Dorado5),無論通過1個(gè)還是多個(gè)Dataset都無法實(shí)現(xiàn)這樣的數(shù)據(jù)模型。而Dorado用一個(gè)DataSet就實(shí)現(xiàn)了。
我們將上圖轉(zhuǎn)換為下圖:
其中Department擁有一個(gè)自關(guān)聯(lián)關(guān)系,另外還有一個(gè)Employee的聚合關(guān)系。
如果采用立體數(shù)據(jù)模型開發(fā)的時(shí)候,如果你能很容易的將上圖快速的轉(zhuǎn)換為一顆樹形結(jié)構(gòu),將會(huì)對(duì)你的開發(fā)帶來很多好處:更快速的設(shè)計(jì)和開發(fā)。
問題1: 如何對(duì)模型中的數(shù)據(jù)實(shí)體進(jìn)行進(jìn)一步的描述?
例如上面的部門對(duì)象,其中既有子部門又有員工集合,我們無法簡單的按照平面數(shù)據(jù)模型的那種定義方式,定義其中各個(gè)屬性的校驗(yàn)規(guī)則、數(shù)據(jù)類型、顯示格式等等。解決的辦法是我們?cè)贒orado中引入全新的概念——DataType,這個(gè)對(duì)象我們將在后面的章節(jié)詳細(xì)介紹。
問題2:如何實(shí)現(xiàn)與數(shù)據(jù)感知控件的綁定?
在平面數(shù)據(jù)模型中,數(shù)據(jù)綁定比較簡單,比如Dorado5中我們將一個(gè)Grid與一個(gè)DataSet一綁定,就可以直接展示其中的數(shù)據(jù)了,應(yīng)為其中的DataSet就是一個(gè)二維表。但是Dorado中就不能這么做了,例如我們之前的數(shù)據(jù)模型:
如果頁面上有一個(gè)Grid,用來顯示員工信息,但是上圖中我們?nèi)绾巫孏rid顯示第一個(gè)Department下的員工,或者我們要顯示第三個(gè)Department下對(duì)應(yīng)的員工。為了解決這個(gè)問題,我們需要再引入一個(gè)全新的概念——DataPath,后續(xù)章節(jié)將詳細(xì)介紹。
問題3:如何對(duì)管理當(dāng)前記錄?
在Dorao5中每一個(gè)Grid都有當(dāng)前記錄的概念,但是在Dorado中由于采用立體數(shù)據(jù)結(jié)構(gòu),如上面的組織結(jié)構(gòu)圖中的第三個(gè)部門中,相對(duì)部門來說當(dāng)前部門是指紅色框中的部門,而當(dāng)前員工是指下面紅框中的員工。從這兒我們能看出在Dorado中當(dāng)前記錄的概念已經(jīng)比Dorado5中更為豐富,一個(gè)DataSet擁有多個(gè)當(dāng)前記錄,其中的每一個(gè)集合都需要管理各自的當(dāng)前記錄。
更多建議: