ABSTRACT
目前的三層架構的系統(tǒng)開發(fā)继薛,在不同的層都會定義不同的對象修壕。雖然各個層次中的對象信息都差不多,但還是得分層區(qū)別對待遏考。因此慈鸠,有必要研究一下三層架構下各層對象之間的具體差異,以便日后開發(fā)能夠?qū)ο到y(tǒng)架構理解更深刻灌具。
INTRODUCTION
首先給出四個對象的全稱[1]:
VO【View Object】 視圖對象-用于展示層青团,將某個指定的頁面(或者組建)封裝起來。
DTO【Data Transfer Object】數(shù)據(jù)傳輸對象-泛指視圖層和服務層之間的數(shù)據(jù)傳輸對象咖楣。
DO【Domain Object】領域?qū)ο?現(xiàn)實生活中抽象出來的有形的或無形的業(yè)務實體督笆。
PO【Persistent Object】持久化對象-跟持久層【通常是關系型數(shù)據(jù)庫】形成一一映射的關系,如果持久層是關系型數(shù)據(jù)庫截歉,那么數(shù)據(jù)庫表中的每個字段則對應PO中的每個屬性胖腾。
四個對象之間的在三層架構中的交互時序圖如圖1所示:
領域模型中的實體類分為四種類型:VO、DTO、DO咸作、PO锨阿,各種實體類用于不同業(yè)務層次間的交互,并會在層次內(nèi)實現(xiàn)實體類之間的轉化记罚。
業(yè)務分層為:視圖層(VIEW+ACTION)墅诡,服務層(SERVICE),持久層(DAO) [2]
ANALYSIS
各個對象之間的關系和異同分析:
1.VO和DTO
DTO為數(shù)據(jù)傳輸對象桐智,既然是放在網(wǎng)絡中傳輸?shù)哪┰纾虼耍搶ο蟊厝徊荒芴纺[说庭,否則信息太多必然會影響數(shù)據(jù)傳輸然磷。而VO作為視圖層的視圖對象,應前端要求刊驴,同時為了滿足用戶對豐富度的要求姿搜,會存放很多信息進行展示,使得產(chǎn)品豐富化捆憎。因此VO和DTO一般情況下會使用兩個有點差別的對象舅柜,但信息基本一致,DTO就是根據(jù)VO構造的躲惰,他們都是POJO致份。
對于設計層面來說,概念上還是應該存在VO和DTO础拨,因為兩者有著本質(zhì)的區(qū)別氮块,DTO代表服務層需要接收的數(shù)據(jù)和返回的數(shù)據(jù),而VO代表展示層需要顯示的數(shù)據(jù)诡宗。表現(xiàn)層可以根據(jù)需求進行調(diào)整雇锡,但是DTO傳回來的數(shù)據(jù)是一致的,具體的展示邏輯是從VO的字段定義中決定的僚焦。從職責單一原則來看锰提,服務層只負責業(yè)務,與具體的表現(xiàn)形式無關芳悲,因此立肘,它返回的DTO,不應該出現(xiàn)與表現(xiàn)形式的耦合名扛。
2. DTO和DO
首先是概念上的區(qū)別谅年,DTO是展示層和服務層之間的數(shù)據(jù)傳輸對象(可以認為是兩者之間的協(xié)議),而DO是對現(xiàn)實世界各種業(yè)務角色的抽象肮韧,這就引出了兩者在數(shù)據(jù)上的區(qū)別融蹂。
例如UserInfo和User旺订,前者是DTO中的對象,而后者是DO中的對象超燃。對于一個getUser方法來說区拳,本質(zhì)上它永遠不應該返回用戶的密碼,因此UserInfo至少比User少一個password的數(shù)據(jù)意乓。而在領域驅(qū)動設計中樱调,DO不是簡單的POJO,它具有領域業(yè)務邏輯[1]届良。
從數(shù)學維度看笆凌,DTO和DO更像多對多的映射關系。一個DTO中可能包含多個DO中的屬性士葫,同時一個DO可能對應多個DTO乞而。
從業(yè)務分層角度來說,DO中可能有一些不想讓展示層知曉的屬性慢显,同時DO中也可能包含一些不能讓展示層直接調(diào)用的方法晦闰。
3. DO和PO
DO和PO在絕大部分情況下是一一對應的,PO是只含有get/set方法的POJO鳍怨,但某些場景還是能反映出兩者在概念上存在本質(zhì)的區(qū)別:
DO在某些場景下不需要進行顯式的持久化,例如利用策略模式設計的商品折扣策略跪妥,會衍生出折扣策略的接口和不同折扣策略實現(xiàn)類鞋喇,這些折扣策略實現(xiàn)類可以算是DO,但它們只駐留在靜態(tài)內(nèi)存眉撵,不需要持久化到持久層侦香,因此,這類DO是不存在對應的PO的纽疟。
同樣的道理罐韩,某些場景下,PO也沒有對應的DO污朽,例如老師Teacher和學生Student存在多對多的關系散吵,在關系數(shù)據(jù)庫中,這種關系需要表現(xiàn)為一個中間表蟆肆,也就對應有一個TeacherAndStudentPO的PO矾睦,但這個PO在業(yè)務領域沒有任何現(xiàn)實的意義,它完全不能與任何DO對應上炎功。這里要特別聲明枚冗,并不是所有多對多關系都沒有業(yè)務含義,這跟具體業(yè)務場景有關蛇损,例如:兩個PO之間的關系會影響具體業(yè)務赁温,并且這種關系存在多種類型坛怪,那么這種多對多關系也應該表現(xiàn)為一個DO,又如:“角色”與“資源”之間存在多對多關系股囊,而這種關系很明顯會表現(xiàn)為一個DO——“權限”袜匿。
REFERENCE
[1]. 隨風而逝,只是飄零.淺析VO、DTO毁涉、DO沉帮、PO的概念、區(qū)別和用處[EB/OL].https://www.cnblogs.com/zxf330301/p/6534643.html
[2]. wangxin0314.實體類(VO贫堰,DO穆壕,DTO)的劃分[EB/OL].https://blog.csdn.net/wangxin1982314/article/details/51954264.
[3].用戶1418372.第一節(jié) DDD領域驅(qū)動概述[EB/OL].https://cloud.tencent.com/developer/article/1336541