Introduction
Je pense que tout le monde a entendu dans son enfance un dicton tel que « Mesurer deux fois, couper une fois ». C'est la même chose en programmation. Il est toujours préférable de réfléchir à la mise en œuvre avant de consacrer du temps à son exécution. Souvent, lors de la mise en œuvre, il faut créer des classes et inventer leur interaction. Et souvent, une représentation visuelle de cela peut aider à résoudre le problème de la manière la plus correcte. C'est là qu'UML nous aide .Qu’est-ce qu’UML ?
Si vous regardez des images dans les moteurs de recherche, vous verrez clairement qu'UML est une question de diagrammes, de flèches et de carrés. Ce qui est important, c'est qu'UML se traduise en langage de modélisation unifié . Le mot Unifié est important ici. Autrement dit, nos images seront comprises non seulement par nous, mais aussi par d'autres personnes connaissant UML. Il s'avère qu'il s'agit d'un langage international pour dessiner des diagrammes.
Comme le dit Wikipédia
UML est un langage de description graphique pour la modélisation d'objets dans le développement de logiciels, la modélisation de processus métier, la conception de systèmes et l'affichage des structures organisationnelles.La chose la plus intéressante à laquelle tout le monde ne pense ou ne se rend pas compte est qu'UML a des spécifications. De plus, il existe même une spécification UML2. Plus de détails sur la spécification peuvent être trouvés sur le site Web d'Object Management Group . Actuellement, ce groupe développe des spécifications UML. Il est également intéressant de noter qu’UML ne se limite pas à décrire la structure des classes. Il existe de nombreux types de diagrammes UML. Une brève description des types de diagrammes UML peut être vue dans le même Wikipédia : Diagrammes UML ou dans la vidéo de Timur Batyrshinov Revue des diagrammes UML . UML est également largement utilisé pour décrire divers processus, par exemple ici : Single sign-on using JWT . Revenant à l'utilisation des diagrammes de classes UML, il convient de noter le livre Head First: Design Patterns , dans lequel les modèles sont illustrés par ces mêmes diagrammes UML. Il s’avère qu’UML est effectivement utilisé. Et il s'avère que la connaissance et la compréhension de son application sont une compétence très utile.
Application
Voyons comment vous pouvez travailler avec ce même UML depuis l'EDI. Prenons IntelliJ Idea comme un IDE . Si nous utilisons IntelliJ Idea Ultimate , le plugin « UML Support » sera installé prêt à l'emploi. Il vous permet de générer automatiquement de superbes diagrammes de classes. Par exemple, en utilisant Ctrl+N ou l'élément de menu "Navigate" -> "Class", nous accédons à la classe ArrayList . Maintenant, via le menu contextuel du nom de la classe, sélectionnez « Diagramme » -> « Afficher la fenêtre contextuelle du diagramme ». En conséquence, nous obtenons un beau schéma :
@startuml
class ArrayList {
}
class LinkedList {
}
@enduml
Pour voir le résultat dans Idea, sélectionnez "Affichage" -> "Tool Windows" -> "PlantUML". Nous aurons juste deux carrés représentant les classes. Comme nous le savons, ces deux classes implémentent l'interface List. Cette relation de classe est appelée implémentation. Pour représenter une telle connexion, utilisez une flèche avec une ligne pointillée. Représentons-le :
interface List
List <|.. ArrayList
List <|.. LinkedList
List
- une des classes enfants Collection
. Autrement dit, il hérite de Collection. Cette connexion est appelée généralisation. Cela ressemble à une flèche avec une ligne continue régulière. Représentons-le :
interface Collection
Collection <|-- List
Pour le type de connexion suivant, ajoutez à la description de la classe ArrayList
une entrée sur le tableau privé d'éléments du package :
~Object[] elementData
Nous voulons maintenant montrer ce que ArrayList
contiennent certains objets. Dans ce cas, le type de connexion sera agrégation . L'unité dans ce cas est ArrayList
, car il contient d'autres objets. Nous choisissons l'agrégation car les objets de la liste peuvent vivre sans la liste : ils n'en font pas partie intégrante. Leur durée de vie n'est pas liée à celle de la liste. Agrégat est traduit du latin par « assemblé », c'est-à-dire quelque chose composé de quelque chose. Par exemple, dans la vie, il existe une unité de pompage composée d’une pompe et d’un moteur. L'unité elle-même peut être démontée, laissant certains de ses composants. Par exemple, pour vendre ou mettre dans une autre unité. La liste aussi. Et cela s'exprime sous la forme d'un losange vide à proximité de l'unité et d'une ligne continue. Représentons-le comme ceci :
class Object{
}
ArrayList o- Object
Nous voulons maintenant montrer que, contrairement à ArrayList
, la classe LinkedList
contient Node
des conteneurs qui font référence aux données stockées. Dans ce cas, Node
ils font partie d’eux-mêmes LinkedList
et ne peuvent pas vivre séparément. Node
n'est pas un contenu directement stocké, mais contient uniquement un lien vers celui-ci. Par exemple, lorsque nous ajoutons à LinkedList
une ligne, nous ajoutons un new Node
, qui contient un lien vers cette ligne, ainsi qu'un lien vers le previous et le next Node
. Ce type de communication est appelé composition . Pour afficher un composite (constitué de pièces), un losange coloré est dessiné, avec une ligne continue qui y mène. Écrivons maintenant ceci sous la forme d'un affichage textuel de la connexion :
class Node{
}
LinkedList *-- Node
Et maintenant, nous devons apprendre à afficher un autre type important de relation : la relation de dépendance . Il est utilisé lorsqu'une classe en utilise une autre et que la classe ne contient pas la classe utilisée et n'est pas son descendant. Par exemple, LinkedList
ils ArrayList
savent créer des ListIterator
. Affichons cela sous forme de flèches avec une ligne pointillée :
class ListIterator
ListIterator <... ArrayList : create
ListIterator <... LinkedList : create
Après tout cela, cela ressemblera à ceci :
Automatisation
Il existe différentes manières de générer automatiquement des diagrammes PlantUML. Par exemple, Idea dispose d’un plugin SketchIT , mais il ne les dessine pas tout à fait correctement. Par exemple, l'implémentation des interfaces est mal dessinée (affichée comme héritage). Il existe également des exemples sur Internet montrant comment intégrer cela dans le cycle de vie de votre projet. Disons qu'il existe un exemple pour Maven utilisant uml-java-docklet . Pour montrer comment cela se fait, nous utiliserons Maven Archetype pour créer rapidement un projet Maven. Exécutons la commande :mvn archetype:generate
Lorsqu'on vous demande de sélectionner un filtre ( Choisir un nombre ou appliquer un filtre ), laissez la valeur par défaut en appuyant simplement sur Entrée. Ce sera toujours " maven-archetype-quickstart ". Sélectionnez la dernière version. Ensuite, nous répondons aux questions et terminons la création du projet :
mvn clean install
: et mvn javadoc:javadoc
. Maintenant, si nous ouvrons la documentation générée (explorer target\site\apidocs\index.html), nous verrons les diagrammes UML. D'ailleurs, l'implémentation est déjà affichée correctement ici)
GO TO FULL VERSION