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