前言
在閱讀《阿里巴巴Java開發手冊》時,看到命名規則中有這樣一條
雖然知道這些是根據Java對象的角色所分配名稱的后綴,但是沒有弄清楚分別是什么意思,日常開發中也沒有使用到。
網上查找了一些資料,但是感覺大多數都是一樣的,可能大家都是互相copy,篇幅過長並且不易理解。
別灰心!《阿里巴巴Java開發手冊》中對於上面這些在領域模型的命名使用上給出了規范,說的很清楚,分享給大家。
補充一個鏈接,內容是《阿里巴巴Java開發手冊紀念版》以及歷時一年推出的代碼規范插件。https://github.com/alibaba/p3c
領域模型命名規約
1.數據對象:xxxDO,xxx即為數據表名;
2.數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱;
3.展示對象:xxxVO,xxx一般為網頁的名稱;
4.POJO 是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。
個人解讀
1.如果你寫的web應用是一個CRUD的demo,那么一個DO就完全夠用。
例如,寫一個用戶的增刪改查,數據庫中有一個user表,你建立一個UserDO,類中的字段和數據庫中一致,當你需要對User操作時,就用UserDO進行數據存取。
那么問題來啦:
首先,例如user表中有一個叫做passWord的字段,保存了登錄密碼,這個字段肯定是不需要返回到頁面上的,但是如果像上面的操作,直接把UserDO的對象返回給前台,必然會帶來安全隱患;
其次,如果User中有些字段需要轉換后才能正確顯示(例如顯示中文,保存的是英文,或者保存的是關聯表中的id),直接返回UserDO就只能在頁面上用js寫if...else...來區分值,很繁瑣;
最后,如果你的頁面上顯示的數據是一個很大的結果集(調用了好幾個接口的返回結果),例如除了User信息還有Account信息,一個UserDO顯然就不夠用了;
VO的概念應運而生。
2.VO中我們寫的字段都是前台所需要的,而不是對象的所有字段值;
VO中的字段格式都是符合前台頁面顯示所需的,需要中文就顯示中文;
對於調用了好幾個接口返回的結果集,可以封裝一個VO,將所有結果整合后再返回給前端頁面。
3.有些人肯定在想,我的DO和VO中字段大多數都是相同的,有必要再寫這樣一個類嗎?
答案是有的!如果寫的是比較小的web應用,字段不多,你覺得沒有這個必要。但是如果寫的是大一些的系統,字段越多,分層的優勢就會越明顯。(博主寫的web不大,但是拿出一個類也是一百多個字段,深感頭疼)
DO和VO之間的轉換
1.兩個POJO之間的屬性值進行copy,最原始的方法就是手動復制,但是這樣就會產生大量的set,get代碼,業務邏輯才是重點好嗎?!不能喧賓奪主;
2.還有種方法就是用Spring提供的BeanUtils,博主現在的項目中用的就是這個,感覺還可以,但是也有點小問題,例如copy日期需要先注冊等;
3.使用Dozer。Dozer是一個對象轉換工具,可以在兩個JavaBean之間進行遞歸數據復制,並且這些JavaBean可以是不同的復雜的類型。有興趣的同學可以去學習下。