Non è un imbroglio, ma come qualsiasi altro strumento, dovrebbe essere usato per ciò che è destinato a risolvere. La reflection, per definizione, consente di ispezionare e modificare il codice tramite codice; se questo è ciò che devi fare, la riflessione è lo strumento per il lavoro. La riflessione è tutta una questione di meta-codice: codice che indirizza il codice (in contrasto con il codice normale, che mira ai dati).
Un esempio di utilizzo di una buona riflessione sono le classi generiche dell'interfaccia del servizio Web: un tipico progetto consiste nel separare l'implementazione del protocollo dalla funzionalità del payload. Quindi hai una classe (chiamiamola T
) che implementa il tuo payload, e un'altra che implementa il protocollo ( P
). T
è abbastanza semplice: per ogni chiamata che vuoi fare, scrivi semplicemente un metodo che fa quello che deve fare. P
, tuttavia, deve mappare le chiamate di servizio Web alle chiamate di metodo. Rendere questa mappatura generica è auspicabile, perché evita la ridondanza e rende estremamente riutilizzabile P
. Reflection fornisce i mezzi per ispezionare la classe T
in fase di esecuzione e chiama i suoi metodi basati su stringhe passate in P
tramite il protocollo del servizio Web, senza alcuna conoscenza in fase di compilazione della classe T
. Utilizzando la regola "code about code", si può sostenere che la classe P
ha il codice nella classe T
come parte dei suoi dati.
Comunque.
Reflection fornisce anche strumenti per aggirare le restrizioni del sistema dei tipi di linguaggio - in teoria, puoi passare tutti i parametri come object
e chiamare i loro metodi attraverso i riflessi. Voilà, il linguaggio che dovrebbe applicare una strong disciplina di tipizzazione statica ora si comporta come un linguaggio tipizzato dinamicamente con un binding tardivo, solo che la sintassi è molto più elaborata. Ogni singola istanza di tale modello che ho visto fino ad ora è stata un brutto scherzo e, invariabilmente, una soluzione all'interno del sistema di tipo linguistico sarebbe stata possibile, e sarebbe stata più sicura, più elegante e più efficiente sotto tutti gli aspetti .
Esistono alcune eccezioni, come i controlli della GUI che possono essere associati a dati a vari tipi di fonti di dati non correlati; che impone che i dati implementino una determinata interfaccia solo per consentire il collegamento dei dati, non è realistico e nessuno dei due ha il programmatore che implementa un adattatore per ciascun tipo di origine dati. In questo caso, l'uso della riflessione per rilevare il tipo di origine dati e la regolazione dell'associazione dati è una scelta più utile.