IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Implémentation d'une Factory


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut Implémentation d'une Factory
    Bonjour,

    j'ai une question sur les factories : J'ai implémenté la mienne ainsi, par réflection :
    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;
            }
    Avec l'enum SWCallerName déclaré ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            enum WSCallerName {
                Invoices,
                Rapport,
                JobExec,
                Task
            };
    Cependant, les exemples de factories sur le net utilisent des switch/cases.

    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 ?

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    le seul potentiel problème ici c'est que le nom de la classe et les namespaces sont en string
    donc en cas de changement de ceux ci il faudra modifier dans le factory
    ca reste donc un problème mineur, surtout sur un petit projet

    si tu as pas trop de valeur d'enum possible un switch sur l'enum convient tout en gardant l'intellisense et en ayant de la vérification à la compilation
    après si tu as beaucoup de classes possibles et que tu ne veux pas modifier le factory alors oui ta solution est bonne (il n'y a que l'enum à modifier)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Si tu regardes en détails, il y a un couplage fort entre l’énumération et la classe.
    Ce qui implique que cette énumération fait partie de l'implémentation de la fabrique.
    Donc tu dois modifier la fabrique en cas d'ajout de nouvelle classe, ce qui est une violation de l'Open/Close dans ce cas là aussi.

    Puisque ça ne change rien sur le principe, je suis du même avis que ton collègue.
    Avec cette implémentation ton programme compilera même si tu omets de modifier l'énumération.
    Tu prend donc le risque de créer un bogue que tu n'aura jamais avec une implémentation classique.

    Ce n'est pas pour rien qu'on appelle cela des "patrons de conception".

    A propos de SOLID, c'est très bien de vouloir le respecter.
    Mais il ne faut pas se montrer rigide et comprendre que parfois pour la maintenabilité, la lisibilité et tout un tas d'autres critères, il sera nécessaire de faire autrement.
    Quand à savoir quand et comment, je n'aborderai pas plus le sujet parce que ce post risque de se transformer en débat sans fin.

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    À quoi elle te sert cette factory ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2006, 23h22
  2. Implémentation d'une jointure "rien=tout"
    Par lafeuil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/03/2006, 16h26
  3. Implémentation d'une liste chaînée
    Par Yux dans le forum C
    Réponses: 22
    Dernier message: 02/03/2006, 20h31
  4. Réponses: 5
    Dernier message: 23/02/2006, 00h34
  5. Réponses: 12
    Dernier message: 01/07/2004, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo