Principes de
conception
GRASP
GRASP
signifie General Responsibility Assignment Software
Patterns (ou Principles) pour Modèles de logiciels
d'attribution de responsabilités générales
guides dans l’attribution des responsabilités aux objets
collaborateurs.
9 patrons GRASP
Creator (Créateur)
Information Expert (Expert en information)
Low Coupling (Couplage faible)
Controller (Contrôleur)
High Cohesion (Cohésion forte)
Indirection (Indirection)
Polymorphism (Polymorphisme)
Protected Variations (Variantes protégées)
RESPONSABILITÉ
● La responsabilité peut être accompli par un seul objet
– ou un groupe d’objets accomplit en collaboration une
responsabilité.
● GRASP nous aide à décider quelle responsabilité doit
être attribuée à quel objet/classe.
● Identifiez les objets et les responsabilités du domaine
problématique, et identifiez également la manière dont
les objets interagissent les uns avec les autres.
● Définir un plan pour ces objets – c'est-à-dire une
classe avec des méthodes mettant en œuvre ces
responsabilités.
CREATOR
Qui crée un objet ? Ou qui devrait créer une nouvelle
instance d’une classe ?
L'objet « Conteneur » crée des objets « contenus ».
Décidez qui peut être créateur en fonction de
l'association des objets et de leur interaction.
EXEMPLE DE CRÉATEUR
Considérez un Magasin de Vidéos (VideoStore) et
aux Vidéos (Video) dans ce magasin.
VideoStore a une association d'agrégation avec
Video c'est-à-dire que VideoStore est le conteneur et
Video est l'objet contenu.
Ainsi, nous pouvons instancier un objet vidéo dans
la classe VideoStore
DIAGRAMME DE L’EXEMPLE
EXEMPLE DE CRÉATEUR
EXPERT
Étant donné un objet o, quelles responsabilités peuvent être
assignées à o ?
Le principe de l'expert dit : attribuez les responsabilités à o
pour lesquelles o dispose des informations nécessaires pour
assumer cette responsabilité.
Ils disposent de toutes les informations nécessaires pour
effectuer des opérations ou, dans certains cas, ils collaborent
avec d'autres pour assumer leurs responsabilités.
EXEMPLE D’EXPERT
Supposons que nous ayons besoin d'obtenir toutes les
vidéos d'un VideoStore.
Puisque VideoStore connaît toutes les vidéos, nous
pouvons attribuer cette responsabilité de « donner
toutes les vidéos » à la classe VideoStore.
VideoStore est l'expert en informations.
EXEMPLE D’EXPERT
EXEMPLE D’EXPERT
COUPLAGE FAIBLE
Dans quelle mesure les objets sont-ils connectés les uns
aux autres ?
Couplage – objet dépendant d'un autre objet.
Lorsque l’élément principal change, cela affecte
également l’élément dépendant.
Couplage faible – Comment pouvons-nous réduire l'impact
du changement de l’élément principal sur l’élément
dépendant.
Préférez un couplage faible – attribuez des responsabilités
de manière à ce que le couplage reste faible.
Minimise la dépendance, rendant ainsi le système
maintenable, efficace et le code réutilisable
COUPLAGE FAIBLE
Deux éléments sont couplés, si
Un élément a une association d'agrégation/composition avec
un autre élément.
Un élément implémente/étend un autre élément.
EXEMPLE DE COUPLAGE
FAIBLE
ici, la classe RentVideo connaît à la fois les
objets VideoStore et Video. La location dépend
des deux classes.
EXEMPLE DE COUPLAGE
FAIBLE
Les classes VideoStore et Video sont couplées, et
RentVideo est couplé à VideoStore offrant ainsi
un couplage faible.
CONTRÔLEUR
Traite la façon de déléguer la demande des objets de la
couche UI aux objets de la couche de domaine.
Lorsqu'une requête provient d'un objet de la couche UI, le
modèle de contrôleur nous aide à déterminer quel est le
premier objet qui reçoit le message des objets de la couche
UI.
Cet objet est appelé objet contrôleur qui reçoit la demande de
l'objet de la couche UI, puis contrôle/coordonne avec un autre
objet de la couche de domaine pour répondre à la demande.
Il délègue le travail à d'autres classes et coordonne l'activité
globale.
CONTRÔLEUR
Nous pouvons créer un objet comme contrôleur, si
L'objet représente le système global (contrôleur de
façade)
L’objet représente un cas d’utilisation, gérant une
séquence d’opérations (contrôleur de session).
Avantages
On peut réutiliser cette classe de contrôleur.
Peut être utilisé pour maintenir l’état du cas d’utilisation.
Peut contrôler la séquence des activités
EXEMPLE DE CONTRÔLEUR
CONTRÔLEURS GONFLÉS
La classe du contrôleur est dite gonflée, si
La classe est surchargée de trop de
responsabilités.
Solution – Ajouter plus de contrôleurs
La classe contrôleur effectue également de
nombreuses tâches au lieu de déléguer à une
autre classe.
Solution – la classe contrôleur doit déléguer des choses
à d’autres.
FORTE COHÉSION
EXEMPLE DE FAIBLE
COHÉSION
EXEMPLE DE COHÉSION
FORTE
POLYMORPHISME
Comment gérer les éléments liés mais variables en
fonction du type d'élément ?
Le polymorphisme nous guide pour décider quel
objet est responsable de la gestion de ces différents
éléments.
Avantages : gérer de nouvelles variantes deviendra
facile.
EXEMPLE DE
POLYMORPHISME
getArea() varie selon le type de forme, nous attribuons
donc cette responsabilité aux sous-classes.
En envoyant un message à l'objet Shape, un appel sera
effectué vers l'objet de sous-classe correspondant –
Cercle ou Triangle.
FABRICATION PURE
Classe fabriquée/classe artificielle – attribue un ensemble de
responsabilités associées qui ne représentent aucun objet de
domaine.
Fournit un ensemble d'activités très cohérent.
Comportement décomposé – implémente un algorithme.
Exemples : adaptateur, stratégie
Avantages : Cohésion élevée, faible couplage et possibilité de
réutiliser cette classe.
EXEMPLE DE FABRICATION
PURE
Supposons que nous ayons une classe Shape, si nous
devons stocker les données de forme dans une base de
données.
Si nous mettons cette responsabilité dans la classe Shape,
il y aura de nombreuses opérations liées à la base de
données rendant ainsi Shape incohésive.
Créez donc une classe DBStore fabriquée qui est chargée
d'effectuer toutes les opérations de base de données.
De même, logInterface, responsable de la journalisation des
informations, est également un bon exemple pour Pure
Fabrication.
INDIRECTION
Comment éviter un couplage direct entre deux ou plusieurs
éléments.
L'indirection introduit une unité intermédiaire pour
communiquer entre les autres unités, de sorte que les autres
unités ne soient pas directement couplées.
Avantages : faible couplage
Exemple : Adaptateur, Façade, Observer
EXEMPLE D’INDIRECTION
Ici, le polymorphisme illustre l'indirection
La classe Employé fournit un niveau d’indirection
vers d'autres unités du système.
VARIANTE PROTÉGÉE
Comment éviter l'impact des variations de certains
éléments sur les autres éléments.
Il fournit une interface bien définie afin qu'il n'y ait
aucun effet sur les autres unités.
Offre flexibilité et protection contre les variations.
Fournit une conception plus structurée.
Exemple : polymorphisme, encapsulation de données,
interfaces