Io e un amico abbiamo una discussione su quale sia la tecnica migliore da utilizzare nel seguente scenario:
Un'applicazione che dobbiamo testare ha un numero di componenti (chiamiamoli Eggs); ogni componente è un sacchetto di sottocomponenti predefiniti. Questi componenti sono l'input per la nostra applicazione, non è possibile modificare / annotare questi componenti all'origine.
Ora abbiamo un set di validatori per ogni sottocomponente. Non è programmaticamente possibile associare un uovo ai suoi validatori, quindi deve essere fatto manualmente per ogni nuovo uovo (ci sono un numero finito di uova). Una volta eseguita la mappatura, possiamo eseguire ogni validatore per ogni uovo per vedere se l'uovo è buono o marcio.
Ora, il mio modo di farlo è di avere un file di configurazione che consiste nella mappatura tra ogni Egg e i suoi validatori. Ad esempio:
{
Egg1: [validator1, validator2]
Egg2: [validator5, validator7, validator2]
}
Ora possiamo leggere questo file e usare le riflessioni per selezionare il validatore appropriato (dall'elenco di tutte le classi che implementano IValidator) per ogni Egg.
Il mio amico è contrario all'uso dei riflessi e preferisce aggiungere una nuova classe C # per ogni uovo ogni volta che viene aggiunto un nuovo tipo di uovo. La classe rappresenta l'uovo e gestisce i validatori appropriati per quell'uovo.
Qual è il modo migliore? Preferisco il metodo dei riflessi perché ogni volta che si presenta un nuovo tipo di Egg tutto ciò che dobbiamo fare è modificare la configurazione.
Per chiarire, un uovo è una selezione dall'elenco predefinito di sottocomponenti. Supponiamo che non ci saranno più sotto-componenti, e quindi non c'è bisogno di nuovi validatori. Non possiamo enumerare tutte le uova possibili perché ce ne sono troppe.