Gần đây tôi đã nói chuyện với một đồng nghiệp về C++ và than thở rằng không có cách nào để lấy một chuỗi có tên của một trường lớp và trích xuất trường bằng tên đó; nói cách khác, nó thiếu sự phản chiếu. Anh ấy đã cho tôi một cái nhìn bối rối và hỏi khi nào có ai cần phải làm một điều như vậy.Trường hợp sử dụng để phản ánh
Tắt đầu tôi không có câu trả lời hay cho anh ấy, ngoài "hey, tôi cần làm ngay bây giờ". Vì vậy, tôi ngồi xuống và đưa ra một danh sách một số điều tôi đã thực sự thực hiện với sự phản ánh bằng nhiều ngôn ngữ khác nhau. Thật không may, hầu hết các ví dụ của tôi đến từ lập trình web của tôi bằng Python và tôi hy vọng rằng những người ở đây sẽ có nhiều ví dụ hơn. Dưới đây là danh sách tôi đã đưa ra: "Hello World!"
Cho một tập tin cấu hình với những đường nét như
x =
y = 5.0
đặt động các trường của một số đối tượngconfig
bằng giá trị trong tệp đó. (Đây là điều tôi ước tôi có thể làm trong C++, nhưng thực sự không thể làm được.)Khi sắp xếp danh sách các đối tượng, sắp xếp dựa trên thuộc tính tùy ý cho tên thuộc tính đó từ tệp cấu hình hoặc yêu cầu web.
Khi viết phần mềm sử dụng giao thức mạng, phản ánh cho phép bạn gọi các phương thức dựa trên giá trị chuỗi từ giao thức đó. Ví dụ: tôi đã viết một bot IRC có thể dịch
!some_command arg1 arg2
vào một phương thức gọiactions.some_command(arg1, arg2)
và in bất kỳ chức năng nào được trả về kênh IRC.Khi sử dụng hàm __getattr__ của Python (giống như method_missing trong Ruby/Smalltalk), tôi đã làm việc với một lớp có rất nhiều thống kê, chẳng hạn như late_total. Đối với mỗi thống kê, tôi muốn có thể thêm _percent để có được thống kê đó theo tỷ lệ phần trăm của tổng số thứ tôi đã đếm (ví dụ: stats.late_total_percent). Sự phản ánh làm điều này rất dễ dàng.
Vì vậy, bất kỳ ai ở đây có thể đưa ra ví dụ từ trải nghiệm lập trình của riêng họ khi phản ánh hữu ích không? Lần sau, một đồng nghiệp hỏi tôi tại sao tôi lại muốn "làm như thế" Tôi muốn chuẩn bị kỹ hơn.
Chính xác "sao chép/dán thừa kế" là gì? Và bạn không có một dấu vết ngăn xếp trong ngoại lệ của bạn không? – Groo
Trong trường hợp tôi sử dụng điều này, ngoại lệ cuối cùng đã được ghi vào một tệp văn bản và theo dõi ngăn xếp không được ghi lại. – jrcs3
Không sử dụng phương pháp này trong mã sản xuất. Trong bản phát hành bản phát hành, ngăn xếp có thể và sẽ bị thu gọn do kết quả của chuỗi nội tuyến và chuỗi phương pháp (ví dụ: tối ưu hóa cuộc gọi đuôi). Nếu bạn đăng nhập một ngoại lệ, bạn có stacktrace anyway (không có lý do để thêm nguồn bằng tay). Sử dụng 'GetCurrentMethod' một cách thận trọng và trong quá trình gỡ lỗi chỉ được xây dựng. – Abel