30-13 之 Domain Layer - Table Module

这篇文章接下来我们要谈谈《 企业应用架构模式- 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。

参考资料


<<:  [Day28] BERT(一)

>>:  [day13] 快速建构JSON Server

[职场]新工程师报到,如何协助他成为有效战力

我一定要把你带好,如果我不把你拉上来,那谁把我推上去。 每间公司在新人教育训练上,愿意投资的资源落...

[day-19] 认识Python的资料结构!(Part .6)

再熟悉不过的字串,也算是资料结构?   我们常常使用的字串,也算是一种有顺序关系的「序列容器」,因此...

Day30 专案的结束以及新的开始

在 Day25 要求的功能,还剩下一个还没完成 不过实际上并没有推荐前10部影片的必要性 作为最後一...

Day 18:Kotlin 过滤(filter)集合资料用法

本篇文章同步发表在 HKT 线上教室 部落格,线上影音教学课程已上架至 Udemy 和 Youtu...

【资料结构】读档相关 12/18更

二维阵列的一维读入法 #include <math.h> #include <st...