Dans ce module, vous avez étudié :
La version actuelle d’UML est constituée de 14 diagrammes, que l’on peut scinder en 3 grands groupes :
les diagrammes structurels, qui définissent les différents éléments qui constituent votre application,
les diagrammes de comportement, qui définissent comment ces éléments se comportent tout au long de l’application,
les diagrammes d’interaction, qui définissent comment les éléments interagissent entre eux.
Nous avons vu un diagramme de chacun de ces groupes.
perspective conceptuelle des classes intervenant dans le logiciel.
représentation des instances de classes utilisées dans le logiciel.
représentation des composants du système d’un point de vue physique, tels qu’ils sont mis en œuvre (fichiers, bibliothèques, etc.).
gestion des dépendances entre packages.
représentation des éléments physiques (ordinateurs, périphériques, etc.) et la manière dont les composants du système sont répartis sur ces éléments matériels et interagissent entre eux.
représentation des relations entre composants d’une classe.
Diagramme de profil (Profile diagram)
représentation des interactions possibles entre le système et les acteurs (intervenants extérieurs au système).
représentation sous forme de flux ou d’enchaînements d’activités du comportement du système ou de ses composants.
représentation sous forme de machine à états finis du comportement du système ou de ses composants.
représentation séquentielle des traitements et des interactions entre les éléments du système et/ou ses acteurs.
représentation simplifiée d’un diagramme de séquence
représentation des enchaînements possibles entre les scénarios identifiés sous forme de diagrammes de séquences.
représentation de l’évolution d’une donnée au cours du temps.
On peut décomposer l’élaboration d’une application en 4 grandes phases :
Ici, on s’intéresse au « quoi faire » et non au « comment faire ». Il s’agit donc de déterminer quels sont les acteurs exploitant l’application et, surtout, leur buts. On va ainsi déterminer les grandes fonctionnalités de l’application.
Les diagrammes UML utiles pour cette phase sont, en particulier :
les diagrammes de cas d’utilisation,
les diagrammes de séquences « systèmes »,
les diagrammes d’activités.
Ici, on essaye de déterminer les classes de l’application, leurs relations et leurs attributs. On décrit les abstractions et les informations essentielles du domaine.
Les diagrammes UML utiles pour cette phase sont, en particulier :
les diagrammes de classes,
les diagrammes d’objets.
Ici, on détermine les méthodes, les types, les dépendances entre packages. On décrit les interactions entre objets et les sens de navigabilité (un objet dépend d’un autre mais pas inversement).
Les diagrammes UML utiles pour cette phase sont, en particulier :
les diagrammes de packages,
les diagrammes d’interactions.
Ici, on s’appuie beaucoup sur les diagrammes de classes et de séquence afin de coder l’application. Attention : on ne débute pas le codage avant de savoir précisément ce que l’on doit coder, autrement dit avant que les diagrammes mentionnés ci-dessus soient bien clairs !
On peut séparer ces design patterns en plusieurs catégories. Ici, j’en ai choisi 3 :
dont le but est de permettre de construire des objets complexes répondant à certaines spécifications ou contraintes. Parmi ces design patterns, on trouve :
dont le but est de structurer des objets complexes :
dont le but est d’étendre le comportement, les fonctionnalités, d’objets ou, tout simplement, de rendre certaines fonctionnalités possibles :
Les design patterns indiqués en rouge sont ceux décrits dans les séances suivantes.
Une référence utile avec plein d'exemples et d'explications : Refactoring Guru.
Soit quatre classes A, B, C, D. On souhaite émuler en Java le fait que D hérite de A, B, C.
Question :
Proposez une solution en UML pour cela. Quel design pattern utiliseriez-vous ?

L’ingénieur de votre entreprise a développé un logiciel de contrôle suivant le schéma UML ci-dessous. L’idée est la suivante : on a une classe Streamer qui gère un flux de données. Celles-ci sont traitées via une classe ProcessingUnit qui peut exécuter ses calculs soit sur GPU (CUDA) soit sur CPU. Les données ainsi traitées peuvent être affichées par le centre de contrôle via la méthode displayProcessing().
Plus précisément, lors de sa construction, le ControlCenter exécute une thread timedProcess() qui se réveille toutes les 15ms afin de demander au ProcessingUnit qu’il contient s’il y a eu une update des données, auquel cas ces données sont traitées par la méthode getProcessingUpdate() et affichées via la méthode displayProcessing(). Ce processus n’est pas optimal dans la mesure où les updates apparaissent plutôt toutes les 2 ou 3 secondes, mais le logiciel fonctionne malgré tout correctement.
Question :
Récemment embauché dans l’entreprise, on vous demande de mettre à jour ce schéma UML pour qu’il soit SOLID et efficace. En exploitant les design patterns, quel nouveau schéma UML proposez-vous?