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