網傳一張圖
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的時候完成
DO是什麼
一個是阿里巴巴的開發手冊中的定義:DO( Data Object)這個等同於上面的PO
另一個是在DDD(Domain-Driven Design)領域驅動設計中,DO(Domain Object)這個等同於上面的BO
我們的規範
開發規範
0、上面的 DO 只是一個概念,並不是說把類名後面加上“DO”
1、返回前端:ResultVO
2、返回微服務:DTO
3、所有的實體統一放在模塊 Common 下,Client 實體(VO/DTO)需要獨立一份出來;Common 模塊下需要創建 domain,然後 domain 下創建各種 POJO 包,然後每個 POJO 包 下先創建業務子包,然後開始創建 POJO 類
Ps:如果遇到公共類(如:ResultVO)放到 domain.vo 下。
4、所有泛型該加的需要加上
5、魔法值:只有一個類用到提出到當前類上面;多個類用到提出到 Const 常量類
6、註釋:類、接口、方法、代碼、字段
7、常用的 DEBUG 代碼提示被刪可以寫到單元測試裏
8、最簡單的 CRUD 也需要按照這領域模型規範來
9、Client 類只有接口和DTO,其餘工具、常量等類抽象到一個公共項目,並且每次提交新變化需要改版本
10、公共異常封裝:第一項公共異常拋出,剩餘具體業務分析後拋出
11、響應碼封裝(6位,前3位類型碼,後3位業務碼)
12、方法名儘可能不要縮寫,By多的時候可以用實體類
13、數據庫表名:t_項目/模塊名_po名(儘量不縮寫)
14、必要日誌打印:INFO:無論如何都要打印,DEBUG:排查問題打印。(微服務出入必須打印)
15、Controller 不允許有私有方法,統一挪到 Service 處理
16、代碼必須符合 Alibaba & Sonarqube 規範