Tôi đã sử dụng các loại trước đây nhưng không biết loại đục là gì. Tôi đã nhìn thấy nó được đề cập là tốt. Tốt hơn là để lộ một loại đục hơn là một loại bí danh?Loại đục trong Elm là gì và tại sao nó có giá trị?
Trả lời
Hãy trả lời câu hỏi này trước tiên bằng cách xem bí danh loại:
Bí danh loại là hoàn toàn minh bạch. Điều này có nghĩa là bất kỳ mô-đun nào khác nhập khẩu nó sẽ có quyền truy cập đầy đủ vào các hoạt động bên trong của nó. Hãy nói rằng chúng tôi đã có một module User
phơi bày một loại User
:
module User exposing User
type alias User =
{ userName : String
, age : Int
}
Bất cứ ai nhập khẩu User
có thể thao tác dữ liệu, ví dụ newUser = { oldUser | age = 25 }
. Hoặc làm someUser = User "Bill" 27
. Các thao tác này là tốt khi bạn kiểm soát được ngữ cảnh mà chúng tồn tại.
Tuy nhiên, nếu User
là một phần của thư viện thì mọi thay đổi đối với loại User
là sự thay đổi đột phá đối với những người sử dụng thư viện. Ví dụ: nếu trường email
được thêm vào User
, thì ví dụ về hàm tạo (someUser = User "Bill" 27
) sẽ cung cấp lỗi trình biên dịch.
Ngay cả bên trong một codebase của dự án, một bí danh loại có thể cung cấp quá nhiều thông tin cho các mô-đun khác dẫn đến mã khó duy trì và phát triển. Có lẽ User
thay đổi đáng kể tại một số điểm và có bộ thuộc tính hoàn toàn mới. Điều này sẽ yêu cầu thay đổi bất cứ nơi nào mã thao tác User
s.
Loại đục có giá trị vì chúng tránh những vấn đề này. Dưới đây là phiên bản mờ của User
:
module User exposing User
type User =
User
{ userName : String
, age : Int
}
Với phiên bản này, các mô-đun khác không thể truy cập hoặc thao tác trực tiếp dữ liệu. Thông thường, điều này có nghĩa là bạn sẽ thực hiện và phơi bày một số phương thức getter và chức năng:
initUser : String -> Int -> User
userName : User -> String
age : User -> String
setAge : Int -> User -> User
Đây là công việc nhiều hơn, nhưng nó có ưu điểm: module
- khác chỉ quan tâm đến các
User
chức năng và không cần phải biết những gì dữ liệu trong các loại - các loại có thể được cập nhật mà không phá vỡ mã bên ngoài module chứa
Hầu hết lời giải thích này xuất phát từ @wintvelt: elmlang.slack.com
- 1. Tại sao System.Enum không phải là một loại giá trị?
- 2. Tại sao các loại giá trị không thể là rỗng
- 3. Sự khác biệt giữa giá trị (loại) và loại (giá trị) là gì?
- 4. ReverseHTTP là gì và tại sao nó lại hữu ích?
- 5. Trong Elm, tại sao đây là một loại Int-Float không phù hợp?
- 6. AudioFlinger là gì và tại sao nó thất bại TONE_PROP_ACK?
- 7. AF_INET là gì và tại sao tôi cần nó?
- 8. "Toán học chuỗi" là gì và tại sao nó xấu?
- 9. NPM là gì và tại sao tôi cần nó?
- 10. armeabi là gì và tại sao họ sử dụng nó
- 11. Giá trị "nib" và "xib" là gì?
- 12. CGSUpdateManager là gì và tại sao nó phàn nàn?
- 13. Tại sao giá trị của một lớp giá trị là hashCode của nó "không phải là một ý tưởng hay"?
- 14. Làm cách nào để lọc ra các giá trị "Không có gì" từ Elm Array?
- 15. JPanel nói là mờ đục có nghĩa là gì?
- 16. Tùy chọn Scala? Tại sao một số không kế thừa AnyVal và tại sao nó không phải là một loại giá trị?
- 17. Sự khác nhau giữa các loại giá trị và loại tham chiếu trong C# là gì?
- 18. Tài liệu Elm - "a" nghĩa là gì?
- 19. Loại có thể là loại tham chiếu và loại giá trị cùng một lúc không?
- 20. Trong Actionscript 3, tại sao là loại động của các giá trị int lớn Số?
- 21. WCF trên Linux - là nó có giá trị nỗ lực
- 22. Các loại giá trị kế thừa từ System.Object ... tại sao?
- 23. tại sao chuỗi, mảng và từ điển trong Swift thay đổi thành loại giá trị
- 24. Giới hạn trên và dưới và các loại giá trị pixel trong OpenCV là gì?
- 25. Tại sao giá trị của phao này thay đổi từ những gì nó được thiết lập?
- 26. Chế độ cảm ứng là gì và tại sao nó quan trọng đối với lớp * ActivityTestRule *?
- 27. Cordova Telemetry, nó là gì và tại sao lại sử dụng nó?
- 28. Tại sao và giá trị uint32 với 0xFFFFFFFF?
- 29. Điều gì có thể so sánh trung bình trong Elm?
- 30. Dấu ngoặc nhọn cho các giá trị đối số là gì và nó được sử dụng để làm gì?
Dưới đây là một số thảo luận nhiều hơn cho các tác giả của các thư viện và các gói về giá trị: http://package.elm-lang.org/help/design-guidelines#keep-tags -and-record-constructors-secret – Nathan
Cảm ơn bạn đã chia sẻ giải thích này. Bởi vì khoảng một nửa của nó là một bản sao chính xác của một câu trả lời tôi đăng trước đó hơn trên Slack ([ở đây] (https://elmlang.slack.com/archives/design-patterns/p1480011953000265)), một đề cập hoặc liên kết sẽ có được tốt đẹp. – wintvelt
Hey @wintvelt: Xin lỗi! Tôi nghĩ rằng đó là một câu trả lời thực sự tốt mà sẽ hữu ích sống ở một nơi lâu dài hơn. Tôi đã thêm một tham chiếu đến tài khoản SO của bạn. Có lẽ một SO mod có thể thêm bạn làm tác giả? – Nathan