gpt4 book ai didi

f# - f# 中的请求 - 响应域建模

转载 作者:行者123 更新时间:2023-12-01 05:09:59 24 4
gpt4 key购买 nike

我正在寻找使用 F# 中的函数式方法对基于请求-响应的系统进行建模的最佳实践。

通用案例要求例如:

  • 有许多请求/响应对类型:A、B、C 等
  • 每个响应必须代表两种状态:成功失败
  • 每个请求由common数据片和specific A/B/...数据片组成
  • 在处理过程中,请求可能会因常见特定 原因而被拒绝

至于现在,我最终得到以下设计:

type CommonData = {...}

type RequestMessage =
| ARequestMessage of CommonData * ARequestData
| BRequestMessage of CommonData * BRequestData
...

type Response<'S, 'F> =
| Success of 'S
| Failure of 'F

type ResponseMessage =
| AResponseMessage of Response<AResponseSuccess, AResponseFailure>
| BResponseMessage of Response<BResponseSuccess, BResponseFailure>
...

其中 AResponseSuccess 和 BResponseSuccess 包含相同的区分联合案例或 ResponseMessage 类型被 GeneralResponseMessage 类型覆盖

type GeneralResponseMessage =
| CommonFailure of CommonResponseFailure
| SpecificResponse of ResponseMessage

这两种情况看起来都很糟糕,我想不出更清晰和优雅的解决方案。

编辑

系统在单一演化状态上以状态机方式处理请求,因此不可能分离不同类型的请求处理

最佳答案

这可能更适合 https://codereview.stackexchange.com/ ,但让我试着在这里回答这个问题。

我对此的看法是垂直而不是水平地对操作进行分组。我的意思是,我不是将所有请求分组为一种类型,所有响应分组为另一种类型,而是将相应的请求和响应类型配对,并为处理本身构建一个通用包装器。

在您的情况下,处理基本上是 RequestMessage -> GeneralResponseMessage 类型的函数.我建议将其概括为以下内容:

type ProcessRequest<'requestData, 'responseMessage, 'responseFailure> =
CommonData -> 'requestData ->
Result<'responseMessage, ErrorResponse<'responseFailure>>

and ErrorResponse<'responseFailure> =
| CommonFailure of CommonResponseFailure
| SpecificResponse of 'responseFailure

这里注意一下,我用的是Result来自 FSharp.Core而不是你的 Response类型,因为它们模拟完全相同的东西。

然后你可以创建一个特定的实例,例如

type AProcessRequest =
ProcessRequest<ARequestMessage, AResponseMessage, AResponseFailure>

然后这可以用来处理特定的消息。在您的情况下,处理逻辑必须匹配 RequestMessage案例并以此为基础继续,在我的例子中,你必须在调用特定处理器之前进行此匹配,但是如果你需要将它分组为一种类型,你总是可以这样做以将所有实现作为单个数据提供

type ProcessMessage =
{ A : AProcessRequest
B : BProcessRequest
C : ... }

并且您可以在组合根中提供实现。

如果你不喜欢那么多特定类型,你不必给通用处理器的具体实例命名,C : ProcessMessage<CRequestMessage, CResponseMessage, CResponseFailure>会很好,但如果有许多相似类型的实例,可读性可能会降低。

关于f# - f# 中的请求 - 响应域建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46046310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com