[DAY23] Boxenn Use Case & Validation

Boxenn::UseCase 中处理 validation?

dry-monads 中有提供 validate 的功能,他的特色是不会中断执行,而是等到所有 list 中的 validate 都执行完後再一次回传所有的 failure。

# create_order.rb
class ValidOrder < Boxenn::UseCase
	option :repo, default: -> { OrderRepository.new }

  def steps(serial_number:)
		order = retrieve_order(serial_number)
    yield List::Validated[
      valid_capacity(order),
      valid_price(order),
    ].traverse.to_result
		Success()
  end

  private

	def retrieve_order(serial_number)
		repo.find_by_identity(serial_number: serial_number)
	end

	def valid_capacity(order)
		return Invalid(:capacity_error) if order.capacity < 0

		Valid(Unit)
	end

	def valid_price(order)
		return Invalid(:price_error) if order.price < 0
		
		Valid(Unit)
	end	
end

result = ValidOrder.new.call(serial_number: 'ABC-1234567890')
# 成功
# => Success()
# 失败
# => Failure(List[:capacity_error, :price_error])

这样的特性用在参数的 validation 很方便,但会有一些问题产生:

  • 回传 List 物件(dry-monads 自定义的),而在未使用 List::Validated 的 use case 中不会特别在 failure 回传 List,使得介面不统一。
  • 因为 List::Validated 当中的 method 全部都会执行,如果其中一个 method 执行失败,後续仍会继续执行,这与原本 use case 设计理念中的 sequential 性质有些违背。
  • 上述所说的性质非常适合用在 controller 接到参数後的验证,但这个职责不应该放在 DLL(Domain Logic Layer) 处理。

下篇会来聊聊 Boxenn::UseCase 目前的 error handling ,以及遇到的阻碍。


<<:  D23 - 彭彭的课程# Python 网路连线程序、公开资料串接(1)

>>:  Day 23 - p5的WebGL应用 3D 设定

安全作业第一守则

Covid-19、Delta疫情接连来袭对各方产业都造成了一定的冲击,在如此艰难的时刻里,仍然有一些...

Day8 - 布署 GitHub 程序与串接聊天机器人 LINE Messaging API

GitHub 网址:https://github.com/ Heroku 网址:https://w...

Day20

今天来记录一个简单的概念sizeof,sizeof可以帮助计算型态, 结构体, 与阵列, 与指标的大...

Day12 - 该来写 API 了,API routes 简介

API routes Next.js 是一个全端框架,除了提供 SSR 与 SSG 的功能之外,还能...