Bonjour,
j'ai une question sur les factories : J'ai implémenté la mienne ainsi, par réflection :
Avec l'enum SWCallerName déclaré ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public class WSCallerFactory : Mceau_Tal_3_WSCall.IWSCallerFactory { IWSParams _iwsParams; public WSCallerFactory(IWSParams iwsParams) { _iwsParams = iwsParams; // paramètres d'environnement } IWSCaller IWSCallerFactory.GetInstance(WSCallerName name) { WSCallerName.Task..ToString() IWSCaller iwsc = (IWSCaller)Assembly.GetExecutingAssembly().CreateInstance( "Mceau_Tal_3_WSCall.WSCallerClass.WSCaller" + name.ToString("G"), false, System.Reflection.BindingFlags.CreateInstance, null, new object[] {_iwsParams}, null, null); if (iwsc == null) { throw new ArgumentOutOfRangeException(task); } return iwsc; }
Cependant, les exemples de factories sur le net utilisent des switch/cases.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 enum WSCallerName { Invoices, Rapport, JobExec, Task };
Un collègue me fait remarquer qu'avec un switch case, si on veut instancier un objet d'une classe qui n'existe pas, on a une erreur à la compilation, et en plus, on bénéficie de l'intellisense.
Moi, j'aime bien ce que j'ai fait, parce qu'en cas de création d'une nouvelle classe à instancier par cette factory, il n'y a qu'à l'ajouter dans l'enum, sans toucher à la méthode GetInstance, ce qui applique l' "Open/closed principle" de SOLID.
J'ajoute qu'au début, je passais directement un string name, mais on a transformé ça en enum pour restreindre les entrées possible.
Qu'en pensez-vous ?
Partager