Présentation UML

 

 

Introduction à UML

UML (Unified Modeling Language) est né de la fusion des trois méthodes qui ont le plus influencé la modélisation objet au milieu des années 90 : OMT, Booch et OOSE. Issu "du terrain" et fruit d'un travail d'experts reconnus, UML est le résultat d'un large consensus.

De très nombreux acteurs industriels de renom ont adopté UML et participent à son développement.

L'approche objet est pourtant loin d'être une idée récente. Simula, premier langage de programmation à implémenter le concept de type abstrait à l'aide de classes, date de 1967 ! En 1976 déjà, Smalltalk implémente les concepts fondateurs de l'approche objet : encapsulation, agrégation, héritage. Les premiers compilateurs C++ datent du début des années 80 et de nombreux langages orientés objets "académiques" ont étayés les concepts objets (Eiffel, Objective C, Loops...).

Il y donc déjà longtemps que l'approche objet est devenue une réalité. Les concepts de base de l'approche objet sont stables et largement éprouvés. De nos jours, programmer "objet", c'est bénéficier d'une panoplie d'outils et de langages performants. L'approche objet est une solution technologique incontournable. Ce n'est plus une mode, mais un réflexe quasi-automatique dès lors qu'on cherche à concevoir des logiciels complexes qui doivent "résister" à des changements constants.

Présentation générale d'UML

Lorsqu'il faut approcher un problème informatique, l'approche intuitive est de le découper en aspects fonctionnels. En effet, cette approche semble être la plus naturelle puisque lorsqu'on programme, il est tout aussi naturel de représenter les fonctions de l'application que l'on veut modéliser.

Prenons l'exemple d'un logiciel de gestion de bibliothèque (figure 1). Ainsi, le logiciel est composé d'une hiérarchie de fonctions, qui ensemble, fournissent les services désirés, ainsi que de données qui représentent les éléments manipulés (livres, etc…).

Figure 1

 

 

Problèmes avec l'approche fonctionnelle

En découpant le logiciel en fonctions, il devient difficile de faire une simple mise à jour. En effet, un changement effectué sur une des fonctions peut impliquer des changements majeurs dans une multitude d'autres fonctions. On pourrait contourner ce problème en utilisant des fonctions plus génériques, mais ensuite l'écriture du logiciel devient beaucoup plus difficile.

Vers une approche objet

Pourquoi utiliser une approche orientée objet? Pourquoi ne pas rester avec l'approche fonctionnelle?

Un objet, en génie logiciel, constitue une entité autonome, qui regroupe un ensemble de propriétés cohérentes et de traitements associés. Nous définissons un objet par les caractéristiques suivantes:

  • une entité aux frontières précises qui possède une une identité (un nom)
  • un ensemble d'attributs caractérise l'état de l'objet
  • un ensemble d'opérations (méthodes) en définissent le comportement
  • un objet est une instance de classe
  • une classe est un type de données abstrait, caractérisé par des propriétés (attributs et méthodes) communes à des objets et permettant de créer des objets possédant ces propriétés

 

Exemple:

 

 

Une approche objet permet d'obtenir entre autres:

  1. Encapsulation
    • consiste à masquer les détails d'implémentation d'un objet, en définissant une interface
    • l'interface est la vue externe d'un objet, elle définit les services accessibles (offerts) aux utilisateurs de l'objet
    • l'encapsulation facilite l'évolution d'une application car elle stabilise l'utilisation des objets : on peut modifier l'implémentation des attributs d'un objet sans modifier son interface
    • l'encapsulation garantit l'intégrité des données, car elle permet d'interdire l'accès direct aux attributs des objets (utilisation d'accesseurs)
  2. Héritage et polymorphisme
    • l'héritage est un mécanisme de transmission des propriétés d'une classe (ses attributs et méthodes) vers une sous-classe
    • une classe peut être spécialisée en d'autres classes, afin d'y ajouter des caractéristiques spécifiques ou d'en adapter certaines
    • plusieurs classes peuvent être généralisées en une classe qui les factorise, afin de regrouper les caractéristiques communes d'un ensemble de classes
    • la spécialisation et la généralisation permettent de construire des hiérarchies de classes. L'héritage peut être simple ou multiple
    • l'héritage évite la duplication et encourage la réutilisation
    • le polymorphisme représente la faculté d'une méthode à pouvoir s'appliquer à des objets de classes différentes
    • le polymorphisme augmente la généricité du code

 

Exemple de l'héritage:

 

Exemple de polymorphisme:

 

  1. Agrégation
    • relation entre deux classes, spécifiant que les objets d'une classe sont des composants de l'autre classe. Une relation d'agrégation permet donc de définir des objets composés d'autres objets.
    • l'agrégation permet d'assembler des objets de base, afin de construire des objets plus complexes

 

Exemple d'agrégation:

 

Les objets et l'utilisation d'UML

L'approche objet c'est:

  1. un ensemble de concepts stables, éprouvés et normalisés
  2. une solution destinée à faciliter l'évolution d'applications complexes

Les obstacles de l'approche objet:

  1. l'approche objet est moins intuitive que l'approche fonctionnelle
    • il est plus facile de penser en terme de fonctions que de penser en terme d'objets et d'interactions entre objets
  2. l'application des concepts objets nécessite une grande rigueur
    • il est plutôt difficile de décrire la structure objet d'un système de manière pertinente sans risque d'ambiguïtés

Il nous faut donc un "langage" pour exprimer de façon claire et précise les concepts objets du système que l'on veut modéliser. Ce "langage" est UML (Unified Modeling Language).

L'utilisation d'UML permet de:

  1. représenter graphiquement des concepts abstraits (diagrammes)
  2. limiter les ambiguïtés (parler un langage commun)
  3. faciliter l'analyse (simplifier la comparaison et l'évaluation de solutions)
  4. définir les vues qui permettent de couvrir tous les aspects d'un système avec des concepts objets
  5. penser objet dès le départ

