代码之家  ›  专栏  ›  技术社区  ›  Abel

什么是功能设计模式的歧视联盟与受保护的创作,和公众阅读访问?

  •  4
  • Abel  · 技术社区  · 6 年前

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

    为了便于论证,假设我们用一个字符串来表示一个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方法是什么(除了用私有ctor创建类之外)?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Tomas Petricek    6 年前

    从一般意义上讲,我认为你所描述的模式是 抽象数据类型 -这不是特定F实现的名称,但它非常符合您的描述。

    引用 Programming with Abstract Data Types 由芭芭拉·里斯科夫和斯蒂芬·齐勒斯于1974年撰文:

    安 摘要 数据 类型 定义 一 班 属于 摘要 物体 哪一个 是 完全地 具有特征的 通过 这个 操作 可获得的 在 那些 物体。 这个 方法 那个 安 摘要 数据 类型 可以 是 定义 通过 定义 这个 表征 操作 对于 那个 类型。

    在您的示例中,您定义的是一个抽象数据类型 VerifiedUrl 它由三个操作来描述。操作 create (或) tryCreate )创建抽象数据类型和操作的值 get 允许您获取值。创建值的操作还捕获这样一个事实,即您只能创建 验证URL 来自有效的URL字符串。

    这个模式可能更加关注这样一个事实:您隐藏了实现细节,并且只公开了一些操作它的操作——而在您的例子中,另一个重要的事实是抽象数据类型的值满足某些属性——但是您可以将这些值视为抽象数据类型的不变量。我想不出一个更成熟的概念来捕捉这个想法。

        2
  •  2
  •   Zazaeil    6 年前

    嗯,很快:你不会隐藏你的选择。你只要确保它们足够多。您还可以为映射类型提供适当的singnature函数。

    现在,较长版本: 这里也适用于单一责任制(TM)。混凝土结合型 必须是 致力于一个具体的问题。就你的情况来说 type VerificationStamp = Verified ... | NotYetVerified | YOU_SHALL_NOT_PASS 选项。你也不隐藏他们:这没有好的理由。然后,你定义你的 verify 函数以及您希望提供给您的代码客户机的其他函数。这里是你保持正确的地方:通过把你的函数限定在一个合理的类型上;例如, 验证 一定要生的 string 而不是一个包裹在容器里;但是它会返回 VerificationStamp "myUrl" .

    推荐文章