我以前使用過類型,但不知道不透明類型是什麼。我也看到它也被提及。公開不透明類型比類別別名更好?什麼是榆樹中的不透明類型,爲什麼它很有價值?
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