2011-12-22 36 views
22

Thuộc tính trong .NET là một tính năng rất phổ biến. Và Java đã thêm Chú thích sau 1,5 Chú thích được sử dụng ở mọi nơi, xem Java EE và Spring. Nhưng ít thư viện sử dụng chú thích scala. lift-json không sử dụng nó. bản ghi nâng cấp không sử dụng. Squeryl không sử dụng nó. subcut không sử dụng nó (nó có chú thích cho trình biên dịch plugin) ... Chỉ cần đặt tên một vài.Tại sao mọi người không thích chú thích?

Chúng chỉ sử dụng chú thích khi chúng cần một số phép thuật biên dịch. @tailrec, @inline, @BeanProperty, @Inject (trong phần phụ) ...

Scala có hệ thống loại siêu linh hoạt, đặc điểm, ngầm và Menifest [X]. Vì vậy, họ không cần siêu dữ liệu thời gian chạy?

Có dự án scala nào sử dụng chú thích nhiều không?

p.s. Tôi nghĩ rằng Dynamic phải là chú thích nhưng không phải là đặc điểm.

+2

Hồ sử dụng chú thích này có vấn đề gì? – Mat

+0

Động là Loại. Tại sao nó phải là một chú thích? – Jan

+0

Vì không có phương pháp nào bên trong và khi bạn sử dụng nó, bạn có loại của riêng mình, Động chỉ cho bạn biết loại của bạn là động. – iron9light

Trả lời

27

Nói chung, chúng tôi không sử dụng chú thích vì chúng tôi thực sự không cần chúng cho rất nhiều thứ.

Vài nơi tôi đã nhìn thấy các chú thích được sử dụng:..

  • hệ thống tắm loại (ví dụ như các plugin CPS cho continuations phân hoặc plugin theo dõi tác dụng
  • Giao diện với giao diện di sản Java (scala-mojo-support)
  • Enforcing/cho phép optimisations trình biên dịch, như @inline hoặc @tailrec.

Trong Scala, chúng tôi không thực sự cần một khung tiêm phụ thuộc, vì có một vài cách để làm tiêm phụ thuộc không yêu cầu công cụ bên ngoài. Bạn có thể có cấu hình DI tách biệt với mã lõi, nhưng vẫn được viết bằng Scala. Xem: https://github.com/jsuereth/scala-in-depth-source/blob/master/chapter11/src/main/scala/scalax/config/Test.scala

Vì vậy, câu trả lời cơ bản là, không có gì sai với chú thích, chúng tôi không cần chúng thường xuyên (chưa).

+0

Tôi nghĩ chú thích cho cps, @cpsParam, là một TypeConstraint, nhiều hơn chú thích truyền thống chỉ cung cấp siêu dữ liệu thời gian chạy. – iron9light

+0

Đó là nhiều hơn rằng Scala linh hoạt hơn trong những gì có thể được chú thích hơn Java/C#. Nó vẫn chỉ là một chú thích, sử dụng cùng một AST như các chú thích khác, nhưng xảy ra trên một loại. Chú thích Java cũng có thể * không * có sẵn khi chạy, nhưng chỉ có thời gian biên dịch/apt. Việc này được thực hiện thông qua cài đặt '@ Retention' trên lớp chú thích. – jsuereth

2

Bạn đã trả lời khá nhiều câu hỏi của riêng mình khi bạn nói rằng chúng được sử dụng cho ma thuật trình biên dịch. Đối với các ứng dụng khác, nó thường là một loại ma thuật thời gian chạy, trong đó hai công cụ chính là sự phản chiếu và chuyển đổi mã byte.

Đối với trường hợp JSON, lựa chọn cho chuyển đổi sẽ như sau: 1. Một hàm hoặc lớp phân tích cú pháp JValue của bạn và tạo lớp học của bạn T. 2. Phản ánh các lớp đích để xác định bố cục của chúng là tùy chọn, sau đó một số mã "động" chạy trên dữ liệu được phân tích đó để tạo và sau đó chuyển sang loại thích hợp.

12

Đối với tôi, đây thường là vấn đề về an toàn loại thực thi của trình biên dịch. Hãy xem Squeryl và cách nó khác với một ORM Java như Hibernate. Trường hợp Hibernate sẽ sử dụng chú thích @Id để biểu thị khóa chính, trong Squeryl bạn tạo một thành viên id, được chỉ định bởi đặc điểm KeyedEntity. Các phương thức yêu cầu một thực thể có khóa chính (ví dụ: cập nhật & xóa) sẽ bị lỗi to khi biên dịch nếu chưa được xác định.Có một số nơi khác trong Squeryl, nơi các cấu trúc an toàn thay thế các chú thích như lập bản đồ bộ sưu tập và xử lý ngày/giờ.

Tôi nghĩ rằng đây là một cách suy nghĩ chung trong cộng đồng Scala. Chú thích có nhiều tính năng thời gian chạy hơn và cũng không được coi trọng. Trình biên dịch Scala là rất mạnh mẽ và đẩy nhiều mã của bạn vào các cấu trúc nó có thể xác nhận hợp lý cho những người sẵn sàng chấp nhận sự phức tạp đi kèm với điều đó.

0

Tất cả chú thích như @tailrec và @inline chỉ là thời gian biên dịch. Chúng mở rộng StaticAnnotation, đó là, AFAIK, sự hỗ trợ chú thích duy nhất trong Scala, và chúng sẽ không được giữ lại khi chạy. Tôi nghĩ triết lý là tránh các chú thích thời gian chạy vì chúng được truy xuất thông qua sự phản chiếu, một thế giới mà trình biên dịch không còn có thể giúp bạn vượt ra ngoài các lớp tiêu chuẩn do loại xóa, nhưng quan trọng nhất, bởi vì nó là thời gian chạy và mục tiêu là bạn đang cố gắng quyết định thời gian biên dịch.

Xem xét sử dụng các chú thích để mô hình đầu ra JSON ví dụ: Trong Java, bạn sẽ biết nếu nó hoạt động OK khi bạn chạy chương trình của mình. Trong Scala, bạn có thể sử dụng các lớp kiểu để mô hình cách mỗi kiểu được thể hiện trong JSON. Nếu bạn bỏ lỡ một định nghĩa, biên dịch sẽ cho bạn biết. Một ví dụ tuyệt vời là spray-json.

Dave Whittaker đưa ra một ví dụ tuyệt vời khác trong số answer của mình.

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