VO,BO,PO,DO,DTO的区别
面對這個圖,讓我們先從承上啟下的DTO開始入手
DTO(Data Transfer Object)數據傳輸對象
這個傳輸通常指的前后端之間的傳輸
DTO是一個比較特殊的對象,他有兩種存在形式:
在后端,他的存在形式是java對象,也就是在controller里面定義的那個東東,通常在后端不需要關心怎么從json轉成java對象的,這個都是由一些成熟的框架幫你完成啦,比如spring框架
在前端,他的存在形式通常是js里面的對象(也可以簡單理解成json),也就是通過ajax請求的那個數據體
這也是為什么把他畫成橫跨兩層的原因
這里可能會遇到個問題,現在微服務盛行,服務和服務之間調用的傳輸對象能叫DTO嗎?
我的理解是看情況
DTO本身的一個隱含的意義是要能夠完整的表達一個業務模塊的輸出
如果服務和服務之間相對獨立,那就可以叫DTO
如果服務和服務之間不獨立,每個都不是一個完整的業務模塊,拆開可能僅僅是因為計算復雜度或者性能的問題,那這就不能夠叫做DTO,只能是BO
VO(Value Object)值對象
VO就是展示用的數據,不管展示方式是網頁,還是客戶端,還是APP,只要是這個東西是讓人看到的,這就叫VO
VO主要的存在形式就是js里面的對象(也可以簡單理解成json)
VO和DTO的區別
主要有兩個區別
一個是字段不一樣,VO根據需要會刪減一些字段
另一個是值不一樣,VO會根據需要對DTO中的值進行展示業務的解釋
舉個簡單的例子
DTO可能是這樣的
對于業務一來說只需要性別,而且因為是一個古風聊天室,也不能直接展示男,因此經過業務解釋業務一的VO是
{ "gender":"公子" }對于業務二來說只需要年齡,而且不需要精確的年齡,因此經過業務解釋業務二的VO是
{ "age":"30~39" }PO(Persistant Object)持久對象
PO比較好理解
簡單說PO就是數據庫中的記錄,一個PO的數據結構對應著庫中表的結構,表中的一條記錄就是一個PO對象
通常PO里面除了get,set之外沒有別的方法
對于PO來說,數量是相對固定的,一定不會超過數據庫表的數量
等同于Entity,這倆概念是一致的
BO(Business Object)業務對象
BO就是PO的組合
簡單的例子比如說PO是一條交易記錄,BO是一個人全部的交易記錄集合對象
復雜點兒的例子PO1是交易記錄,PO2是登錄記錄,PO3是商品瀏覽記錄,PO4是添加購物車記錄,PO5是搜索記錄,BO是個人網站行為對象
BO是一個業務對象,一類業務就會對應一個BO,數量上沒有限制,而且BO會有很多業務操作,也就是說除了get,set方法以外,BO會有很多針對自身數據進行計算的方法
為什么BO也畫成橫跨兩層呢?原因是現在很多持久層框架自身就提供了數據組合的功能,因此BO有可能是在業務層由業務來拼裝PO而成,也有可能是在數據庫訪問層由框架直接生成
很多情況下為了追求查詢的效率,框架跳過PO直接生成BO的情況非常普遍,PO只是用來增刪改使用
BO和DTO的區別
這兩個的區別主要是就是字段的刪減
BO對內,為了進行業務計算需要輔助數據,或者是一個業務有多個對外的接口,BO可能會含有很多接口對外所不需要的數據,因此DTO需要在BO的基礎上,只要自己需要的數據,然后對外提供
在這個關系上,通常不會有數據內容的變化,內容變化要么在BO內部業務計算的時候完成,要么在解釋VO的時候完成
OK,到這里這些關系基本就理清楚了
等等,DO是什么
DO呢,標題不是還有個DO么?
上面這些概念基本上已經涵蓋了全部的流程,DO只是跟其中一個概念相同
但是跟哪個概念相同呢?
現在主要有兩個版本
一個是阿里巴巴的開發手冊中的定義
DO( Data Object)這個等同于上面的PO
另一個是在DDD(Domain-Driven Design)領域驅動設計中
DO(Domain Object)這個等同于上面的BO
最后,讓我們再說說實際應用
這幾個概念很完整,我們在用的時候是必須按這個來做嗎?
當然不是的,系統和系統的復雜度不同,協作水平不同,完全沒有必要教條主義,這些概念全上
上哪些概念,省哪些,我給一些實際建議
1,PO這個沒法省,不管叫PO還是Entity,怎么著都得有
2,一些工具類的系統和一些業務不是很復雜的系統DTO是可以和BO合并成一個,當業務擴展的時候注意拆分就行
3,VO是可以第一個優化掉的,展示業務不復雜的可以壓根兒不要,直接用DTO
4,這也是最重要的一條,概念是給人用的,多人協作的時候一定要保證大家的概念一致,趕緊把這篇文章轉發給跟你協作的人吧
?
總結
以上是生活随笔為你收集整理的VO,BO,PO,DO,DTO的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows+PHP+shell_ex
- 下一篇: IceSword偏门功能介绍