Documentation: họ sử dụng bởi EDoc để tạo ra tất cả các hình thức khác nhau của tài liệu cho mã của bạn. Các thuộc tính -spec
là các chữ ký chức năng, tùy thuộc vào mức độ nỗ lực bạn đưa vào chúng, có thể làm cho mã của bạn dễ hiểu hơn và dễ bảo trì hơn. Giả sử rằng cấu trúc dữ liệu yêu thích của bạn trong tháng này là dict()
. Hãy xem xét mã sau:
my_function(SomeArg, SomeOtherArg, Dict) ->
...
dict:find(SomeKey, Dict)
...
Biến đang được sử dụng làm dict được đặt tên như vậy. Nhưng chúng ta hãy nói rằng bạn có đoạn như sau:
my_other_function(NamesDict, PlacesDict) ->
...
R1 = my_function(A, B, NamesDict),
...
R2 = my_function(C, D, PlacesDict),
...
Đang cố gắng để theo kịp với tình trạng này sẽ dẫn đến mã mà lặp đi lặp lại Dict
hậu tố này. Thậm chí nhiều hơn, bạn thậm chí có thể không muốn nhớ trong ngữ cảnh của my_other_function
rằng hai đối số là dict()
. Vì vậy, thay vào đó bạn có thể muốn làm điều này:
-spec my_other_function(dict(), dict()) -> atom().
my_other_function(Names, Places) ->
...
R1 = my_function(A, B, Names),
...
R2 = my_function(C, D, Places),
...
Bây giờ rõ ràng là những lập luận này nên dict() cho các chức năng để làm việc và hy vọng mọi người sẽ có thể để con số đó mà không đi sâu vào các mã.Nhưng giả sử bạn đang sử dụng Name
dict()
ở những nơi khác và nó lưu trữ một số thông tin cụ thể được hiển thị với các API khác nhau. Sau đó, nó là một ứng cử viên hoàn hảo cho một tuyên bố -type
:
-type names() :: dict().
-spec my_other_function(names(), places()) -> atom().
my_other_function(Names, Places) ->
...
R1 = my_function(A, B, Names),
...
R2 = my_function(C, D, Places),
...
Nếu ai đó làm thường xuyên sử dụng cấu trúc dữ liệu đặc biệt này, bạn có thể muốn xuất nó quá:
-module(my_module).
-export_type([names/0]).
-type names() :: dict().
module khác bây giờ có thể tham khảo này cấu trúc dữ liệu cụ thể:
-module(my_other_module).
-record(my_state, {names :: my_module:names(),
...}).
Cuối cùng nếu bạn muốn nhà phát triển khác không kiểm tra cấu trúc dữ liệu này theo bất kỳ cách nào trong mô-đun, bạn có thể clare nó như -opaque
. Một lần nữa, đây là một "gợi ý thân thiện", cũng như tất cả những thứ còn lại cho đến nay. Hoặc là nó...?
Cảm ơn bạn đã trả lời chi tiết.'-opaque' có giống với' -type' không có khai báo '-export_type' không? – egor7
Không, bạn vẫn cần xuất bất kỳ loại '-opaque' nào mà bạn khai báo. – aronisstav