Avantages et inconvénients d'UML

Points forts:

  • UML est un langage formel et normalisé
    • clair et précis
    • encourage l'utilisation d'outils
  • UML est un support de communication performant
    • l'analyse devient plus facile
    • facilite la compréhension de représentations abstraites complexes

Point faible:

  • La mise en pratique d'UML nécessite un apprentissage et passe par une période d'adaptation

Modéliser avec UML

Qu'est-ce que modéliser?

Modéliser consiste à identifier les caractéristiques intéressantes d'une entité, en vue d'une utilisation précise. Une bonne modélisation d'un système devrait permettre de faciliter la compréhension du système en question. En effet, un bon modèle devrait réduire la complexité du système et non de le complexifier. Également, un bon modèle devrait permettre de simuler le système en question. Un bon modèle devrait reproduire les comportements importants du système étudié.

Étapes de modélisation avec UML?

Il existe plusieurs approches pour modéliser un système avec UML. Nous allons vous proposer une méthode générale pour construire le modèle d'un système. Voici les grandes lignes:

  1. Identifier les classes (objets)
    • rechercher les classes candidates à l'aide du diagramme d'objets
    • filtrer les classes redondantes, trop spécifiques ou vagues, qui ne représentent qu'une opération ou un attribut
  2. Identifier les associations entre classes / interactions entre objets (instances)
    • rechercher les connexions sémantiques et les relations d'utilisation
    • documenter les relations (nom, cardinalités, contraintes, rôles des classes, etc.)
    • en spécification, filtrer les relations instables ou d'implémentation
    • définisser la dynamique des relations entre objets (les interactions entre instances de classes et les activités associées)
  3. Identifier les attributs et les opérations des classes
    • rechercher les attributs dans les modèles dynamiques (rechercher les données qui caractérisent les états des objets)
    • rechercher les opérations parmi les activités et actions des objets
  4. Optimiser les modèles
    • utiliser la généralisation et la spécialisation (classification)
    • documenter et détailler vos modèles, encapsuler

Comment modéliser avec UML?

La partie la plus importante dans l'élaboration d'un modèle avec UML est de définir et visualiser le modèle à l'aide de diagrammes.

  • un diagramme UML est une représentation graphique, qui s'intéresse à un aspect précis du modèle ; c'est une perspective du modèle, pas "le modèle"
  • chaque type de diagramme UML possède une structure (les types des éléments de modélisation qui le composent sont prédéfinis)
  • un type de diagramme UML véhicule une sémantique précise (un type de diagramme offre toujours la même vue d'un système)
  • combinés, les différents types de diagrammes UML offrent une vue complète des aspects statiques et dynamiques d'un système

Nous allons voir, par la suite, que UML encourage l'utilisation des outils comme TogetherJ afin de faciliter la rédaction des diagrammes UML. L'emploi de tels outils permet de:

  • faciliter la navigation entre les différentes vues
  • centraliser, organiser, partager, synchroniser et versionner les diagrammes
  • faciliter l'abstraction par des filtres visuels
  • simplifier la production de documents et autoriser (dans certaines limites) la génération de code

Modéliser les aspects statiques

  1. Diagramme de cas d'utilisation (use cases)
  2. Diagramme d'objets
  3. Diagramme de classes
  4. Diagramme de composants
  5. Diagramme de déploiement

Modéliser les aspects dynamiques

  1. Diagramme de collaboration
  2. Diagramme de séquences
  3. Diagramme d'états-transitions
  4. Diagramme d'activités