這篇文章接下來我們要談談《 企業應用架構模式- Martin Fowler 》這本書中所提 domain 的三種 patterns 的第三種『 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 代表一筆資料。
然後我簡單重點整理一下 :
然後和前一篇的 domain model 比較如下 :
下面範例為一個簡單的購物車結帳,然後總共有三個步驟 :
我覺得重點就是一個 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 只要一個 class,而 Table Module 可能要 n 個。
我們公司好像現在還不少這種類型的,以資料表為主所建立的 class。