677 votes

La cohésion & couplage

Quelle est la différence entre cohésion et couplage ?

Comment la cohésion et couplage peuvent conduire à une conception de logiciels de bonne ou mauvaise ?

Quels sont quelques exemples qui mettent en évidence la différence entre les deux et leur impact sur la qualité globale du code ?

945voto

mauris Points 19666

À ajouter sur ce que CesarGon a mentionné,

La cohésion se réfère à ce que la classe (ou module) de le faire. Faible cohésion signifierait que la classe ne comprend une grande variété d'actions et n'est pas concentré sur ce qu'il doit faire. Une forte cohésion voudrait alors dire que la classe est concentré sur ce qu'elle doit faire, c'est à dire uniquement les méthodes concernant l'intention de la classe.

Exemple de Faible Cohésion:

-------------------
| Staff           |
-------------------
| checkEmail()    |
| sendEmail()     |
| emailValidate() |
| PrintLetter()   |
-------------------

Exemple d'une Forte Cohésion:

----------------------------
| Staff                   |
----------------------------
| -salary                 |
| -emailAddr              |
----------------------------
| setSalary(newSalary)    |
| getSalary()             |
| setEmailAddr(newEmail)  |
| getEmailAddr()          |
----------------------------

Comme pour le couplage, il se réfère à la façon dont sont deux classes / modules et comment dépendants qu'ils sont les uns sur les autres. En cours de couplage faible signifie que le changement de quelque chose de plus important dans une classe ne devrait pas affecter les autres. Haut de couplage permettrait de rendre votre code difficile d'apporter des changements ainsi que de la maintenir, comme les classes sont couplés en étroite collaboration, en faisant un changement pourrait signifier tout un système à revoir en profondeur.

Tout bon logiciel de conception passera par une forte cohésion et de couplage faible.

99voto

CesarGon Points 8710

C'est un peu plus complexe que cela. :-)

Une forte cohésion au sein de modules et de couplage faible entre les modules sont souvent considérées comme liées à la haute qualité dans OO langages de programmation.

Par exemple, le code à l'intérieur de chaque classe Java doit avoir une forte cohésion interne, mais que faiblement couplé possible du code dans d'autres classes Java.

Le chapitre 3 de Meyer du Logiciel Orienté Objet la Construction (2e édition) est une grande description de ces questions.

35voto

Adrian Regan Points 1574

Augmentation de la cohésion et de la diminution de couplage n'mener à bien la conception de logiciels.

La cohésion des partitions de votre fonctionnalité de sorte qu'il est concis et plus proche des données qui le concernent, tandis que le découplage assure que la fonctionnelle de la mise en œuvre est isolé du reste du système.

Le découplage permet de changer la mise en œuvre sans affecter d'autres parties de votre logiciel.

La cohésion s'assure que la mise en œuvre plus spécifiques à la fonctionnalité et à la même temps plus facile à maintenir.

La méthode la plus efficace de diminuer le couplage et la cohésion croissante est la conception d'une interface.

Qui est fonctionnelle majeure objets ne doit "connaître" les uns les autres par le biais de l'interface(s) qu'ils mettent en œuvre. La mise en œuvre d'une interface introduit la cohésion comme une conséquence naturelle.

Bien que n'étant pas réaliste dans certains senarios il devrait être un objectif de conception de travailler en.

Exemple (très sommaire):

public interface IStackoverFlowQuestion
      void SetAnswered(IUserProfile user);
      void VoteUp(IUserProfile user);
      void VoteDown(IUserProfile user);
}

public class NormalQuestion implements IStackoverflowQuestion {
      protected Integer vote_ = new Integer(0);
      protected IUserProfile user_ = null;
      protected IUserProfile answered_ = null;

      public void VoteUp(IUserProfile user) {
           vote_++;
           // code to ... add to user profile
      }

      public void VoteDown(IUserProfile user) {
          decrement and update profile
      }

      public SetAnswered(IUserProfile answer) {
           answered_ = answer
           // update u
      }
}

public class CommunityWikiQuestion implements IStackoverflowQuestion {
     public void VoteUp(IUserProfile user) { // do not update profile }
     public void VoteDown(IUserProfile user) { // do not update profile }
     public void SetAnswered(IUserProfile user) { // do not update profile }
}

Certains où ailleurs dans votre base de code, vous pouvez avoir un module qui traite des questions indépendamment de ce qu'ils sont:

public class OtherModuleProcessor {
    public void Process(List<IStackoverflowQuestion> questions) {
       ... process each question.
    }
}

6voto

BalusC Points 498232

Nous allons donner un exemple extrême de couplage serré pour obtenir l’image : vous avez développé un jeu tic tac toe et tout est été mis à l’intérieur de la méthode. Il n’y a pas d’autres classes ou méthodes. Le code de la méthode est en aucun cas réutilisables et a probablement beaucoup de code répété. Il s’agit d’une mauvaise conception. Fractionnement et les tâches et les responsabilités de refactorisation classes/méthodes permettra d’améliorer la cohésion et couplage.

2voto

XIII Points 8731

Je tiens à souligner à cet article : S.O.L.I.D. Software Development, une étape à la fois.

GRZ, Kris.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X