榆树中的不透明类型是什么?为什么它有价值?

时间:2016-11-24 20:55:20

标签: elm

之前我使用过类型,但不知道opaque类型是什么。我也看过它。暴露opaque类型比使用类型别名更好吗?

1 个答案:

答案 0 :(得分:15)

让我们首先看一下类型别名来回答这个问题:

类型别名是完全透明的。这意味着导入它的任何其他模块都可以完全访问其内部工作。假设我们有一个User模块,显示User类型:

module User exposing User

type alias User =
    { userName : String
    , age : Int
    }

导入User的任何人都可以操纵数据,例如newUser = { oldUser | age = 25 }。或者做someUser = User "Bill" 27。当您控制它们存在的上下文时,这些操作就可以了。

但是,如果User是库的一部分,那么对User类型的每次更改都是对使用该库的人的重大更改。例如,如果将email字段添加到User,则构造函数示例(someUser = User "Bill" 27)将给出编译器错误。

即使在项目代码库内部,类型别名也可以向其他模块提供过多信息,从而导致代码难以维护和发展。也许User在某些时候会发生巨大变化,并且拥有一组全新的属性。这需要在代码操作User的任何地方进行更改。

不透明类型很有价值,因为它们避免了这些问题。这是User的不透明版本:

module User exposing User

type User =
    User
        { userName : String
        , age : Int
        }

使用此版本,其他模块无法直接访问或操作数据。通常,这意味着您将制作并公开一些吸气剂和功能:

initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User

这是更多的工作,但它有优势:

  • 其他模块只关心User函数,不需要知道类型中的数据
  • 可以在不破坏包含模块之外的代码的情况下更新类型

大部分解释来自@wintveltelmlang.slack.com