gpt4 book ai didi

f# - F# 中类型的静态成员与模块?

转载 作者:行者123 更新时间:2023-12-04 01:10:00 25 4
gpt4 key购买 nike

假设我有这样的类型:

type Season =
| Spring
| Summer
| Autumn
| Winter

我想要一个函数 next返回下个赛季:
let next s = 
match s with
| Spring -> Summer
| Summer -> Autumn
| Autumn -> Winter
| Winter -> Spring

有两个地方我可以放这个函数。

在命名模块中:
module Season = 
let next s =
match s with
| Spring -> Summer
| Summer -> Autumn
| Autumn -> Winter
| Winter -> Spring

或者作为类型的静态成员:
type Season =
| Spring
| Summer
| Autumn
| Winter
with
static member next s =
match s with
| Spring -> Summer
| Summer -> Autumn
| Autumn -> Winter
| Winter -> Spring

支持每种方法的原因是什么?

最佳答案

最终,这是一个领域建模判断调用,这里没有一个明确的正确答案。重要的是每个选择如何影响代码的可读性和可维护性。

我倾向于使用与类型高度“内聚”的功能的静态成员,而不是任何特定的业务逻辑代码。想想Parse函数或智能构造函数/工厂方法。一般的方法是,如果我通过将类型移动到其他地方来重构代码,那么我肯定会希望将这些函数与它一起移动。将它们作为静态成员还有助于通过智能感知进行发现,因为您只需要知道类型的名称即可找到它们。

另一方面,我会使用一个模块来容纳代表一些抽象流程的业务逻辑,如果所讨论的功能在某种程度上特定于该业务逻辑并且不太可能在它之外有用,那么我会选择模块中的函数,即使它仍然是特定于类型的。例如,一个非常特定于目的的解析器,由于遗留原因仅作为这个工作流的一部分有用,它将是一个 let-bound 函数而不是一个静态成员,因为使用该类型的其他客户端通常甚至不应该知道该函数.

在你的情况下,我会选择静态成员 Next如果它在您的上下文中用于多个不同的模块有意义 - 如果能够循环通过 Seasons是一种基本品质,它定义了 Season是。

否则,如果您只有一个模块,假设 WeatherPatterns ,它会根据季节变化调整降雨量,这是您代码中唯一关心在 Seasons 中循环的部分,然后我将它作为该模块中的一个函数。

关于f# - F# 中类型的静态成员与模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53979464/

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