目前領域邏輯的組織模式分為三種,“事務腳本”,“領域模型” 以及 “表模塊”。

事務腳本類似於面向過程編程,事務腳本有以下優點:

  • 它是一種大多數軟件工程師都能理解的簡單過程模型。
  • 它能和一個行數據入口或表數據入口簡單的數據源很好的協作。
  • 非常容易設定事務的邊界。

一個組數據源操作便是一個獨立的事務腳本。 當然事務腳本也存在很大的缺陷,當領域邏輯開始變得複雜時,這些缺點就開始暴露出來。 當幾個事務要執行類似的邏輯時,通常幾個腳本中會含有某些相同的代碼。 通過將這些代碼提取出來,來形成公共的子例程,來消除這種情況。 但是,很多時候消除副本會變得棘手,而檢測副本則更困難,倒是消除副本後的程序反而比以前還要雜亂無章,難以維護。

複雜的領域邏輯,必然要引入對象,解決前面描述問題的面向對象方法就是領域模型。 一個內容管理系統會有用戶,文章等類,進行鑑權,以及寫入等邏輯均置於領域模型中。 因此,發佈對象調用一次寫入方法。 可能還會有其他例程來完成一些讀取功能,但它其實都是調用領域模型中已有打方法實現的。

領域模型的控制不再是由一個過程來控制用戶某一個動作的邏輯,而是由每個對象都承擔一部分相關邏輯。

領域模型的開銷來自於數據源的複雜度和使用上的複雜性,剛剛接觸領域模型的人會需要時間來適應這種思維方式。一旦習慣了,你就會很爽! 另一方面你需要將數據源映射到領域模型上,數據源越是複雜,領域模型的效果就越是顯著。

上為事務腳本

上為領域模型

第三中為領域邏輯的組織模式為表模塊,它處於事務腳本領域模型的一箇中間地帶。 和領域模型最大的區別就是在表模塊中一個表只對應一個實例,而領域模型一行數據便能對應一個實例。

表模塊的優點在於可以很容易的和軟件架構中已經存在的部分銜接,很多GUI應用都是假定將其與SQL查詢結果的記錄集結果協同工作的。表模塊就工作在記錄集之上。你可以很容易的使用。

抉擇

別問,問就,直接使用領域模型。

接下來我稍微介紹一下目前各個框架/庫在領域邏輯的組織模式上的選擇(只列出我用):

  • PHP

    • PHP 原生 <事務腳本>
    • ThinkPHP <領域模型>
    • Laravel <領域模型>
    • YII <領域模型>
  • Java

    • java.sql.* <事務腳本>
    • MyBatis <表模塊>
    • JPA <領域模型>
  • Go

    • gorm <表模塊 | 領域模型> (這個比較神奇)

現在用表模塊的人普遍比較多,我曾遇到好幾個J2EE工程師都並不喜歡JPA的思維模式。