2010-08-05 31 views
5

Vì vậy, lập trình meta - ý tưởng rằng bạn có thể sửa đổi các lớp/đối tượng trong thời gian chạy, tiêm các phương thức và thuộc tính mới. Tôi biết nó tốt cho phát triển khung; đã làm việc với Grails và khung công tác đó bổ sung một loạt các phương thức vào các lớp của bạn khi chạy. Bạn có một thuộc tính tên trên đối tượng User, và bamm, bạn nhận được một phương thức findByName được tiêm vào thời gian chạy.Lập trình meta, tốt cho nó là gì?

  1. Mô tả của tôi có mô tả đầy đủ khái niệm không?
  2. Điều gì khác là tốt cho (ví dụ cụ thể) ngoài phát triển khuôn khổ?
+2

Điều gì là tốt cho? Hoàn toàn không có gì. – Radu

+1

có thể trùng lặp của http://en.wikipedia.org/wiki/War_(Edwin_Starr_song) – Tom

+0

Như một vài câu trả lời đã chỉ ra, mô tả của bạn không chính xác. Mô tả của bạn dường như đề cập đến sự phản chiếu và lập trình hướng-khía cạnh (AOP). Hai khả năng này mở rộng khả năng của ngôn ngữ khi chạy. Metaprogramming mở rộng khả năng của ngôn ngữ tại thời gian biên dịch, và đặc biệt là khả năng hoạt động trên các kiểu (trong một hệ thống kiểu).Ngược lại, Reflection cho biết thêm khả năng hoạt động trên các kiểu khi chạy. – rwong

Trả lời

3

Với tôi, lập trình meta là "chương trình viết chương trình".

Lập trình meta đặc biệt tốt để sử dụng lại, vì nó hỗ trợ khái quát hóa: bạn có thể xác định một số của các khái niệm thuộc về một mẫu cụ thể. Sau đó, thông qua biến đổi, bạn có thể áp dụng khái niệm đó trong các trường hợp tương tự, nhưng khác nhau.

Ví dụ đơn giản nhất là getter và setter Java như đã đề cập bởi @Sjoerd:

Cả hai phương thức getter và setter theo một rõ ràng mẫu: Một getter trả về một thành viên lớp, và một setter đặt giá trị của một thành viên lớp của . Thông thường, bạn tạo cái được gọi là mẫu để cho phép ứng dụng và sử dụng lại mẫu cụ thể đó. Cách một mẫu hoạt động phụ thuộc vào phương pháp tạo lập trình meta/mã được sử dụng.

Nếu bạn muốn người khởi động hoặc người đặt cược hoạt động theo cách hơi khác, bạn có thể thêm một số thông số vào mẫu của mình. Đây là biến đổi. Ví dụ: nếu bạn muốn thêm mã xử lý bổ sung khi nhận/cài đặt, bạn có thể thêm một khối mã làm tham số biến đổi. Trộn mã tùy chỉnh và mã được tạo có thể phức tạp. ABSE hiện là cách tiếp cận MDSD duy nhất mà tôi biết rằng hỗ trợ trực tiếp mã tùy chỉnh trực tiếp dưới dạng tham số mẫu.

1

Lập trình meta không chỉ thêm phương thức khi chạy, nó còn có thể tự động tạo mã tại thời gian biên dịch. I E. mã tạo mã.

  • dịch vụ Web (ví dụ: các phương pháp được định nghĩa trong WSDL, và bạn muốn sử dụng chúng như thể chúng là phương pháp thực tế trên một đối tượng)
  • Tránh mã boilerplate. Ví dụ, trong Java, bạn nên sử dụng getters và setters, nhưng chúng có thể được tạo tự động cho hầu hết các thuộc tính.
+0

tôi nghĩ metaprogramming cụ thể là một điều thời gian chạy. Hấp dẫn. Điểm tốt về mã tấm nồi hơi (Grails cũng làm điều này). Còn gì nữa không? – hvgotcodes

+0

@hvgotcodes: Lập trình meta chủ yếu là về thời gian biên dịch; thời gian chạy sử dụng thực sự là khá hiếm trong so sánh với thời gian chạy tập quán. Xem f.e. Các mẫu C++ (là loại siêu lập trình, mặc dù không có nhiều người thích thừa nhận điều đó): tất cả các chương trình sử dụng STL ... có rất nhiều chương trình. – liori

0

Lập trình meta không chỉ được sử dụng để thêm nội dung vào cơ sở mã của bạn. Nó cũng có thể được sử dụng để mô tả mã hiện tại mà bạn đang xử lý, mà không cần ghép nối các codebases của bạn. Nó có thể khá hữu ích trong các ứng dụng "nhiều đến nhiều mối quan hệ" chẳng hạn như mediator pattern.

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