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 :

[C++] Faible et fort couplage


Sujet :

C++

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut [C++] Faible et fort couplage
    Bonjour,

    Je me permet de poser une question triviale mais je n'arrive pas à faire la différence entre un couplage fort et faible en deux classes malgré les ressources su Web.

    Je sais juste que si A et B sont deux classes fortement couplées alors si on modifie A alors il faut modifier B mais je ne connais pas la définition d'un couplage faible (je ne sais pas si c'est l'inverse).

    Est ce que ca serait possible d'avoir un exemple simple d'illustration du couplage fort et du couplage faible ?

    Merci à vous
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Le plus courant :

    Héritage => couplage fort
    Agrégation => couplage faible

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    un couplage fort est généralement a proscrire, en gros tes classes vont partagé des définitions spécifiques. Par exemple si tu dois faire une classe de tableau, pour stocker ta classe voiture, si tu n'utilise pas les templates ta classes tableau ne pourra être réutilisé dans un autre projet...
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

  4. #4
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Ok donc si je comprends bien, quand on introduit des définitions de méthodes/attributs spécifique à une classe dans une autre classe alors on réalise un couplage fort ?

    Vous n'auriez pas un exemple concret des deux concepts ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  5. #5
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Couplage
    Exemple JAVA
    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
     
    Abstract Class A{
       private String[] A;
     
       public String[] getElements(){
     
       }
     
    }
     
     
    Class B extends A{
           //j'hérite des méthodes de A
           public String[] getElementsB(){
                  this.getElements(); // A
           }
    }
    Si je change l'impléméntation de A, j'impacte celle de B.
    exemple passer à une collection ......

    Mais si je fais ...
    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
     
    Abstract Class A{
       private String[] A;
     
       public String[] getElements(){
     
       }
     
    }
     
     
    Class B{
           //j'hérite des méthodes de A
           A a;
           String[] b; <- je peux garder sauf si je veux une collection, alors je change l'extraction des données(1).
           public String[] getElementsB(){<- je ne touche rien (couplage faible)
                  a = new A[];
                  etc .....
                 (1)this.b = a.getElements(); // <= a changer pour une collection
                  return this.b;
           }
    }
    voila

    Voir design pattern composite ...

    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Alors je vois bien l'héritage dans un cas et la composition dans l'autre mais par contre, je ne comprends pas comment on peut avoir un tableau de String nommé A dans la classe A !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Abstract Class A{
       private String[] A;
    Ca ne serait pas une erreur ?
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut oui et non
    Bonsoir,

    Oui c'est une erreur de frappe, mais c'est possible, rien ne t'empêche d'avoir un objet qui référence un objet de même type, exemple contrainte d'intégrité référentielle.
    Un individu est en lien avec un autre ou plusieurs individus ...


    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

  8. #8
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par nathieb Voir le message
    Bonsoir,

    Oui c'est une erreur de frappe, mais c'est possible, rien ne t'empêche d'avoir un objet qui référence un objet de même type, exemple contrainte d'intégrité référentielle.
    Un individu est en lien avec un autre ou plusieurs individus ...


    Olivier
    Ok merci je vois mieux maintenant
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Le couplage entre deux classes A et B va décroissant selon leur relation :


    D'autres constructions jouent sur le couplage :
    • Si A utilise une variable globale de type B, on introduit un couplage (fort? j'aurais tendance à le placer assez haut en tout cas)
    • si A utilise (hormis dans le cas d'héritage) non pas directement B mais une classe 'abstraite' (*) implémentée dans B, on réduit le couplage entre A et B
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
       
      class Base_B;
      class A
      {
        std::unique_ptr<Base_B> b; // < qu'un std::unique_ptr<B>
        std::weak_ptr<Base_B> b; // < qu'un std::weak_ptr<B>
        void do_something(Base_B&); // < qu'un do_something(B&);
      };
       
      class B : public Base B{};
    • Le paramétrage générique peut affaiblir les différentes relations en permettant d'utiliser des policies pour adapter à la compilation l'interface de B à l'utilisation par A



    (*) abstraite : disons dont l'interface est destinée à être redéfinie au besoin pas une classe dérivée.

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Bonjour,

    La c'est vraiment claire c'est ce que j'attendais en fait comme réponse

    Par contre, je n'utilise pas les pointeurs intelligent de Boost, je préfère manipuler les vrais pointeurs par habitude et puis je sais relativement bien les maitriser.

    Donc quelle serait l'équivalent avec des pointeurs normaux (ou des références) de l'a composition et de l'agrégation ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::unique_ptr<B> b; // composition
    std::weak_ptr<B> b; // agrégation
    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  11. #11
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Un pointeur nu n'a aucun moyen d'être équivalent à un de ces smart pointers. D'ailleurs, ils sont dans la STL, pas seulement dans boost.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Les pointeurs ne gèrent en eux mêmes pas la durée de vie de l'objet pointé, contrairement aux smart pointers...donc par exemple on ne verra pas au niveau d'un pointeur la nuance entre composition et agrégation, qui tient à la gestion de la durée de vie (être propriétaire d'un objet, dont on contrôle la durée de vie, contre avoir accès à un objet dont la durée de vie est gérée ailleurs).
    Le pointeur recouvre donc les deux cas en terme de niveau de couplage, à mon avis. Sans information supplémentaire il est probablement sage de le considérer comme au même niveau de couplage que la composition.

  13. #13
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Parfait, merci pour la précision
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  14. #14
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Cette description bijective très claire entre l'UML et le C++ est ce que j'ai très longtemps cherché à l'époque où j'apprenais l'UML.
    Ça mériterait d'être mis dans la FAQ.

  15. #15
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par oodini Voir le message
    Ça mériterait d'être mis dans la FAQ.
    +1
    Parfaitement d'accord
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  16. #16
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le couplage, ce n'est pas aussi trivial que ce que le découpage pourrait laisser entendre.

    Si les deux classes A et B ne peuvent pas être manipulées indépendamment l'une de l'autre (toutes les fonctions de A prennent un B et vice-versa), alors elles seront fortement couplées, explicitement. Variables globales et singletons (la même chose conceptuellement parlant) rajoutent bien un couplage, mais il est caché.
    Ce que je veux dire c'est qu'il y a divers degrés de couplages qui font que 15
    associations peuvent devenir aussi intenses qu'un héritage.

    PS: OP, tu penses tout connaitre des pointeurs et ne pas avoir besoin des encapsulations qu'apportent le C++ ? Et comment en C++ nettoies-tu derrière toi quand il y a des exceptions ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    L
    PS: OP, tu penses tout connaitre des pointeurs et ne pas avoir besoin des encapsulations qu'apportent le C++ ? Et comment en C++ nettoies-tu derrière toi quand il y a des exceptions ?
    Tout connaitre non, mais une grande partie oui
    Avec des deletes qui vont bien, je fais des tests de chaque allocation et si au run-time, une exception intervient alors je vais les delete qui vont bien dans le bon ordre. Valgrind m'a bien aidé dans toute cette histoire
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Luc Hermitte Voir le message
    PS: OP, tu penses tout connaitre des pointeurs et ne pas avoir besoin des encapsulations qu'apportent le C++ ? Et comment en C++ nettoies-tu derrière toi quand il y a des exceptions ?
    Heu, je me fais un peu l'avocat du diable, mais, si on veille correctement à correctement déléguer les responsabilités et, entre autres, à ce que chaque fonction / classe ne gère qu'une ressource (ou plutot qu'un seul type de ressource) créée de manière dynamique le ménage se fait tout seul
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Le couplage, ce n'est pas aussi trivial que ce que le découpage pourrait laisser entendre.
    Oui. Cela dépend aussi comment c'est mis en oeuvre (héritage ou générique) + comment la dépendance est injecté.

    Citation Envoyé par Luc Hermitte Voir le message
    Variables globales et singletons (la même chose conceptuellement parlant) rajoutent bien un couplage, mais il est caché.
    C'est pour cela que j'avais rajouté une nuance pour l'utilisation des variables globales. Ensuite, qu'elles soient globales, singleton, monostate, statique, on est d'accord pour dire que c'est à peu près la même chose

    Citation Envoyé par Luc Hermitte Voir le message
    Si les deux classes A et B ne peuvent pas être manipulées indépendamment l'une de l'autre (toutes les fonctions de A prennent un B et vice-versa), alors elles seront fortement couplées, explicitement.
    Oui, mais ça cache probablement un lien plus fort (composition/agrégation au moins dans un sens).



    Si je reconnais que ce n'est pas aussi simple, ça peut néanmoins donner une indication si le lien est assez en adéquation avec son objectif.

  20. #20
    Membre expérimenté Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Points : 1 532
    Points
    1 532
    Par défaut Découplage
    Bonjour,

    Dans une architecture découplée, fait éviter les variables globales.
    Sinon je ne suis expert C++, mais pour rajouter des fonctionnalités autres
    à une classe on utilise des décorateurs, visiteurs etc ...
    Il faut passer ensuite à l'utilisation de design pattern, avec modération.
    car trop de DP tue les temps de dev.

    Olivier
    Architecte destructurant,
    be cool, be free

    Il nous reste Debian bien sûr

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Couplage faible/fort, RM, WS, EJB ..
    Par charlebakhtovsky dans le forum Langage
    Réponses: 4
    Dernier message: 21/11/2010, 18h17
  2. Couplage fort et faible KEZAKO
    Par c-bolo dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 01/09/2010, 20h09
  3. inversion de bits (poid faible / poid fort)
    Par damdam78 dans le forum C++
    Réponses: 2
    Dernier message: 04/03/2009, 18h17
  4. Réponses: 6
    Dernier message: 23/08/2006, 16h50
  5. Complexité faible et forte
    Par MysticKhal_0 dans le forum Algorithmes et structures de données
    Réponses: 30
    Dernier message: 12/12/2005, 00h20

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