Récemment, je suis venu à préférer le mappage des relations 1-1 en utilisant Dictionaries
au lieu des Switch
instructions. Je trouve que c'est un peu plus rapide à écrire et plus facile à traiter mentalement. Malheureusement, lors du mappage vers une nouvelle instance d'un objet, je ne veux pas le définir comme ceci:
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
Compte tenu de cette construction, j'ai gaspillé des cycles CPU et de la mémoire en créant 3 objets, en faisant tout ce que leurs constructeurs pourraient contenir, et je n'ai fini par utiliser l'un d'eux. Je crois également que le mappage d'autres objets fooDict[0]
dans ce cas les amènera à référencer la même chose, plutôt que de créer une nouvelle instance de Foo
comme prévu. Une solution serait d'utiliser un lambda à la place:
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();'
Est-ce que cela arrive à un point où c'est trop déroutant? C'est facile de manquer ça ()
à la fin. Ou le mappage à une fonction / expression est-il une pratique assez courante? L'alternative serait d'utiliser un interrupteur:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Quelle invocation est la plus acceptable?
- Dictionnaire, pour des recherches plus rapides et moins de mots-clés (casse et pause)
- Switch: plus communément trouvé dans le code, ne nécessite pas l'utilisation d'un objet Func <> pour l'indirection.
fooDict[0] is fooDict[0]
). avec le lambda et le commutateur ce n'est pas le cas