作為後端最常用的程式語言之一,Java 已經有很多年的歷史了,在阿里內部,Java 也是使用最廣泛的一門語言。在阿里實習的這段時間,規範一詞是我感受最深的。沒有規矩不成方圓,今天來說一下 Java 中的各種 O(bject)。

為什麼會出現這些 O?

我們知道,這些 O 不管叫什麼名字,其本質都還是物件(Object),既然本質都一樣,為什麼非要給他們套上各種馬甲? 個人認為原因有三: 第一,隨著程式設計工業化的發展,需要有一套合理的體系出現。中國人喜歡造神,外國人喜歡造概念,於是 MVC、MVP、MVVM 等程式設計模型就出現了,為了搭配這些程式設計模型的使用,需要對 Object 的功能進行劃分,於是我們便看到了這些層出不窮的 Object。當然這裡並沒有批評這些概念的意思。 其二,我認為在團隊協作編碼中,一個好的命名方式是可以節約很多時間成本的。就比如

getItemById

一眼看去就知道是透過 id 獲取一個 item 物件,

ItemVO

一眼看去就知道是前端透出的 json 對應的物件。 其三,如此劃分,可以讓專案結構更加清楚,不至於出現東一塊西一塊,物件亂扔的局面。儘可能避免了在多人協作時物件混亂的情況。 總的來說,這一切都是為了讓軟體程式設計更加合理、更加規範、更加高效。

有哪些 O?

這些 O 有很多衍生出的命名,比如 VO、DO、BO,這裡我們把常見的 O 列舉出來,然後一一解釋。

以下內容參考阿里巴巴 Java 開發手冊,如果有需要可以在微信公眾號「01 二進位制」後臺回覆「Java 開發手冊」獲得。

DO( Data Object):與資料庫表結構一一對應,透過 DAO 層向上傳輸資料來源物件。

PO(Persistant Object):持久物件,一個 PO 的資料結構對應著庫中表的結構,表中的一條記錄就是一個 PO 物件

DTO( Data Transfer Object):資料傳輸物件,Service 或 Manager 向外傳輸的物件。

BO( Business Object):業務物件。 由 Service 層輸出的封裝業務邏輯的物件。

AO( Application Object):應用物件。 在 Web 層與 Service 層之間抽象的複用物件模型,極為貼近展示層,複用度不高。

VO( View Object):顯示層物件,通常是 Web 向模板渲染引擎層傳輸的物件。

POJO( Plain Ordinary Java Object):POJO 專指只有 setter/getter/toString 的簡單類,包括 DO/DTO/BO/VO 等。

DAO(Data Access Objects):資料訪問物件,和上面那些 O 不同的是,其功能是用於進行資料操作的。通常不會用於描述資料實體。

一下子給出 8 個常見的 O,光看解釋大家可能會有些迷糊,接下來我們從下面這張圖入手,帶大家直觀的感受下,這些 O 的用處。

資料的流向

DO,DTO,VO,POJO 你知道嗎?

我們知道,一般情況下,前端是不會憑空造出資料的,因此最後前端展示的資料一定是從資料庫中來的,資料的流向通常也是從資料庫流向頁面。我將其分成三個部分:資料訪問、業務處理和業務解釋。

資料訪問:這一部分是用於從資料庫中讀取資料,將資料記錄轉換成資料實體也就是 Java 物件,便於操作。

業務處理:這一部分是資料流的核心,幾乎所有資料的操作都是在這一部分完成的。

業務解釋:這一部分是用於展示給前端的資料,解釋業務體現在某些欄位/值是需要經過處理的才會呈現的。

關鍵點

說了這麼多,我們整理出以下關鍵點。

DAO,是用於

操作資料

而不是描述資料的。

PO/DO/Entity,其資料結構對應資料表中的一條記錄,因此是同一類別的。

BO,可以理解為 PO 的組合,舉個簡單的例子,假設 PO 是一條交易記錄,BO 就可以是一個人全部的交易記錄集合物件。

DTO,用於傳輸資料,可能傳遞給前端,也有可能傳遞給其他系統。用於

承載資料

VO,這個最好理解,前端最後需要的資料長什麼樣,對應的物件就是 VO。

如何使用這些 O?

說了這麼多,在實際的專案中,我們應該如何去使用這些 O?

教條主義?

首先,這幾個概念很完整,但是我們在用的時候是必須按這個來做嗎? 答案當然不是的,規矩是死的,人是活的。文章開頭我們就說了,之所以引入這些概念,很大程度上是為了提升程式設計體驗,而且系統和系統的複雜度不同,協作水平不同,完全沒有必要教條主義,適合自己的才是最好的。

省略方案

不管你是叫 PO 還是 DO 還是 Entity,用於描述資料庫記錄的物件一定要存在,不可省略。

DTO 和 BO 在一般情況下,如果業務系統不是非常複雜,可以考慮省略。

VO 和 DTO,DTO 可以用於將資料傳遞給前端,如果你不需要刪減欄位的話,VO 可以考慮省略。

注意事項

領域模型命名規約:

資料物件:xxxDO,xxx 即為資料表名。

資料傳輸物件:xxxDTO,xxx 為業務領域相關的名稱。

展示物件:xxxVO,xxx 一般為網頁名稱。

POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。

最後

以上就是本篇文章的全部內容了,如果你覺得本篇文章對你有所幫助,不妨關注支援一下。

DO,DTO,VO,POJO 你知道嗎?