<visibility> nomAttribut : <type>
avec
type = primitif ou classe
visibility = + (public), # (protected), - (private), ~ (package)
Autres options :
<visibility> nomAttribut[multiple] : <type> = <initial value> {property}
avec multiple = nombre d'éléments ou min .. max
si attribut statique : souligné
Exemples
- x : Real = 10.0
+ coordinates[3] : Real
subscribers[2..8] : People
- balance : Dollars
- timeOfFlight : Minutes {not null}
# annualRate : Percentage
Représentation des opérations
<visibility> nameOperation (<arguments>) : <returnType>
avec
arguments selon le format : name : type = <defaultValue>`
Méthode de classe (static) : nameOperation()
Membres dérivés
Propriété redondante, dérivée d'autres propriétés déjà
allouées
Notation précédée de / : /nomAttribut
ex : Classe Boule avec attributs rayon, PI et /volume
Un attribut dérivé peut donner lieu à une opération qui encapsulera le calcul effectué
Association entre classes
Exprime une connexion sémantique entre des classes (le plus souvent 2)
Nom : décrit la relation
forme verbale, active ou passive
avec sens de lecture
Rôles : décrivent comment chaque classe voit l'autre
forme nominale
Arités : portent une indication de multiplicité
nombre d'objets de la classe considérée pouvant être liés à un objet de l'autre classe
Association : interprétation
une classe C1 “nom” une classe C2 (ou l'inverse selon sens)
une classe C1 est “rôle1” d'une classe C2 et “mult1” C1 peuvent jouer ce rôle pour une C2
la classe C1 a un attribut de nom “rôle2” dont le type est C2 si “mult2” ∈ {1, 0..1} ou collection de C2 sinon
Association : arités
1
un et un seul
0..1
zéro ou un
M .. N
de M à N (entiers naturels)
*
de zéro à plusieurs
0 .. *
de zéro à plusieurs
1 .. *
de un à plusieurs
Association : navigabilité
Capacité d'une instance de C1 (resp. C2) à accéder aux instances de C2 (resp. C1)
par défaut : navigabilité dans les deux sens
C1 a un attribut de type C2 et C2 a un attribut de type C1
peut être spécifiée/orientée
ex : C1 a un attribut du type de C2, mais pas l'inverse
Association : composition
Attributs contenus physiquement dans la classe composite
Relation transitive et antisymétrique
La création (resp copie, destruction) du composite (container) implique la création (resp copie, destruction) de ses composants
Un composant appartient à au plus un composite
Association : agrégation
Simple regroupement de parties dans un tout
La création (resp. la destruction) des composants est indépendante de la
création (resp. la destruction) du composite
Un objet peut faire partie de plusieurs composites à la fois
Héritage/Généralisation/Spécialisation
Relation transitive, non réflexive, et non symétrique
Rappel : la sous-classe “est-une-sorte-de” la super classe
Toute instance de la sous-classe est instance de la super classe
Classes et opérations abstraites
Classe : mot clé {abstract} devant le nom, ou nom en italique
Opération : nom en italique
Interface
Mot clé «interface» devant le nom
Héritage : identique à l'héritage entre classes
Implémentation : pointillés
Utilisation : pointillés et mot clé «use»
(a)
(b)
Figure 1.
Diagramme de classe : exemple récapitulatif
Diagramme des cas d'utilisation
Use-Case Diagrams (UCD)
Diagramme des cas d'utilisation : objectifs
Permettre au client/utilisateur de décrire ses besoins
Déterminer les buts et l'étendue du système
Support de communication
Aide à un accord (contrat) entre clients et développeurs
Aide au développement
Support de communication
Découpage en tâches réparties
Concevoir les IHM
Base pour les tests fonctionnels
“Cas d'utilisation”
Expression du comportement du système du point de vue de l'utilisateur
Séquence d‘interactions entre le système et un ensemble d’“acteurs”
Représentation générale et synthétique d'un ensemble de scénarios similaires
ex : “un joueur joue un coup”
Les acteurs
Interagissent avec le système, en échangeant de l'information (en entrée et en sortie)
personne ou autre système
utilisateurs directs
ou qui fournissent un service au système
Ne pas raisonner en terme d'entité physique, mais de rôle
Une même entité peut jouer le rôle de plusieurs acteurs
Plusieurs entités peuvent jouer le même rôle, et donc agir comme le même acteur
Définir les cas d'utilisation consiste à identifier les buts des acteurs (verbe à l'infinitif)
Relation entre cas d'utilisation
Généralisation
Inclusion
Extension
Diagramme de séquence
Représentation graphique d'un scénario particulier
des objets dans une situation donnée (instances)
les messages échangés entre les objets
Diagramme de séquence
Accent mis sur la communication, non sur la structure spatiale
chaque objet est représenté par une barre verticale (sa ligne de vie)
le temps s'écoule de haut en bas (numérotation des messages est optionnelle)
Conclusion UML
Langage de modélisation objet
Une notation, pas une méthode ou un processus
Convient pour toutes les méthodes objet
Dans le domaine public
Avantages UML
Concensus autour de son utilisation : standard dans l'industrie
Notation avec une syntaxe très riche, tout en restant intuitive
Intégration dans des ateliers de génie logiciel avec production de squelettes de codes et autres transformations automatiques des modèles
Inconvénients UML
Notation majoritairement graphique pouvant se révéler insuffisante ou trop chargée
Sémantique floue ou mal définie pour certains types de diagrammes
Lien parfois difficile entre les vues et diagrammes d'une même application
"Drawing UML diagrams is a reflection of making decisions about the object
design.
The object design skills are what really matter, rather than knowing
how to draw UML diagrams."
Applying UML and Patterns, Craig Larman
Références utilisées
Ressources en ligne et figures
C. Solnon, INSA de Lyon - 3IF
E. Cariou, Univ. Pau
Braffort, F. Terrier & D. Roussel
Principes SOLID
Problèmes de développement classiques
Rigidité
Chaque changement cause une cascade de modifications dans les modules dépendants => une intervention a priori simple devient un cauchemar
Fragilité
Une modification du code a des répercussions sur des modules n'ayant aucune relation avec le code modifié
Immobilisme
Des modules ne peuvent pas être réutilisés par d'autres projets ou même par d'autres parties du même logiciel
Viscosité
Il est plus facile de faire un contournement plutôt que de respecter la conception qui avait été pensée
Software entities should be open for extension, but closed for modification
Une classe, une méthode, un module doivent pouvoir être étendus, supporter différentes implémentations (open) sans pour autant devoir être modifiés (closed)
Par exemple :
Une classe ne peut être modifiée que pour corriger des erreurs. L'ajout de nouvelles fonctionnalités ne peut se faire que par la création de nouvelles classes (ex. des sous-classes de la première)
On utilise au maximum le polymorphisme : des interfaces figées qui peuvent être implantées librement et augmentées par héritage
Pas obligatoire de rendre toutes les modules abstraits pour réduire le couplage, ou toutes les créations d'objet indépendantes des implémentations sous peine d'avoir plus d'interfaces et de fabriques que de classes concrètes
Possible de commencer l'implémentation sans suivre l'ensemble des principes SOLID, et de les mettre en œuvre quand nécessaire (ajout d'un cas particulier, d'une condition, d'une nouvelle implémentation…)
L'apparition d'instanciations conditionnelles, de conditions sur le type d'une classe… sont des signaux en faveur d'un éventuel refactoring
“There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult”