Це не обман, але як і будь-який інструмент, його слід використовувати для того, що він вирішує вирішити. Відображення за визначенням дозволяє перевіряти та змінювати код за допомогою коду; якщо це те, що вам потрібно зробити, то рефлексія є інструментом для роботи. Відображення стосується мета-коду: Код, який націлює код (на відміну від звичайного коду, який націлює дані).
Прикладом хорошого використання роздумів є загальні класи інтерфейсу веб-сервісу. Типовою конструкцією є відокремлення реалізації протоколу від функціональності корисного навантаження. Тож у вас є один клас (назвемо його T
), який реалізує вашу корисну навантаження, і інший, який реалізує протокол ( P
). T
досить просто: для кожного дзвінка, який ви хочете здійснити, просто напишіть один метод, який робить все, що він повинен робити. P
однак, потрібно зіставити дзвінки веб-служб на виклики методів. Зробити це відображення загальним є бажаним, оскільки воно дозволяє уникнути надмірності та робить P
багаторазовим використання. Reflection надає засоби для перевірки класу T
під час виконання та виклику його методів на основі рядків, переданих P
через протокол веб-сервісу, без будь-якого знання класу в час компіляції.T
. Використовуючи правило «код про код», можна стверджувати, що клас P
містить код у класі T
як частину своїх даних.
Однак.
Відображення також дає вам інструменти для подолання обмежень системи типів мови - теоретично ви можете передати всі параметри як тип object
і викликати їх методи через відображення. Voilà, мова, яка повинна застосовувати сильну дисципліну статичного набору тексту, тепер веде себе як динамічно набрана мова з пізнім зв'язуванням, лише що синтаксис є набагато більш досконалим. Кожен окремий екземпляр такого шаблону, який я бачив до цього часу, був брудним злом, і незмінно рішення в системі типу мови було б можливим, і воно було б безпечнішим, елегантнішим та ефективнішим у всіх відношеннях .
Існує кілька винятків, таких як елементи управління графічним інтерфейсом, які можуть бути пов'язані з різними непов'язаними типами джерел даних; мандат до того, що ваші дані реалізують певний інтерфейс лише для того, щоб ви могли прив'язувати дані, це не реально, і програміст не повинен реалізовувати адаптер для кожного типу джерел даних. У цьому випадку використання відображення для виявлення типу джерела даних та коригування прив'язки даних є більш корисним вибором.