2016-11-24 17 views

Trả lời

13

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

+0

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

+0

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

+1

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

Các vấn đề liên quan