[DAY18] Use Case 设计概念

缘起

Use Case 的职责是把业务逻辑封装,一个 Use Case 大致可以对应到一个 User Story。一开始我们对 Use Case 要怎麽设计并没有太多想法,便开始整理以前的 User Story,发现大部分都可以归纳成

取得资料 → 业务逻辑 → 储存资料

而单元测试内则是,"取得资料"对应到"建立测资",业务逻辑则是测试的重点,"储存资料"则应该被mock 或 stub 掉,因此第一版的 Use Case 设计的两个对外的 method,一个是 create, 放业务逻辑,如果业务逻辑过长则可以用 private method 封装,另一个则是 save ,放储存资料的程序或 call 第三方服务,而在测试中只测 create

这边简单用建立订单举一个例子

这时候 Boxenn DAL 的介面还没设计出来

# Use Case 大概长这样子
class CreateOrder
	def initialize(params:)	
		@params = params
	end

	def create
		# 其他逻辑 (如验证、处理参数等等)		
		@order = Order.new(params)
	end

	def save
		@order.save!
	end
end

use_case = CreateOrder.new(params: params)
use_case.create
use_case.save

这样做其实有不少缺点:

  • 外部需要 call 两个 method
  • 处理资料与储存资料不在一起,遇到需要同一个交易内的资料操作时,只能在use case外面包
  • 没有统一的回传格式
  • 例外处理需额外写

这时候我们发现了 dry-monads ,他的核心理念是 functional programing 当中的 monad。

关於 monad 的解释可以看以下资料

https://ithelp.ithome.com.tw/upload/images/20211002/20108265ltkoolWh6S.png

那这样做的好处是:

  • 对外只有唯一的 method 可以 call
  • 能处理错误 (可以在每一步定义)
  • 容易阅读
  • 有了 Boxenn DAL 的辅助後,容易测试,也可以走 TDD

到此,我们的 Use Case 介面便有了雏形。
下一篇将会介绍 Boxenn::UseCase 的实作细节,以及如何使用。


<<:  卡夫卡的藏书阁【Book19】- Kafka - KafkaJS 消费者 1

>>:  不只懂 Vue 语法:试解释如何使用导航守卫?

【DAY 11】SharePoint 後记- 为什麽要选择 SharePoint?

哈罗大家好~ 关於 SharePoint 的应用,到昨天告一段落,回顾一下你可能会觉得,文件库、清单...

[进阶指南] Fragments( Day23 )

React 其中一种常见的使用情况是在一个 component 中回传多个 element,fra...

Day3 建立React环境

这次来介绍两个方式在专案里设置使用React吧! 本系列文章使用的环境系统为 电脑系统:macOS ...

D22/ 怎麽在 Compose 中用 Material Theme? - Theme

今天大概会聊到的范围 Theme 透过 Android Studio 内建的精灵建立一个新的 Co...

Day30. Model 与关联 - preload, join, includes 一次厘清

今天我们会用部落格跟使用者的关系来讲解关联,首先先做设定,部落格跟使用者的关系为 使用者对应多个部落...