gpt4 book ai didi

design-patterns - 具有 protected 创建和公共(public)读取访问权限的可区分联合的功能设计模式是什么?

转载 作者:行者123 更新时间:2023-12-05 00:46:19 26 4
gpt4 key购买 nike

可区分联合通常用作数据持有者并提供有关它们所持有内容的信息,但有时我发现自己需要防止创建可区分联合,但仍然能够使用熟悉的语法对其进行模式匹配。

为了论证,假设我们用一个字符串表示一个 URI,但我想创建一个具有保证验证 URI 的类型(即,它根据 RFC 是有效的),它也是一个字符串。仅使用 Some/None 在这里不起作用,因为我仍然想访问任何无效字符串。此外,我喜欢对当前代码库进行温和的重构体验(在多行代码上用新的单例联合替换现有的单例联合比使用多案例联合要容易得多)。

我可以按如下方式解决这个问题,我认为这表明了我打算做什么(为简单起见,省略了错误情况):

[<AutoOpen>]
module VerifiedUriModule =
module VerifiedUri =
type VerifiedUri =
private
| VerifiedUri of string

let create uri = VerifiedUri uri // validation and error cases go here

let tryCreate uri = Some <| VerifiedUri uri // or here

let get (VerifiedUri uri) = uri

let (|VerifiedUri|) x =
VerifiedUri.get x
AutoOpen 的额外级别只是允许使用主动识别器的不合格访问。

我最终可能会使用典型的 Result类型,但我想知道这是否是典型的编码实践,或者每当我发现自己在做这样的事情时,我是否应该在脑海中听到一个声音说“回滚,回滚!”,因为我违反了经典的函数式编程原则(我是吗?)。

我意识到这是一种信息隐藏的情况,它看起来很像用数据模仿 OO 类行为。典型的 F#'ish 方法是什么(除了创建具有私有(private) ctor 的类)?

编辑 2019-12-10:本期 is now being discussed for inclusion in F#作为语言特征。如果您认为它应该在 :) 中,请投票。

最佳答案

在相当普遍的意义上,我认为您描述的模式是抽象数据类型 - 这不是特定 F# 实现的名称,但它非常适合您的描述。

报价 Programming with Abstract Data Types Barbara Liskov 和 Stephen Zilles 于 1974 年:

An abstract data type defines a class of abstract objects which is completely characterized by the operations available on those objects. This means that an abstract data type can be defined by defining the characterizing operations for that type.



在您的示例中,您正在定义一个抽象数据类型 VerifiedUrl这由三个操作来描述。操作 create (或 tryCreate )创建抽象数据类型的值和操作 get让你获得值(value)。创建值的操作也捕捉到您只能创建 VerifiedUrl 的事实。来自有效的 URL 字符串。

这种模式可能更关注这样一个事实,即您隐藏了实现细节并仅公开某些操作来操作它 - 而在您的情况下,另一个重要事实是抽象数据类型的值满足某些属性 - 但您可以将它们视为关于抽象数据类型的不变量。我想不出一个更好的概念来捕捉这个想法。

关于design-patterns - 具有 protected 创建和公共(public)读取访问权限的可区分联合的功能设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54428850/

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