Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念 PO(persistant object) 持久對象
在 o/r 映射的時候出現的概念,如果沒有 o/r 映射,沒有這個概念存在了。通常對應資料模型 ( 資料庫 ), 本身還有部分商務邏輯的處理。可以看成是與資料庫中的表相映射的 java 對象。最簡單的 PO 就是對應資料庫中某個表中的一條記錄,多個記錄可以用 PO 的集合。 PO 中應該不包含任何對資料庫的操作。 DO(Domain Object)領域對象
就是從現實世界中抽象出來的有形或無形的業務實體。一般和資料中的表結構對應。 TO(Transfer Object) ,資料轉送對象
在應用程式不同 tie( 關係 ) 之間傳輸的對象 DTO(Data Transfer Object)資料轉送對象
這個概念來源於J2EE的設計模式,原來的目的是為了EJB的分布式應用提供粗粒度的資料實體,以減少分布式調用的次數,從而提高分布式調用的效能和降低網路負載,但在這裡,我泛指用於展示層與服務層之間的資料轉送對象。 VO(view object) 值對象
視圖對象,用於展示層,它的作用是把某個指定頁面(或組件)的所有資料封裝起來。 BO(business object) 業務對象
從業務模型的角度看 , 見 UML 元件領域模型中的領域對象。封裝商務邏輯的 java 對象 , 通過調用 DAO 方法 , 結合 PO,VO 進行業務操作。 business object: 業務對象 主要作用是把商務邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。 比如一個簡曆,有教育經曆、工作經曆、社會關係等等。 我們可以把教育經曆對應一個 PO ,工作經曆對應一個 PO ,社會關係對應一個 PO 。 建立一個對應簡曆的 BO 對象處理簡曆,每個 BO 包含這些 PO 。 這樣處理商務邏輯時,我們就可以針對 BO 去處理。 POJO(plain ordinary java object) 簡單無規則 java 對象
純的傳統意義的 java 對象。就是說在一些 Object/Relation Mapping 工具中,能夠做到維護資料庫表記錄的 persisent object 完全是一個符合 Java Bean 規範的純 Java 對象,沒有增加別的屬性和方法。我的理解就是最基本的 Java Bean ,只有屬性欄位及 setter 和 getter 方法。。 DAO(data access object) Data Access Objects
是一個 sun 的一個標準 j2ee 設計模式, 這個模式中有個介面就是 DAO ,它負持久層的操作。為業務層提供介面。此對象用於訪問資料庫。通常和 PO 結合使用, DAO 中包含了各種資料庫的操作方法。通過它的方法 , 結合 PO 對資料庫進行相關的操作。夾在商務邏輯與資料庫資源中間。配合 VO, 提供資料庫的 CRUD 操作
一、 編程規約
(一)命名風格
1. 【強制】 代碼中的命名均不能以底線或貨幣符號開始,也不能以底線或貨幣符號結束。
反例: _name / __name / $name / name_ / name$ / name__
2. 【強制】 代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
說明: 正確的英文拼字和文法可以讓閱讀者易於理解,避免歧義。注意,即使純拼音命名方式
也要避免採用。
正例: alibaba / taobao / youku / hangzhou 等國際通用的名稱, 可視同英文。
反例: DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變數 = 3
3. 【強制】類名使用 UpperCamelCase 風格,但以下情形例外: DO / BO / DTO / VO / AO /
PO 等。
正例: MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例: macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
4. 【強制】方法名、參數名、成員變數、局部變數都統一使用 lowerCamelCase 風格,必須遵從
駝峰形式。
正例: localValue / getHttpMessage() / inputUserId
5. 【強制】常量命名全部大寫,單詞間用底線隔開,力求語義表達完整清楚,不要嫌名字長。
正例: MAX_STOCK_COUNT
反例: MAX_COUNT
6. 【強制】抽象類別命名使用 Abstract 或 Base 開頭; 異常類命名使用 Exception 結尾; 測試類別
命名以它要測試的類名開始,以 Test 結尾。
7. 【強制】類型與中括弧緊挨相連來定義數組。
正例: 定義整形數組 int[] arrayDemo;
反例: 在 main 參數中,使用 String args[]來定義。
8. 【強制】POJO 類中布爾類型的變數,都不要加 is 首碼,否則部分架構解析會引起序列化錯誤。
反例: 定義為基礎資料型別 (Elementary Data Type) Boolean isDeleted; 的屬性,它的方法也是 isDeleted(), RPC
阿里巴巴 Java 開發手冊
2/36
架構在反向解析的時候, “誤以為” 對應的屬性名稱是 deleted,導致屬性擷取不到,進而拋
出異常。
9. 【強制】包名統一使用小寫,點分隔字元之間有且僅有一個自然語義的英語單詞。包名統一使用
單數形式,但是類名如果有複數含義,類名可以使用複數形式。
正例: 應用工具類包名為 com.alibaba.ai.util、類名為 MessageUtils(此規則參考 spring
的架構結構)
10. 【強制】杜絕完全不規範的縮寫, 避免望文不知義。
反例: AbstractClass“縮寫” 命名成 AbsClass; condition“縮寫” 命名成 condi,此類隨
意縮寫嚴重降低了代碼的可閱讀性。
11. 【推薦】為了達到代碼自解釋的目標,任何自訂編程元素在命名時,使用盡量完整的單詞
組合來表達其意。
正例: 從遠程倉庫拉取代碼的類命名為 PullCodeFromRemoteRepository。
反例: 變數 int a; 的隨意命名方式。
12. 【推薦】如果模組、 介面、類、方法使用了設計模式,在命名時體現出具體模式。
說明: 將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。
正例: public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
13. 【推薦】介面類中的方法和屬性不要加任何修飾符號(public 也不要加) ,保持代碼的簡潔
性,並加上有效 Javadoc 注釋。盡量不要在介面裡定義變數,如果一定要定義變數,肯定是
與介面方法相關,並且是整個應用的基礎常量。
正例: 介面方法簽名 void f();
介面基礎常量 String COMPANY = "alibaba";
反例: 介面方法定義 public abstract void f();
說明: JDK8 中介面允許有預設實現,那麼這個 default 方法,是對所有實作類別都有價值的默
認實現。
14. 介面和實作類別的命名有兩套規則:
1) 【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務一定是介面,內部
的實作類別用 Impl 的尾碼與介面區別。
正例: CacheServiceImpl 實現 CacheService 介面。
2)【推薦】 如果是形容能力的介面名稱,取對應的形容詞為介面名(通常是–able 的形式)。
正例: AbstractTranslator 實現 Translatable。
阿里巴巴 Java 開發手冊
3/36
15.【參考】枚舉類名建議帶上 Enum 尾碼,枚舉成員名稱需要全大寫,單詞間用底線隔開。
說明: 枚舉其實就是特殊的常量類,且構造方法被預設強制是私人。
正例: 枚舉名字為 ProcessStatusEnum 的成員名稱: SUCCESS / UNKNOWN_REASON。
16.【參考】各層命名規約:
A) Service/DAO 層方法命名規約
1) 擷取單個對象的方法用 get 作首碼。
2) 擷取多個對象的方法用 list 作首碼。
3) 擷取統計值的方法用 count 作首碼。
4) 插入的方法用 save/insert 作首碼。
5) 刪除的方法用 remove/delete 作首碼。
6) 修改的方法用 update 作首碼。
B) 領域模型命名規約
1) 資料對象: xxxDO, xxx 即為資料表名。
2) 資料轉送對象: xxxDTO, xxx 為業務領域相關的名稱。
3) 展示對象: xxxVO, xxx 一般為網頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。
(二)常量定義
1. 【強制】不允許任何魔法值(即未經預先定義的常量) 直接出現在代碼中。
反例: String key = "Id#taobao_" + tradeId;
cache.put(key, value);
2. 【強制】 long 或者 Long 初始賦值時, 使用大寫的 L,不能是小寫 l,小寫容易跟數字 1 混
淆,造成誤解。
說明: Long a = 2l; 寫的是數位 21,還是 Long 型的 2?
3. 【推薦】不要使用一個常量類維護所有常量, 按常量功能進行歸類,分開維護。
說明: 大而全的常量類,非得使用尋找功能才能定位到修改的常量,不利於理解和維護。
正例: 緩衝相關常量放在類 CacheConsts 下; 系統配置相關常量放在類 ConfigConsts 下。
4. 【推薦】常量的複用層次有五層:跨應用共用常量、應用內共用常量、子工程內共用常量、包
內共用常量、類內共用常量。
1) 跨應用共用常量:放置在二方庫中,通常是 client.jar 中的 constant 目錄下。
2) 應用內共用常量:放置在一方庫中, 通常是子模組中的 constant 目錄下。
反例: 易懂變數也要統一定義成應用內共用常量,兩位攻城師在兩個類中分別定義了表示
“是”的變數:
類 A 中: public static final String YES = "yes";
阿里巴巴 Java 開發手冊
4/36
類 B 中: public static final String YES = "