Recentemente, ho preferito preferire il mapping delle relazioni 1-1 utilizzando Dictionaries
anziché Switch
istruzioni. Trovo che sia un po 'più veloce da scrivere e più facile da elaborare mentalmente. Sfortunatamente, quando si effettua il mapping su una nuova istanza di un oggetto, non voglio definirlo in questo modo:
var fooDict = new Dictionary<int, IBigObject>()
{
{ 0, new Foo() }, // Creates an instance of Foo
{ 1, new Bar() }, // Creates an instance of Bar
{ 2, new Baz() } // Creates an instance of Baz
}
var quux = fooDict[0]; // quux references Foo
Dato questo costrutto, ho sprecato cicli di CPU e memoria creando 3 oggetti, facendo qualunque cosa potessero contenere i loro costruttori, e ho finito solo usando uno di essi. Credo anche che mappare altri oggetti a fooDict[0]
in questo caso causerà loro di fare riferimento alla stessa cosa, piuttosto che creare una nuova istanza di Foo
come previsto. Una soluzione sarebbe usare invece una lambda:
var fooDict = new Dictionary<int, Func<IBigObject>>()
{
{ 0, () => new Foo() }, // Returns a new instance of Foo when invoked
{ 1, () => new Bar() }, // Ditto Bar
{ 2, () => new Baz() } // Ditto Baz
}
var quux = fooDict[0](); // equivalent to saying 'var quux = new Foo();'
È arrivato ad un punto in cui è troppo confuso? È facile perdere quel ()
alla fine. O la mappatura a una funzione / espressione è una pratica abbastanza comune? L'alternativa sarebbe utilizzare un interruttore:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Quale invocazione è più accettabile?
- Dizionario, per ricerche più veloci e meno parole chiave (caso e interruzione)
- Switch: più comunemente trovato nel codice, non richiede l'uso di a FUNC < > oggetto per la ricerca indiretta.