iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
自我挑戰組

馬克的軟體架構小筆記系列 第 13

30-13 之 Domain Layer - Table Module

  • 分享至 

  • xImage
  •  

這篇文章接下來我們要談談《 企業應用架構模式- Martin Fowler 》這本書中所提 domain 的三種 patterns 的第三種『 Table Module 』。

什麼是 Table Module 呢 ?

書中的定義為 :

A Table Module organizes domain logic with one class per table in the database, and a single instance of a class contains the various procedures that will act on the data. The primary distinction with Domain Model is that, if you have many orders, a Domain Model will have one order object per order while a Table Module will have one object to handle all orders.

然後我自已的中文理解為 :

一個 class 用來表達一個 table,也就是說會在一個 class 中處理多個筆資料,而 domain model 這是一個 class 代表一筆資料。

然後我簡單重點整理一下 :

  • 一個 class 用來表達一個 table
  • 這個 class 有商業邏輯

然後和前一篇的 domain model 比較如下 :

  • 如果你的 domain 很複雜與資料表比較不一致,則使用 domain model。
  • 當如果資料表與 domain 很一致時,則可選擇使用 table module。

範例

下面範例為一個簡單的購物車結帳,然後總共有三個步驟 :

  • 取得購物車內商品
  • 根據商品產生訂單
  • 根據訂單產生付款記錄

我覺得重點就是一個 module 處理一張表內的東西

class CartTableModule{
   construct(cartDataSource){
			this.cartDataSource = cartDataSource
   }
	 getCartProducts(cartId){
				const carts = this.cartDataSource({ query: cartId })
        return carts.products
   }
}

class OrderTableModule{
   construct(orderDataSource){
      this.orderDataSource = orderDataSource
   }
   createOrder(products){
       const orderBody = _generateOrderBody(products)
       this.orderDataSource.save(orderBody)   
   }
}

class PaymentTableModule{
    construct(paymentDataSource){
      this.paymentTableModule = paymentTableModule
   }
   createPayment(order){
       this.paymentTableModule.save(order)
   }
}

// 當購物車要結帳時
const cartId = '12345'
cartTableModule = new CartTableModule(CartDataSource)
orderTableModule = new OrderTableModule(OrderDataSource)
paymentTableModule = new PaymentTableModule(PaymentDataSource)

const products = cartTableModule.getCartProducts(cartId)
const order = orderTableModule.createOrder(products)
const payment = paymentTableModule.createPayment(order)

小總結

這個知識點可以用來解釋什麼現象

這讓我想到,很多初期開發的專案,有很多一部份是先設計資料表,然後在設計 domain,然後一開始大部份都是以資料表為單位,來進行業務邏輯。

初期因為業務簡單表與業務一致,因此不會有太大的問題,但慢慢 domain 越來越複雜就會開始不適用了。

這個知識點可以和以前的什麼知識連結呢 ?

這裡我想到和 Transaction Script 的比較 :

  • Transaction Script 比較偏向,用一件一件任務完成他。
  • Table Module 以資料表為單位,來完成我們想做的。

簡單的說,要完成一件事情,Transaction Script 只要一個 class,而 Table Module 可能要 n 個。

我要如何運用這個知識點 ?

我們公司好像現在還不少這種類型的,以資料表為主所建立的 class。

參考資料


上一篇
30-12 之 Domain Layer - Domain Model ( 未完成版 )
下一篇
30-14 之 Domain Layer - Service
系列文
馬克的軟體架構小筆記29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言