我以前使用过类型,但不知道不透明类型是什么。我也看到它也被提及。公开不透明类型比类别别名更好?什么是榆树中的不透明类型,为什么它很有价值?
9
A
回答
13
让我们首先看类型别名回答这个问题:
类型别名是完全透明的。这意味着任何其他导入它的模块都可以完全访问其内部工作。比方说,我们已经有了一个User
模块露出User
类型:
module User exposing User
type alias User =
{ userName : String
, age : Int
}
任何人进口User
可以操纵数据,例如newUser = { oldUser | age = 25 }
。或者做someUser = User "Bill" 27
。当您控制它们存在的上下文时,这些操作很好。
但是,如果User
是库的一部分,那么对User
类型的每次更改都会对使用该库的人造成重大改变。例如,如果在User
中添加了email
字段,则构造函数示例(someUser = User "Bill" 27
)会给出编译器错误。
即使在项目代码库的内部,类型别名也可以向其他模块提供太多信息,从而导致难以维护和发展的代码。在某些时候,User
可能会发生急剧变化,并具有一组全新的属性。无论代码如何处理User
s,都需要进行更改。
不透明类型是有价值的,因为它们可以避免这些问题。下面是User
不透明版本:
module User exposing User
type User =
User
{ userName : String
, age : Int
}
在这个版本中,其他模块不能直接访问或操纵数据。通常情况下,这意味着你将和揭露一些getter和功能:
initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User
这是更多的工作,但它的优点:
- 其它模块只关心
User
功能,不需要知道的是在类型 - 类型可以不破坏模块包含
之外的代码更新哪些数据210
这在很大程度上解释来自@wintvelt:elmlang.slack.com
相关问题
- 1. 为什么榆树不使用括号?
- 2. 什么类型的价值?
- 3. 什么是“不透明”键?
- 4. 该类型的价值是什么?
- 5. 什么是内在价值类型?
- 6. 为什么singletone类的价值是零?
- 7. 榆树不推断没有什么值正确
- 8. 术语“不透明类型”在“CFBundleRef不透明类型”的上下文中是什么意思?
- 9. C#中透明类或透明方法是什么?
- 10. 什么是不透明的字段?
- 11. 什么是价值?
- 12. 什么是python中的类,它做什么,它为什么需要它?
- 13. Rails模型中自我的价值是什么?为什么不提供明显的实例方法?
- 14. 什么是WidgetProvider的appWidgetIds []?为什么总是得到它的价值0?
- 15. Java 7中“非不透明值”的含义是什么?
- 16. 需要透明类型的好处和情况是什么?
- 17. 榆树中的翻译模式是什么?
- 18. CLOUDAMQP_URL的价值是什么?
- 19. HSHELL_FLASH的价值是什么?
- 20. 'this'的价值是什么?
- 21. 'this'的价值是什么?
- 22. 1e100f的价值是什么?
- 23. TAG的价值是什么?
- 24. 这些数字是什么,它们的类型是什么?
- 25. 什么是.do文件?它的MIME类型是什么?
- 26. System.Drawing.Point是一个值类型。为什么?
- 27. 什么是WebIDL和(为什么)它很重要?
- 28. 什么是分片,为什么它很重要?
- 29. os.environ的类型是什么?为什么它不支持视图键方法
- 30. 为什么字面值没有类型?
下面是库的作者和包约值一些更多的讨论:http://package.elm-lang.org/help/design-guidelines#keep-tags -and-record-constructors-secret – Nathan
感谢分享这个解释。因为它的大约一半是我早些时候在Slack([这里](https://elmlang.slack.com/archives/design-patterns/p1480011953000265))上发布的答案的确切副本,所以提及或链接应该是不错。 – wintvelt
嘿@wintvelt:对不起!我认为这是一个非常好的答案,有助于生活在更加持久的地方。我为您的SO帐户添加了一个参考。也许一个SO MOD可以将你添加为作者? – Nathan