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 :

Colle de généricité


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Colle de généricité
    Bonjour,

    Sur cette page se trouve un didacticiel sur les fabriques à base de délégués.

    À la fin de la 3ème zone de code (orange), nous avons ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static AObject ObjectCreator(params object[] list)
    {
        return new Class1();
    }
    N'aurait-il pas été possible d'utiliser la généricité pour ce code ?
    Car là, on doit répéter ce code pour chaque classe dérivée (ici, Class1 & Class2).

    Ou alors, y a-t-il un moyen pour indiquer "le type de la classe étant définie" ?
    Avec la réflexion, peut-être...

    Merci.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Biensur tu peux, mais je pense que ca n'est pas trop le but de l'exercice.

    Je devinne qu'ils veulent t'apprendre le parterne, et donc tentent de rester simple.

  3. #3
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Ce n'est pas une question de "simplicité" ou autre, utiliser la généricité ici n'aurait eu aucun intérêt, c'est évident quand on se rappelle quel est le but du pattern "Factory".

    Citons Wikipedia : Fabrique (patron de conception) :
    La fabrique (factory) est un patron de conception créationnel utilisé en programmation orientée objet. Comme les autres modèles créationnels, la fabrique a pour rôle l'instanciation d'objets divers dont le type n'est pas prédéfini : les objets sont créés dynamiquement en fonction des paramètres passés à la fabrique.
    Autrement dit, AObject est une classe abstraite, l'implémentation est réalisée par les héritiers. Le consommateur de la Factory veut simplement un objet de type AObject, il se fiche de savoir si c'est un object "ClassA", "BObject" ou que sais-je : autrement dit il se fiche de savoir quelle classe réalise l'implémentation, tout ce qu'il veut c'est une classe qui respecte "le contrat AObject" (qui hérite/implémente AObject) et qui corresponde aux paramètres fournis à la Factory. D'ailleurs ces sous-classes ne lui sont peut-être même pas visibles. C'est le rôle de la Fabrique de déterminer le type particulier en fonction des arguments qui ont été fournis.

    Exemple classique du pattern Factory :
    * Véhicule est une classe abstraite, qui a pour héritiers les classes Moto, Voiture, Camion.
    * Fabrique possède une méthode "Véhicule Fabrique.Créer(string modèle)". Si le modèle spécifié est "Clio" on renverra une classe Voiture. Si le modèle est "33 tonnes", la fabrique renverra un objet de type Camion. Etc... Le consommateur de la Factory se fiche de savoir si l'objet est un camion ou autre, tout ce dont il a besoin ce sont des méthodes déclarées par Véhicule et implémentées par les héritiers.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Autrement dit, AObject est une classe abstraite, l'implémentation est réalisée par les héritiers. Le consommateur de la Factory veut simplement un objet de type AObject, il se fiche de savoir si c'est un object "ClassA", "BObject" ou que sais-je
    Je sais bien. Mais le morceau de code ci-dessus est dans l'implémentation de Class1, et sera à répéter pour chaque implémentation (Class2, Class3...). Cela me semble être un cas de redondance. La table de hachage nous informe déjà sur quel type d'objet il faut appeler la fonction de création, et donc du type d'objet qui va nous être retourné.

    Si on avait un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new curentObject.type()
    on resterait dans les concepts de la fabrique.

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Ouhlà, je n'avais pas lu la fin de l'article. C'est assez... tordu... et sale. Visiblement, l'intérêt du design est de pouvoir spécifier en amont la factory à utiliser pour instancier une classe donnée, on est plus proche d'une abstract factory.

    Effectivement, on aurait pu utiliser la généricité dans ce cas. Ca n'aurait pas permis d'écrire moins de code cela dit. Il faut toujours un objectcreator différent par classe. La seule chose que l'on aurait pu supprimer aurait été le champ "ClassType" (argh, que c'est laid).

    Le code que tu donnes ne colle pas : outre que ça ne pourrait jamais marcher (même si type() renvoyait un type, tu ne pourrait pas l'instancier avec new), ça viole la philosophie du pattern, qui est de ne pas savoir quel objectcreator se chargera d'instancier ton objet, même si dans l'exemple c'est à chaque fois l'objectcreator par défaut.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Ouhlà, je n'avais pas lu la fin de l'article. C'est assez... tordu... et sale. Visiblement, l'intérêt du design est de pouvoir spécifier en amont la factory à utiliser pour instancier une classe donnée, on est plus proche d'une abstract factory.
    Pour moi, l'intérêt est de pouvoir associer dans un map une chaîne, par exemple, à un type une fabrique d'un type donné.
    Pourquoi trouves-tu ça sale ?

    Citation Envoyé par DonQuiche Voir le message
    Effectivement, on aurait pu utiliser la généricité dans ce cas. Ca n'aurait pas permis d'écrire moins de code cela dit. Il faut toujours un objectcreator différent par classe. La seule chose que l'on aurait pu supprimer aurait été le champ "ClassType" (argh, que c'est laid).
    Et pourquoi ne pas mettre le template dans la classe parente ? Pas possible de récupérer le type dynamique de la classe courante ?
    Sinon, quel intérêt de templatiser dans la classe fille ?

    Citation Envoyé par DonQuiche Voir le message
    Le code que tu donnes ne colle pas : outre que ça ne pourrait jamais marcher (même si type() renvoyait un type, tu ne pourrait pas l'instancier avec new),
    Pourquoi ?

    Citation Envoyé par DonQuiche Voir le message
    ça viole la philosophie du pattern, qui est de ne pas savoir quel objectcreator se chargera d'instancier ton objet, même si dans l'exemple c'est à chaque fois l'objectcreator par défaut.
    Moi, je ne cherche pas absolument à coller à une philosophie. Je veux répondre à mon besoin, c'est tout : on me file un nom de fichier, et en fonction de l'extension, créer l'objet qui va bien.

  7. #7
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Tu veux dire mettre de la généricité pour Class1 ? oui c'est possible.

    On peut faire ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static AObject ObjectCreator < AObjectType >(params object[] list)
        where AObjectType : AObject, //Pour dire que le type doit etre ou dériver de AObject
        new() //pour dire que le type implémente le constructeur par défaut
    {
        return new AObjectType();
    }
    Cet exemple marche tres bien. Le seul souci, c'est quand tu veux utiliser autre chose que le constructeur par défaut. Tu ne peux tout simplement pas. Tu ne peux pas faire new AObjectType(/*param*/).
    Ou alors il faut utiliser des astuces (reflexion...). Regarde ici :
    http://stackoverflow.com/questions/8...ructor-problem

    EDIT: Apres est-ce que c'est valable pour respecter la pure 'Abstract Factory j'en sais rien, mais c'est techniquement possible d'utiliser la généricité.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Ce n'est pas une question de "simplicité" ou autre, utiliser la généricité ici n'aurait eu aucun intérêt, c'est évident quand on se rappelle quel est le but du pattern "Factory".
    Oui c'est ce que je voulais dire entre autre par :
    ca n'est pas trop le but de l'exercice.

    Je devinne qu'ils veulent t'apprendre le partern

  9. #9
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Oups, la lecture en diagonale, saylemal.

Discussions similaires

  1. [architecture] pour de la généricité, vous feriez quoi ?
    Par Alec6 dans le forum Débats sur le développement - Le Best Of
    Réponses: 39
    Dernier message: 03/07/2006, 14h39
  2. [D7] généricité / portabilité d'une application
    Par Magnus dans le forum Bases de données
    Réponses: 7
    Dernier message: 01/09/2005, 08h39
  3. [Ada 95] Généricité de type/package
    Par kindool dans le forum Ada
    Réponses: 5
    Dernier message: 19/05/2005, 11h54
  4. Une colle CSS
    Par gael.mases dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 21/10/2004, 10h49

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