Nó không phải là gian lận, nhưng giống như bất kỳ công cụ nào, nó nên được sử dụng cho những gì nó dự định giải quyết. Sự phản chiếu, theo định nghĩa, cho phép bạn kiểm tra và sửa đổi mã thông qua mã; nếu đó là những gì bạn cần làm, thì sự phản chiếu là công cụ cho công việc. Phản ánh là tất cả về mã meta: Mã nhắm mục tiêu mã (trái ngược với mã thông thường, nhắm mục tiêu dữ liệu).
Một ví dụ về sử dụng phản xạ tốt là các lớp giao diện dịch vụ web chung: Một thiết kế điển hình là tách biệt việc thực hiện giao thức khỏi chức năng tải trọng. Vì vậy, sau đó bạn có một lớp (hãy gọi nó T
) thực hiện tải trọng của bạn và một lớp khác thực hiện giao thức ( P
). T
khá đơn giản: đối với mỗi cuộc gọi bạn muốn thực hiện, chỉ cần viết một phương thức làm bất cứ điều gì đáng lẽ phải làm. P
tuy nhiên, cần ánh xạ các cuộc gọi dịch vụ web đến các cuộc gọi phương thức. Làm cho bản đồ này chung chung là mong muốn, bởi vì nó tránh được sự dư thừa, và làm cho P
có thể tái sử dụng cao. Reflection cung cấp các phương tiện để kiểm tra lớp T
trong thời gian chạy và gọi các phương thức của nó dựa trên các chuỗi được truyền P
qua giao thức dịch vụ web, mà không có bất kỳ kiến thức nào về thời gian biên dịch của lớpT
. Sử dụng quy tắc 'code about code', người ta có thể lập luận rằng lớp P
có mã trong lớp T
là một phần của dữ liệu của nó.
Tuy nhiên.
Sự phản chiếu cũng cung cấp cho bạn các công cụ để khắc phục các hạn chế của hệ thống loại ngôn ngữ - về mặt lý thuyết, bạn có thể chuyển tất cả các tham số dưới dạng loại object
và gọi các phương thức của chúng thông qua các phản xạ. Voilà, ngôn ngữ được cho là thực thi kỷ luật gõ tĩnh mạnh mẽ hiện hành xử giống như một ngôn ngữ được gõ động với ràng buộc muộn, chỉ có điều cú pháp phức tạp hơn nhiều. Mỗi trường hợp của một mẫu như vậy tôi từng thấy cho đến nay đều là một bản hack bẩn và luôn luôn là một giải pháp trong hệ thống loại ngôn ngữ, và nó sẽ an toàn hơn, thanh lịch hơn và hiệu quả hơn về mọi mặt .
Một vài trường hợp ngoại lệ tồn tại, chẳng hạn như các điều khiển GUI có thể được liên kết dữ liệu với các loại nguồn dữ liệu không liên quan khác nhau; bắt buộc rằng dữ liệu của bạn triển khai một giao diện nhất định chỉ để bạn có thể liên kết dữ liệu không thực tế và lập trình viên cũng không thực hiện bộ điều hợp cho từng loại nguồn dữ liệu. Trong trường hợp này, sử dụng sự phản chiếu để phát hiện loại nguồn dữ liệu và điều chỉnh ràng buộc dữ liệu là một lựa chọn hữu ích hơn.