13

Một số ngôn ngữ như Dart sử dụng phản chiếu dựa trên gương, do đó, trong thuật ngữ đơn giản, sự khác nhau giữa triển khai như vậy và sự phản chiếu truyền thống như bạn thấy trong C# hoặc Java.Sự khác biệt giữa phản chiếu dựa trên gương và phản xạ truyền thống là gì?

Cập nhật: Tôi đã tìm thấy video tuyệt vời này (và hơi kỳ quặc) của Gilad Bracha trên Mirror dựa trên sự phản ánh ở Nhật Bản. http://www.hpi.uni-potsdam.de/hirschfeld/events/past/media/100105_Bracha_2010_LinguisticReflectionViaMirrors_HPI.mp4 (công cụ bắt đầu lúc 7:42)

Trả lời

21

Đối với nhiều công dụng, tôi không nghĩ rằng gương sẽ là khác biệt so với Java phản ánh . Điều quan trọng nhất cần hiểu về các gương là chúng tách các API phản chiếu khỏi API đối tượng tiêu chuẩn, vì vậy thay vì obj.getClass() bạn sử dụng phản ánh (obj). Đó là một sự khác biệt dường như nhỏ, nhưng nó mang đến cho bạn một vài điều tốt đẹp:

  1. API đối tượng không bị ô nhiễm và không có nguy cơ phá vỡ phản xạ bằng cách ghi đè phương pháp phản xạ.
  2. Bạn có thể có các hệ thống gương khác nhau. Giả sử, cái không cho phép truy cập vào các phương thức riêng tư. Điều này có thể sẽ rất hữu ích cho các công cụ.
  3. Hệ thống gương không cần phải được bao gồm. Để biên dịch sang JS, điều này có thể quan trọng. Nếu gương không được sử dụng thì không có out-of-band để truy cập mã và cắt tỉa trở thành khả thi.
  4. Gương có thể được thực hiện để hoạt động trên mã từ xa, không chỉ mã cục bộ, vì bạn không cần đối tượng được phản chiếu ở cùng một Isolate hoặc VM làm gương.

Sau đây là cách gương khác với phản ánh trong Java và Javascript khi được sử dụng để có được phương pháp của một đối tượng:

Java:

myObject.getClass().getMethods(); // returns an array 

Dart:

reflect(myObject).type.methods; // returns a map 

Javascript:

var methods = []; 
for (var m in myObject) { 
    if (typeof m === 'function') { 
    methods.push(m); 
    } 
} 
5

Đặt cược tốt nhất của bạn là this article by Gilad Bracha, đồng thiết kế và đặc tả kỹ thuật của Dart. Để có được một cái nhìn thoáng qua, nó có lẽ sẽ là đủ để đọc chương đầu tiên.

Những tuyên bố trừu tượng mà gương tuân thủ ba nguyên tắc cần thiết mà không phải là tiếp theo phản ánh truyền thống:

Chúng tôi xác định ba nguyên tắc thiết kế để suy tư và Lập trình meta cơ sở vật chất trong các ngôn ngữ lập trình hướng đối tượng. Đóng gói: các cơ sở siêu cấp phải đóng gói việc triển khai của chúng. Phân tầng: cơ sở meta cấp phải được tách riêng khỏi chức năng cấp cơ sở. Tương ứng về bản thể học: bản thể luận của cơ sở siêu cấp phải tương ứng với bản thể luận của ngôn ngữ mà chúng thao tác. Kiến trúc truyền thống/chính thống không tuân theo các giới luật này. Ngược lại, phản chiếu Các API được xây dựng xung quanh khái niệm gương được đặc trưng bởi sự tuân thủ ba nguyên tắc này.

+0

bạn có thể tóm tắt không? –

1

Tôi cũng sẽ chỉ cho bạn câu trả lời này khác gần đây bởi Gilad, nơi ông liệt kê một số tài liệu tham khảo tuyệt vời khác: How to get concrete object of a static method via mirror API?

+1

Cảm ơn John. Tôi đã thấy những liên kết này trước đây. Tôi đã hy vọng nhanh chóng có được một bản tóm tắt hoặc một ý chính hơn là đọc bài báo. –

+0

Nhiều sự khác biệt, theo quan điểm của tôi, là ở cấp độ kỹ nghệ phần mềm, và không quá thú vị với những người viết phần mềm trên chúng. Sử dụng gương dễ dàng hơn tôi so với trải nghiệm của tôi với API phản chiếu .net. –

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