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

Diagrammes de Classes Discussion :

Problème conception : des classes ayant seulement des attributs différents peuvent-elle hériter d'1 class mère


Sujet :

Diagrammes de Classes

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut Problème conception : des classes ayant seulement des attributs différents peuvent-elle hériter d'1 class mère
    Bonjour

    Le titre n'est peut être pas explicite je vais donc essayer de détailler.

    Supposons une classe A, ayant des méthodes publiques, et des attributs privés (jusque là, on doit me suivre ^^)

    Supposons que le cahier des charges stipule que des choses dites "A" ont les mêmes comportements (méthodes et leur implémentation donc), mais qu'il existe plusieurs sous catégories de A. Les seules différences entre ces sous catégories étant les valeurs possibles des attributs, et non pas l'implémentation des méthodes.

    Par attributs, je peux sous entendre attributs liés aux sous catégories elles mêmes, et non pas aux instances.

    Par exemple, tous les instances A1 ont un prix de 1000, toutes les A2 un prix de 300. Ces 2 instances font les mêmes choses de la même façon, sauf qu'elle ne coutent pas pareil.

    Comment pensez vous que ça se modélise ?

    J'étais parti sur un héritage mais je me suis vite aperçu que tout ce qui est constant et statique en Java ne peut être hérité. J'ai commencé à me demander si j'avais bien analysé. Et finalement, c'est vrai que c'est pas une spécialisation puisque les fonctionnalités sont identiques.
    Pouvez vous confirmer mon raisonnement ?

    En ce moment, je me dis qu'une factory doit créer les instances de A, avec les attributs qui vont bien en fonction de la catégorie.
    Par exemple, une énumération (pouvant être A1, A2 ...) est passée à la factory, et en fonction de ça, elle instancie avec les valeurs des attributs dépendant de cette catégorie (si A1, alors new a.prix = 1000 ...). Et pour différencier les catégories des instances, faire un attribut sous catégorie dans A (défini par la factory), accessible depuis l'extérieur.
    Qu'en pensez vous ?

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Citation Envoyé par azerty25 Voir le message
    Par exemple, une énumération (pouvant être A1, A2 ...) est passée à la factory, et en fonction de ça, elle instancie avec les valeurs des attributs dépendant de cette catégorie (si A1, alors new a.prix = 1000 ...).
    Ça, ca me semble pas mal.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 322
    Points : 36 836
    Points
    36 836
    Par défaut
    Bonsoir
    Personnellement, j'associerai à chaque instance de "A" une entrée prise dans la liste de Catégories associées pour avoir le nom, le prix,...
    Nota sous la forme d'un pointeur vers l'élément de la Catégorie ou son numéro d'ordre dans la liste.
    Et si le 'client' de A ne veut pas "voir" l'indirection? ben, je ne sais pas la syntaxe Java pour çà mais il devrait être possible de creer un décorateur
    de type getter/setter qui retourne le prix de a lorsqu'on accède à a.prix
    - W

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses, tout d'abord.

    wiztricks>

    Si j'ai bien compris, avec ta solution, j'ai une classe Catégorie, avec les différentes instances qui représentent les catégories possibles, avec leurs attributs initialisés ?
    Il faudrait garder les instances quelque part. Et quand je voudrais savoir de quelle Catégorie est un A, je vais avoir quelque chose comme instanceA.type == factorySingletonCategories.get(X).
    De même, pour créer les A, on aurait quelque chose comme factorySingletonCategories.createA(factorySingletonCategories.get(X)).
    Bon je suis pas très expérimenté, je dis peut êtres des conneries, mais c'est pas un peu trash ? ^^
    Mais c'est vrai que conceptuellement, on est bien en présence de Catégories qui ont des caractéristiques propres.

    Avec l'autre solution, on perd ces Catégories qui sont connues que par la factory, mais pour savoir le type (catégorie), c'est assez simple: monA.type == Enum.X

  5. #5
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Ben moi je ne suis pas d'accord avec vous.
    Si par essence tu as des sous-classes qui ont des valeurs fixes pour certains attributs alors il faut modéliser cela structurellement = avec l'héritage.
    Il ne faut pas substituer une réelle notion de sous-classes avec des factories car ce n'est la même chose.
    J'ai mis une copie d'écran de ce que cela peut donner en UML.

    Notez le "readonly" et la valeur par défaut.

    Ensuite, côté Java par exemple, on ne propose qu'un "getter" sur attr1 au niveau de A1 et la valeur est mise initialisée dans le constructeur de A1
    Images attachées Images attachées  

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 322
    Points : 36 836
    Points
    36 836
    Par défaut
    Ego
    Ta proposition fonctionne et est semblable à celle que j'essayais de proposer.
    Ceci dit...

    azerty25
    Si j'ai bien compris, avec ta solution, j'ai une classe Catégorie, avec les différentes instances qui représentent les catégories possibles, avec leurs attributs initialisés ?
    Ben globalement, il s'agit de constantes "initialisables" depuis une BDD ou un fichier. Si nous évitons l'héritage, nous évitons peut être aussi d'avoir à recompiler le code en cas de mise à jour des catégories.
    Côté structure, ca à la même gueule que présente le schéma d'ego, héritage en moins...

    Il faudrait garder les instances quelque part. Et quand je voudrais savoir de quelle Catégorie est un A, je vais avoir quelque chose comme instanceA.type == factorySingletonCategories.get(X).
    Je ne sais pas qui est X mais le nom/type d'une catégorie est un identifiant adhoc... que l'application connaît ou pas.

    De même, pour créer les A, on aurait quelque chose comme factorySingletonCategories.createA(factorySingletonCategories.get(X)).
    Bon je suis pas très expérimenté, je dis peut êtres des conneries, mais c'est pas un peu trash ? ^^
    Absolument mais çà me parait un peu compliqué!
    Pour initialiser l'instance de A, n'avons nous pas simplement besoin d'un entier ou d'un pointeur vers la catégorie correspondante?
    Lorsqu'on cherche a savoir de quel type est l'instance ou quels sont les attributs figés par la catégorie on fait une indirection pour récupérer ce qu'il y a dans l'instance catégorie associé à l'instance.

    i.e. faire un "getter" de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public 'type' get<Attribut>() {
          return self.categorie.<Attribut>
    }
    -W

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par azerty25 Voir le message
    Bonjour

    Le titre n'est peut être pas explicite je vais donc essayer de détailler.

    Supposons une classe A, ayant des méthodes publiques, et des attributs privés (jusque là, on doit me suivre ^^)

    Supposons que le cahier des charges stipule que des choses dites "A" ont les mêmes comportements (méthodes et leur implémentation donc), mais qu'il existe plusieurs sous catégories de A. Les seules différences entre ces sous catégories étant les valeurs possibles des attributs, et non pas l'implémentation des méthodes.

    Par attributs, je peux sous entendre attributs liés aux sous catégories elles mêmes, et non pas aux instances.

    Par exemple, tous les instances A1 ont un prix de 1000, toutes les A2 un prix de 300. Ces 2 instances font les mêmes choses de la même façon, sauf qu'elle ne coutent pas pareil.

    Comment pensez vous que ça se modélise ?

    J'étais parti sur un héritage mais je me suis vite aperçu que tout ce qui est constant et statique en Java ne peut être hérité. J'ai commencé à me demander si j'avais bien analysé. Et finalement, c'est vrai que c'est pas une spécialisation puisque les fonctionnalités sont identiques.
    Pouvez vous confirmer mon raisonnement ?

    En ce moment, je me dis qu'une factory doit créer les instances de A, avec les attributs qui vont bien en fonction de la catégorie.
    Par exemple, une énumération (pouvant être A1, A2 ...) est passée à la factory, et en fonction de ça, elle instancie avec les valeurs des attributs dépendant de cette catégorie (si A1, alors new a.prix = 1000 ...). Et pour différencier les catégories des instances, faire un attribut sous catégorie dans A (défini par la factory), accessible depuis l'extérieur.
    Qu'en pensez vous ?

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses très intéressantes. On a finalement opté pour l'héritage avec initialisation des attributs par les constructeurs des classes filles, dans l'hypthèse d'évolution des comportements de celles-ci (ce qui n'était finalement pas exclus)

    Bonne année à vous !

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/11/2014, 14h25
  2. Réponses: 1
    Dernier message: 28/06/2012, 16h04
  3. Réponses: 1
    Dernier message: 27/04/2012, 16h41
  4. Une classe pour mouler des instances qui soient des classes
    Par eyquem dans le forum Général Python
    Réponses: 2
    Dernier message: 03/09/2009, 17h09
  5. Comment hériter d'une class ayant un construteur ?
    Par mobscene dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/07/2007, 18h56

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