diff --git a/AnalyseConception.qmd b/AnalyseConception.qmd index af2a38e4..3178ffbb 100644 --- a/AnalyseConception.qmd +++ b/AnalyseConception.qmd @@ -23,7 +23,7 @@ La **conception** sous-entend l'élaboration d'une solution conceptuelle répond -```{.plantuml #fig-mddDes caption="Diagramme de *classes conceptuelles* décrivant (modélisant) le *problème* d'un jeu de dés (figure 1.3\ {{< fa solid book >}}) avec des statistiques. Ceci est élaboré lors d'une activité d'analyse."} +```{#fig-mddDes .plantuml genurl="true" caption="Diagramme de *classes conceptuelles* décrivant (modélisant) le *problème* d'un jeu de dés (figure 1.3\ {{< fa solid book >}}) avec des statistiques. Ceci est élaboré lors d'une activité d'analyse. "} @startuml !include ecriture.pumlinclude 'left to right direction @@ -43,7 +43,7 @@ Joueur "*" -l- "1" JeuDeDés : joue > @enduml ``` -```{.plantuml #fig-ddcDes caption="Diagramme de *classes logicielles* décrivant une *solution* au problème du jeu de dés. La conception s'inspire du modèle du problème, afin de faciliter sa compréhension."} +```{.plantuml genurl="true" #fig-ddcDes caption="Diagramme de *classes logicielles* décrivant une *solution* au problème du jeu de dés. La conception s'inspire du modèle du problème, afin de faciliter sa compréhension."} @startuml !include ecriture.pumlinclude 'left to right direction @@ -160,7 +160,7 @@ Cette forme de complexité comprend des aspects d'une solution qui ne sont pas s Dans un environnement d'exécution, il y a des dimensions comme le ramasse-miettes (*garbage collection*), l'ordonnancement des fils d'exécution (*threads*) sur un serveur, l'utilisation de *conteneurs* (à la Docker), etc. qui peuvent affecter la qualité d'un logiciel. Les ingénieures et ingénieurs doivent gérer ces formes de complexité, mais il n'y a pas beaucoup de stratégies évidentes face aux technologies qui évoluent à grande vitesse. -```{.plantuml #fig-complexitySources caption="Sources de complexité (inhérente, circonstancielle et environnementale) par rapport au processus de développement (analyse, conception et implémentation)."} +```{.plantuml genurl="true" #fig-complexitySources caption="Sources de complexité (inhérente, circonstancielle et environnementale) par rapport au processus de développement (analyse, conception et implémentation)."} @startuml scale 0.8 !include normal.pumlinclude @@ -223,7 +223,7 @@ Avec la rétroaction du client et l'adaptation, le système à développer conve Cette instabilité peut être particulièrement prononcée dans un contexte d'entreprise en démarrage. - Dans une itération, la modélisation (par exemple avec l'UML) se fait au début et devrait prendre beaucoup moins de temps (quelques heures) que la programmation, qui n'est pas triviale (voir la @fig-AnalyseConceptionDansLesIterations). Selon le contexte du projet (voir le [Spectre de la conception](#sec-SpectreDeLaConception)), on peut décider de ne pas faire de modélisation. Cependant, en fonction de la complexité du projet à réaliser, cela peut amener des risques, ce que l'on appelle la [dette technique](#sec-DetteTechnique). -```{.plantuml #fig-Modèle_processus_itératif caption="Un processus itératif permet de gérer les complexités, car la planification d'une itération peut viser une partie du système et le système évolue à mesure que les itérations avancent."} +```{.plantuml genurl="true" #fig-Modèle_processus_itératif caption="Un processus itératif permet de gérer les complexités, car la planification d'une itération peut viser une partie du système et le système évolue à mesure que les itérations avancent."} @startuml Iteration !include normal.pumlinclude skinparam defaultTextAlignment center diff --git a/Annexe_Cas_utilisation_Ouvrir_caisse.qmd b/Annexe_Cas_utilisation_Ouvrir_caisse.qmd index d406d30f..99ff7a52 100644 --- a/Annexe_Cas_utilisation_Ouvrir_caisse.qmd +++ b/Annexe_Cas_utilisation_Ouvrir_caisse.qmd @@ -8,7 +8,7 @@ En effet, ce cas d'utilisation n'est pas présenté en détail par @craig_uml_20 Alors, nous proposons pour cet exercice des modifications au modèle du domaine présenté par Larman afin de modéliser cette fonctionnalité additionnelle du logiciel. ::: -```{.plantuml #fig-DCU_ouvrir_la_caisse caption='Diagramme de cas d\'utilisation pour le système NextGen.'} +```{.plantuml genurl="true" #fig-DCU_ouvrir_la_caisse caption='Diagramme de cas d\'utilisation pour le système NextGen.'} @startuml !include normal.pumlinclude scale 1.0 @@ -121,7 +121,7 @@ Les associations en rouge sont celles qui sont affectées par la dynamique de ce La @fig-DSS_ouvrir_la_caisse est le diagramme de séquence système (DSS) pour le scénario _Ouvrir la caisse_. -```{.plantuml #fig-DSS_ouvrir_la_caisse caption='Diagramme de séquence système (DSS) pour le scénario _Ouvrir la caisse_.'} +```{.plantuml genurl="true" #fig-DSS_ouvrir_la_caisse caption='Diagramme de séquence système (DSS) pour le scénario _Ouvrir la caisse_.'} @startuml !include normal.pumlinclude skinparam SequenceMessageAlign center diff --git a/Annexe_Cas_utilisation_Traiter_vente.qmd b/Annexe_Cas_utilisation_Traiter_vente.qmd index 56d9f60a..81db7d32 100644 --- a/Annexe_Cas_utilisation_Traiter_vente.qmd +++ b/Annexe_Cas_utilisation_Traiter_vente.qmd @@ -4,7 +4,7 @@ Voici des artefacts en PlantUML proposés pour le cas d'utilisation *Traiter une ## DSS {#sec-DSS_traiter_vente} -```{.plantuml caption="DSS pour le scénario _Traiter une vente_ de @craig_uml_2005."} +```{.plantuml genurl="true" caption="DSS pour le scénario _Traiter une vente_ de @craig_uml_2005."} @startuml !include normal.pumlinclude skinparam SequenceMessageAlign center @@ -25,7 +25,7 @@ c<<--s : remise de la monnaie, du reçu ## MDD partiel -```{.plantuml caption="MDD pour le scénario _Traiter une vente_ de @craig_uml_2005."} +```{.plantuml genurl="true" caption="MDD pour le scénario _Traiter une vente_ de @craig_uml_2005."} @startuml !include normal.pumlinclude hide methods diff --git a/CasUtilisation.qmd b/CasUtilisation.qmd index c05a2eb6..4363ed8f 100644 --- a/CasUtilisation.qmd +++ b/CasUtilisation.qmd @@ -79,7 +79,7 @@ Sur la @fig-uc, le cas d'utilisation "..." signifie qu'il y a d'autres cas d'uti Le cas d'utilisation *Démarrer* n'est pas normalement indiqué dans un diagramme. C'est une astuce pédagogique proposée par @craig_uml_2005, car il faudra concevoir et coder ce scénario, bien qu'il ne soit pas une fonctionnalité connue par l'utilisateur. -```{.plantuml #fig-uc caption="Diagramme de cas d'utilisation." } +```{.plantuml genurl="true" #fig-uc caption="Diagramme de cas d'utilisation." } @startuml !include ecriture.pumlinclude skinparam usecase<> { diff --git a/ConceptionPackages.qmd b/ConceptionPackages.qmd index b6b35d15..36843fc0 100644 --- a/ConceptionPackages.qmd +++ b/ConceptionPackages.qmd @@ -17,7 +17,7 @@ Les points importants sont les suivants (les détails se trouvent dans le livre) La @fig-DiagrammePackage est un exemple d'un diagramme de packages. -```{.plantuml #fig-DiagrammePackage caption="Diagramme de packages (tiré de la figure F12.6\ {{< fa solid book >}})." } +```{.plantuml genurl="true" #fig-DiagrammePackage caption="Diagramme de packages (tiré de la figure F12.6\ {{< fa solid book >}})." } @startuml !include ecriture.pumlinclude scale 0.8 diff --git a/DSS.qmd b/DSS.qmd index 54147a8c..c49f171d 100644 --- a/DSS.qmd +++ b/DSS.qmd @@ -22,7 +22,7 @@ La requête HTTP contient l'URI vers la routine à accéder, la [méthode de req Les interfaces humain-machine (IHM), dont les interfaces graphiques, ne sont pas une interface API puisqu'elles ne peuvent être utilisées de manière logicielle. Elles permettent de faire le pont entre les utilisateurs et utilisatrices (qui communiquent par les gestes, par exemple un clic avec une souris) et l'interface API du logiciel afin d'en faciliter l'utilisation. -```{.plantuml #fig-apiclasse caption="Les méthodes publiques d'une classe sont un exemple d'interface API." } +```{.plantuml genurl="true" #fig-apiclasse caption="Les méthodes publiques d'une classe sont un exemple d'interface API." } @startuml !include normal.pumlinclude @@ -96,7 +96,7 @@ Il y a d'autres bénéfices de cette séparation, mais elle impose certaines rè ::: {#fig-separation_couches layout-ncol=2} -```{.plantuml caption="Sans séparation, les éléments de l'IHM sont fortement couplés aux éléments de la logique de l'application. Ce genre de solution peut être créé rapidement. Cependant, si le code de l'IHM doit changer pour accommoder une nouvelle technologie, ces changements peuvent affecter le reste du système." #fig-sans_separation} +```{.plantuml genurl="true" caption="Sans séparation, les éléments de l'IHM sont fortement couplés aux éléments de la logique de l'application. Ce genre de solution peut être créé rapidement. Cependant, si le code de l'IHM doit changer pour accommoder une nouvelle technologie, ces changements peuvent affecter le reste du système." #fig-sans_separation} @startuml !include normal.pumlinclude hide empty members @@ -139,7 +139,7 @@ P3 -d- D6 @enduml ``` -```{.plantuml caption="La définition et la séparation des couches présentation et domaine permettent de minimiser l'impact des changements dus aux évolutions dans les technologies liées à l'IHM et d'avoir une conception plus cohésive. Cependant, cette séparation requiert un respect de l'architecture par les développeurs et développeuses." #fig-avec_separation} +```{.plantuml genurl="true" caption="La définition et la séparation des couches présentation et domaine permettent de minimiser l'impact des changements dus aux évolutions dans les technologies liées à l'IHM et d'avoir une conception plus cohésive. Cependant, cette séparation requiert un respect de l'architecture par les développeurs et développeuses." #fig-avec_separation} @startuml !include normal.pumlinclude hide empty members @@ -233,7 +233,7 @@ La @fig-dssattaquerunpays est un exemple de DSS pour le cas d'utilisation *Attaq Dans cet exemple, il y a quatre opérations système (avec les arguments de type primitif, sauf la dernière qui n'a aucun argument) et un message de retour. Vous pouvez noter tous les détails (titre, arguments, types). -```{.plantuml #fig-dssattaquerunpays caption="Diagramme de séquence système pour le scénario *Attaquer un pays*." } +```{.plantuml genurl="true" #fig-dssattaquerunpays caption="Diagramme de séquence système pour le scénario *Attaquer un pays*." } @startuml !include ecriture.pumlinclude scale 1 @@ -259,7 +259,7 @@ Le "Système" est modélisé comme une boîte noire. Par exemple, sur la @fig-dssabstraction, il y a l'acteur, le Système et une opération système. On ne rentre pas dans les détails, bien qu'ils existent et soient importants. -```{.plantuml #fig-dssabstraction caption="Une opération système dans un DSS. C'est une abstraction." } +```{.plantuml genurl="true" #fig-dssabstraction caption="Une opération système dans un DSS. C'est une abstraction." } @startuml !include ecriture.pumlinclude scale 1.3 @@ -279,7 +279,7 @@ Par exemple, la @fig-dssdetails rentre dans les détails de ce qui se passe rée - Un routeur transforme l'appel REST en une opération système envoyée à un contrôleur GRASP. Notez que c'est un **objet du domaine qui reçoit l'opération système** -- c'est l'essence du principe GRASP Contrôleur; - Le contrôleur GRASP dirige la suite, selon la solution proposée dans la réalisation de cas d'utilisation (RDCU). -```{.plantuml #fig-dssdetails caption="Une opération système est envoyée par la couche présentation et elle est reçue dans la couche domaine par son contrôleur GRASP. Ceci est un exemple avec un navigateur Web, mais d'autres possibilités existent pour la couche présentation."} +```{.plantuml genurl="true" #fig-dssdetails caption="Une opération système est envoyée par la couche présentation et elle est reçue dans la couche domaine par son contrôleur GRASP. Ceci est un exemple avec un navigateur Web, mais d'autres possibilités existent pour la couche présentation."} @startuml !include normal.pumlinclude scale 1 diff --git a/DiagrammesActivites.qmd b/DiagrammesActivites.qmd index 80f55cb9..0fa4e6c9 100644 --- a/DiagrammesActivites.qmd +++ b/DiagrammesActivites.qmd @@ -17,7 +17,7 @@ Voici les éléments importants d'un diagramme d'activités: La @fig-ActivityDiagramExampleGitCommit présente un exemple de diagramme d'activité décrivant de manière générale une partie du processus de travail d'une personne utilisant `git` pour la gestion de code source. -```{.plantuml #fig-ActivityDiagramExampleGitCommit caption="Diagramme d'activité pour un processus simple avec Git." } +```{.plantuml genurl="true" #fig-ActivityDiagramExampleGitCommit caption="Diagramme d'activité pour un processus simple avec Git." } @startuml !include normal.pumlinclude skinparam DefaultTextAlignment center @@ -53,7 +53,7 @@ Il ne s'agit pas de l'UML, mais cette notation est encore utilisée (depuis les Un exemple de diagramme d'activités dans le cadre d'un cours de programmation utilisant GitHub Classroom est illustré sur la @fig-GitHubClassroomActivities. Ce diagramme explique comment GitHub Classroom permet à l'étudiant ou étudiante qui accepte un devoir (*assignment* en anglais) sur GitHub Classroom de choisir son identité universitaire (activité en couleur rose), mais seulement si l'enseignant ou enseignante a téléversé la liste de classe (activité en couleur rose) *avant* d'envoyer les invitations à la communauté étudiante. -```{.plantuml #fig-GitHubClassroomActivities caption="Diagramme d'activités pour les activités séquentielles de GitHub Classroom (contexte de l'ÉTS avec Moodle)." } +```{.plantuml genurl="true" #fig-GitHubClassroomActivities caption="Diagramme d'activités pour les activités séquentielles de GitHub Classroom (contexte de l'ÉTS avec Moodle)." } @startuml !include normal.pumlinclude skinparam DefaultTextAlignment center diff --git a/DiagrammesDeploiement.qmd b/DiagrammesDeploiement.qmd index f26c98f2..4b68b89d 100644 --- a/DiagrammesDeploiement.qmd +++ b/DiagrammesDeploiement.qmd @@ -24,7 +24,7 @@ Voici les éléments importants: La @fig-DiagrammeDeploiement est un exemple de diagramme de déploiement (laboratoire). La @fig-iTunesDiagrammeDeploiement est un exemple de diagramme de déploiement pour le logiciel iTunes d'Apple. -```{.plantuml #fig-DiagrammeDeploiement caption="Diagramme de déploiement du système à développer pour le laboratoire." } +```{.plantuml genurl="true" #fig-DiagrammeDeploiement caption="Diagramme de déploiement du système à développer pour le laboratoire." } @startuml !include normal.pumlinclude skinparam componentStyle uml2 @@ -75,7 +75,7 @@ NP1 .up. SGB @enduml ``` -```{.plantuml #fig-iTunesDiagrammeDeploiement caption="Diagramme de déploiement pour iTunes d'Apple avec un ordinateur, un iPad et le service Web d'Apple, selon [ce modèle UML](https://www.uml-diagrams.org/apple-itunes-uml-deployment-diagram-example.html) de Kirill Fakhroutdinov (utilisé avec permission)."} +```{.plantuml genurl="true" #fig-iTunesDiagrammeDeploiement caption="Diagramme de déploiement pour iTunes d'Apple avec un ordinateur, un iPad et le service Web d'Apple, selon [ce modèle UML](https://www.uml-diagrams.org/apple-itunes-uml-deployment-diagram-example.html) de Kirill Fakhroutdinov (utilisé avec permission)."} @startuml scale 0.7 left to right direction diff --git a/GRASP-GoF.qmd b/GRASP-GoF.qmd index adbe7737..23045302 100644 --- a/GRASP-GoF.qmd +++ b/GRASP-GoF.qmd @@ -34,7 +34,7 @@ L'objet Vente a une visibilité de paramètre. Dans le contexte du projet NextGen POS, Larman propose l'utilisation de ce pattern pour plusieurs dimensions où des services externes ont plusieurs possibilités (l'inventaire, la comptabilité, etc.). -```{.plantuml #fig-AdapterGoF caption="Le diagramme de classes du pattern Adaptateur [@GoF1994]."} +```{.plantuml genurl="true" #fig-AdapterGoF caption="Le diagramme de classes du pattern Adaptateur [@GoF1994]."} @startuml !include normal.pumlinclude hide empty members @@ -60,7 +60,7 @@ Client -r-> Target ``` -```{.plantuml #fig-Fig23_1 caption="Le pattern Adaptateur appliqué pour les services externes de calculateurs de taxes. Chaque service externe a une interface API distincte et immuable. Les adaptateurs concrets permettent de normaliser l'accès à ces interfaces API à travers une interface `IAdaptateurCalculTaxes`."} +```{.plantuml genurl="true" #fig-Fig23_1 caption="Le pattern Adaptateur appliqué pour les services externes de calculateurs de taxes. Chaque service externe a une interface API distincte et immuable. Les adaptateurs concrets permettent de normaliser l'accès à ces interfaces API à travers une interface `IAdaptateurCalculTaxes`."} @startuml !include normal.pumlinclude @@ -112,7 +112,7 @@ Lorsqu'une classe prend plus de responsabilités, ça porte atteinte à sa cohé Le pattern Adaptateur comprend les principes GRASP Faible Couplage, Forte Cohésion, Polymorphisme, Indirection, Fabrication Pure et Protection des variations. La @fig-Fig23_3 démontre la relation entre ces principes dans le cas d'Adaptateur. -```{.plantuml #fig-Fig23_3 caption="Adaptateur et principes GRASP (figure F23.3/A26.3\ {{< fa solid book >}})."} +```{.plantuml genurl="true" #fig-Fig23_3 caption="Adaptateur et principes GRASP (figure F23.3/A26.3\ {{< fa solid book >}})."} @startuml Adaptateur_GRASP !include normal.pumlinclude hide empty members diff --git a/GRASP.qmd b/GRASP.qmd index ed58c2ed..6c566670 100644 --- a/GRASP.qmd +++ b/GRASP.qmd @@ -25,7 +25,7 @@ Une fois que vous aurez l'habitude d'utiliser les GRASP, vous serez encore rapid Neal Ford [-@Ford2009] a proposé la notion d'effort pour la conception qu'il a nommée le "Spectre de la conception". La @fig-SpectreConception illustre le principe. -``` {#fig-SpectreConception .plantuml caption="Spectre de la conception [@Ford2009]."} +``` {#fig-SpectreConception .plantuml genurl="true" caption="Spectre de la conception [@Ford2009]."} @startuml !include ecriture.pumlinclude scale 1.2 @@ -152,7 +152,7 @@ On peut voir les principes GRASP comme des généralisations (principes de base) Soit le diagramme de classe sur la @fig-GRASP_polymorphisme_ex modélisant l'exemple de @Fowl18a à [*Replace Conditional with Polymorphism*](https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html). -```{.plantuml #fig-GRASP_polymorphisme_ex caption='Classe "Bird" à laquelle on peut appliquer le principe GRASP Polymorphisme.'} +```{.plantuml genurl="true" #fig-GRASP_polymorphisme_ex caption='Classe "Bird" à laquelle on peut appliquer le principe GRASP Polymorphisme.'} @startuml !include normal.pumlinclude class Bird { @@ -194,7 +194,7 @@ L'utilisation d'une classe abstraite `Bird` permet de garder un faible couplage Par le principe de polymorphisme, les oiseaux concrets sont aussi considérés comme des `Bird`. Puisque les oiseaux ne partagent pas de propriétés ou d'implémentation, il aurait aussi été possible d'utiliser une interface pour la classe `Bird`. -```{.plantuml #fig-GRASP_polymorphisme_sol caption='Classes "Bird" auxquelles on a appliqué le principe GRASP Polymorphisme.'} +```{.plantuml genurl="true" #fig-GRASP_polymorphisme_sol caption='Classes "Bird" auxquelles on a appliqué le principe GRASP Polymorphisme.'} @startuml !include normal.pumlinclude hide empty members @@ -273,7 +273,7 @@ Cet exercice est inspiré d'un exemple donné dans le livre *Head First Design P - Quelles classes sur la @fig-GRASP_cohesion_ex1 ont de multiples responsabilités? - Déterminez si les classes sur la @fig-GRASP_cohesion_ex2 ont une cohésion forte ou faible. -```{.plantuml #fig-GRASP_cohesion_ex1 caption="Quelles classes ont de multiples responsabilités?"} +```{.plantuml genurl="true" #fig-GRASP_cohesion_ex1 caption="Quelles classes ont de multiples responsabilités?"} @startuml !include normal.pumlinclude class Jeu { @@ -325,7 +325,7 @@ class Iterator { @enduml ``` -```{.plantuml #fig-GRASP_cohesion_ex2 caption="Quelles classes ont une cohésion forte? Une cohésion faible?"} +```{.plantuml genurl="true" #fig-GRASP_cohesion_ex2 caption="Quelles classes ont une cohésion forte? Une cohésion faible?"} @startuml !include normal.pumlinclude class Jeu { diff --git a/MDD.qmd b/MDD.qmd index 86b42ccc..fde7a898 100644 --- a/MDD.qmd +++ b/MDD.qmd @@ -125,7 +125,7 @@ Ils sont indiqués par le symbole **`/`** devant leur nom. L'exemple à la @fig-MDD-attribut-derive s'applique à la règle du jeu Risk spécifiant qu'un joueur reçoit un certain nombre de renforts selon le nombre de pays occupés. La classe Joueur pourrait avoir un attribut dérivé `/nbPaysOccupés` qui est calculé selon le nombre de Pays contrôlés par le joueur. -```{.plantuml #fig-MDD-attribut-derive caption="`nbPaysOccupés` est un attribut dérivé. Sa valeur sera calculée selon le nombre de pays de l'association."} +```{.plantuml genurl="true" #fig-MDD-attribut-derive caption="`nbPaysOccupés` est un attribut dérivé. Sa valeur sera calculée selon le nombre de pays de l'association."} @startuml !include ecriture.pumlinclude scale 1 @@ -152,7 +152,7 @@ L'association entre `Joueur` et `Pays` a un verbe "contrôle", qui est un exempl L'association entre `Continent` et `Pays` représente la composition des territoires (un synonyme pour pays) des différents continents, soit 4 (pour l'Amérique du sud et l'Océanie), 6 (pour l'Afrique), 7 (pour l'Europe), 9 (pour l'Amérique du nord) et 12 (pour l'Asie). Si vous regardez tout le modèle, vous verrez qu'il représente visuellement beaucoup d'éléments du jeu. -```{.plantuml #fig-MDD-jeu-de-risk caption="Modèle du domaine du jeu Risk."} +```{.plantuml genurl="true" #fig-MDD-jeu-de-risk caption="Modèle du domaine du jeu Risk."} @startuml !include ecriture.pumlinclude scale 1 @@ -215,7 +215,7 @@ Alors, une classe Cours (qui joue le rôle de description) sert pour spécifier La @fig-MDD-CoursGroupeCoursDescription présente une classe de description pour le contexte de cours et de groupe-cours. -```{.plantuml #fig-MDD-CoursGroupeCoursDescription caption="La classe Cours joue le rôle de description d'entités (les groupes-cours)."} +```{.plantuml genurl="true" #fig-MDD-CoursGroupeCoursDescription caption="La classe Cours joue le rôle de description d'entités (les groupes-cours)."} @startuml !include normal.pumlinclude hide empty members @@ -250,7 +250,7 @@ Attention de ne pas faire l'erreur naïve d'utiliser une classe de description s ::: -```{.plantuml #fig-MDD-ErreurDescription caption="Illustration d'une erreur fréquente: utiliser une classe de description sans justification."} +```{.plantuml genurl="true" #fig-MDD-ErreurDescription caption="Illustration d'une erreur fréquente: utiliser une classe de description sans justification."} @startuml !include normal.pumlinclude hide empty members @@ -302,7 +302,7 @@ Alors, la durée de vie de cette instance dépend de l'association. Voir le livre de @craig_uml_2005 pour plus d'exemples. -```{.plantuml #fig-MDD-classe-association caption="Classe d'association dans le MDD Jeu Risk."} +```{.plantuml genurl="true" #fig-MDD-classe-association caption="Classe d'association dans le MDD Jeu Risk."} @startuml !include ecriture.pumlinclude scale 1 @@ -506,7 +506,7 @@ Par rétro-ingénierie, réalisez le modèle du domaine pour une fonctionnalité Voici une solution possible qui est cohérente avec l'étape précédente: -```{.plantuml #fig-mdd-retroingenierie-discord-attributs caption="Attributs des classes conceptuelles proposées dans l'exercice."} +```{.plantuml genurl="true" #fig-mdd-retroingenierie-discord-attributs caption="Attributs des classes conceptuelles proposées dans l'exercice."} @startuml !include ecriture.pumlinclude scale 1 @@ -555,7 +555,7 @@ class Fichier { Voici une solution possible qui est cohérente avec l'étape précédente: -```{.plantuml #fig-mdd-retroingenierie-discord-associations caption="Associations et cardinalités des classes conceptuelles proposées dans l'exercice."} +```{.plantuml genurl="true" #fig-mdd-retroingenierie-discord-associations caption="Associations et cardinalités des classes conceptuelles proposées dans l'exercice."} @startuml !include ecriture.pumlinclude scale 1 @@ -616,7 +616,7 @@ Toutefois, les associations du MDD utilisent des verbes ternes qui n'aident pas Remplacez les verbes des associations par des verbes plus riches. Vous pouvez inverser le sens des associations. -```{.plantuml #fig-mdd_youtube caption="Modèle du domaine partiel pour le logiciel YouTube."} +```{.plantuml genurl="true" #fig-mdd_youtube caption="Modèle du domaine partiel pour le logiciel YouTube."} @startuml !include ecriture.pumlinclude scale 1 @@ -667,7 +667,7 @@ class Statistique { ## Voici une solution -```{.plantuml #fig-mdd_youtube_ameliore caption="Modèle du domaine partiel pour le logiciel YouTube avec des verbes d'association plus riches."} +```{.plantuml genurl="true" #fig-mdd_youtube_ameliore caption="Modèle du domaine partiel pour le logiciel YouTube avec des verbes d'association plus riches."} @startuml !include ecriture.pumlinclude scale 1 diff --git a/Outils-UML.qmd b/Outils-UML.qmd index d90a83e4..1c748c5c 100644 --- a/Outils-UML.qmd +++ b/Outils-UML.qmd @@ -26,7 +26,7 @@ Dans la méthodologie de ce manuel, on exploite l'outil PlantUML pour faire beau - Il est basé sur un langage spécifique à un domaine (en anglais *domain-specific language* ou DSL), dont les fichiers peuvent être facilement mis sur un contrôle de version (Git); - Il est basé sur du code libre; - Il s'occupe de la mise en page des diagrammes (cela est parfois un inconvénient si un modèle est complexe); -- Il est utilisé par des ingénieurs et ingénieuses chez Google pour documenter à l'interne les projets Android et Pay[^GoogleUseGizmo]; +- Il est utilisé par des ingénieurs et ingénieures chez Google pour documenter à l'interne les projets Android et Pay[^GoogleUseGizmo]; - Il existe plusieurs supports pour les outils de documentation: - extension [PlantUML pour Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml) (@fig-PlantUMLVSCode) avec [tutoriel](https://www.youtube.com/watch?v=xkwJ9GwgZJU)\ {{< fa brands youtube >}}; - extension [PlantUML Gizmo](https://gsuite.google.com/marketplace/app/plantuml_gizmo/950520042571?pann=cwsdp&hl=en) pour Google Docs et Google Slides, développée en 2014 par le professeur Christopher Fuhrman dans le cadre de son travail à l'ÉTS (@fig-PlantUMLGizmo). diff --git a/RDCU.qmd b/RDCU.qmd index a29e7d3a..d3f85f14 100644 --- a/RDCU.qmd +++ b/RDCU.qmd @@ -34,7 +34,7 @@ Alors, votre RDCU sera incertaine jusqu'à ce que vous la traduisiez en code ex Tout le processus de proposition d'une solution (RDCU) peut être visualisé comme un diagramme d'activités, comme illustré sur la @fig-RDCU_Aide_Memoire. -```{.plantuml #fig-RDCU_Aide_Memoire caption="Aide-mémoire pour faire une RDCU. L'étape en rouge nécessite beaucoup de pratique, selon la complexité des postconditions. Vous pouvez vous attendre à ne pas la réussir du premier coup." } +```{.plantuml genurl="true" #fig-RDCU_Aide_Memoire caption="Aide-mémoire pour faire une RDCU. L'étape en rouge nécessite beaucoup de pratique, selon la complexité des postconditions. Vous pouvez vous attendre à ne pas la réussir du premier coup." } @startuml !include normal.pumlinclude ' get font awesome icon @@ -116,7 +116,7 @@ Attention à la [visibilité](#sec-Visibilite)\ {{< fa solid low-vision >}}. Lorsque l'attribut d'un objet doit être modifié juste après la création de ce dernier, ça peut se faire dans le constructeur, comme illustré sur la @fig-RDCU_Constructeur_Modification. -```{.plantuml #fig-RDCU_Constructeur_Modification caption="Combiner la création d'une instance et une modification de son attribut dans un constructeur." } +```{.plantuml genurl="true" #fig-RDCU_Constructeur_Modification caption="Combiner la création d'une instance et une modification de son attribut dans un constructeur." } @startuml !include ecriture.pumlinclude scale 1.3 @@ -157,7 +157,7 @@ Par exemple, sur la @fig-RDCU_Visibilite1, la référence à *b* peut être: Pour plus de détails, voir le chapitre sur la Visibilité (F18/A19)\ {{< fa solid book >}}. -```{.plantuml #fig-RDCU_Visibilite1 caption="L'objet *b* doit être visible à l'objet *a* si *a* veut lui envoyer un message." } +```{.plantuml genurl="true" #fig-RDCU_Visibilite1 caption="L'objet *b* doit être visible à l'objet *a* si *a* veut lui envoyer un message." } @startuml !include ecriture.pumlinclude scale 1.3 @@ -180,7 +180,7 @@ Il y a un exemple à la @fig-RDCU_ID_en_objets provenant du chapitre sur **l'App Un autre exemple du livre de @craig_uml_2005 est l'identifiant `codeArticle` transformé en objet `DescriptionProduit` par la méthode `CatalogueProduits.getDescProduit(codeArticle:String):DescriptionProduit`. -```{.plantuml #fig-RDCU_ID_en_objets caption="Un identifiant `idClient:String` est transformé en objet `c:Client`, qui est ensuite envoyé à la Vente en cours." } +```{.plantuml genurl="true" #fig-RDCU_ID_en_objets caption="Un identifiant `idClient:String` est transformé en objet `c:Client`, qui est ensuite envoyé à la Vente en cours." } @startuml !include ecriture.pumlinclude scale 1.1 @@ -207,7 +207,7 @@ Notez que les exemples de @craig_uml_2005 ne montrent qu'un seul *type* dans le Un tableau associatif fournit une méthode `get` ou `find` pour rechercher un objet à partir de sa clé (son identifiant). La @fig-Map_Case_Monopoly en est un exemple. -```{.plantuml #fig-Map_Case_Monopoly caption="Exemple de l'utilisation d'un tableau associatif pour trouver une Case Monopoly à partir de son nom." } +```{.plantuml genurl="true" #fig-Map_Case_Monopoly caption="Exemple de l'utilisation d'un tableau associatif pour trouver une Case Monopoly à partir de son nom." } @startuml !include ecriture.pumlinclude scale 1.1 @@ -236,7 +236,7 @@ Voici quelques points importants: - Il faut choisir l'objet du domaine initial, qui est souvent l'objet racine, mais ça dépend du domaine. Cet objet aura la responsabilité, lors de sa création, de générer ses "enfants" directs, puis chaque "enfant" aura à faire la même chose selon la structure. Par exemple, selon le MDD pour le jeu Risk à la @fig-MDD-jeu-de-risk, `JeuRisk` pourrait être l'objet racine, qui devra créer l'objet `PlateauRisk` et les cinq instances de `Dé`. L'objet `PlateauRisk`, lors de son initialisation, pourra instancier les 42 objets `Pays` et les six objets `Continent`, en passant à chaque `Continent` ses objets `Pays` lors de son initialisation. Si `PlateauRisk` fournit une méthode `getPays(nom)` qui dépend d'un tableau associatif selon [Transformer les identifiants en objets](#sec-TransformerIDenObjets), alors c'est dans l'initialisation de cette classe que l'instance de `Map` sera créée. - Selon l'application, les objets peuvent être chargés en mémoire à partir d'un système de persistance, par exemple une base de données ou un fichier. Pour l'exemple de Risk, `PlateauRisk` pourrait charger, à partir d'un fichier JSON, des données pour initialiser toutes les instances de `Pays`. Pour une application d'inscription de cours à l'université, il se peut que toutes les descriptions de cours soient chargées en mémoire à partir d'une base de données. Une base de données amène un lot d'avantages et d'inconvénients, et elle n'est pas toujours nécessaire. Dans la méthodologie de ce manuel, on n'aborde pas le problème des bases de données (c'est le sujet d'un autre cours). -```{.plantuml #fig-DemarrerRisk caption="Exemple de l'initialisation partielle du jeu Risk, avec les principes GRASP et les tableaux associatifs pour faciliter la transformation d'identifiants en objets." } +```{.plantuml genurl="true" #fig-DemarrerRisk caption="Exemple de l'initialisation partielle du jeu Risk, avec les principes GRASP et les tableaux associatifs pour faciliter la transformation d'identifiants en objets." } @startuml !include ecriture.pumlinclude scale 0.75 @@ -306,7 +306,7 @@ Dans la section F30.8/A33.7\ {{< fa solid book >}}, Larman mentionne le pattern ![Dés dans la vraie vie (["Hand of chance"](https://www.flickr.com/photos/aerust/9590772048/) [(CC BY 2.0)](https://creativecommons.org/licenses/by/2.0/) par [Alexandra E Rust](https://www.flickr.com/people/aerust/)).](images/flickr_aerust_hand_of_chance.jpg){width=80% #fig-main_des} -```{#fig-de_logiciel .plantuml caption="Dé dans un logiciel selon *Faire soi-même*." } +```{#fig-de_logiciel .plantuml genurl="true" caption="Dé dans un logiciel selon *Faire soi-même*." } !include ecriture.pumlinclude hide empty methods class Dé { @@ -332,7 +332,7 @@ Pour chacun des diagrammes suivants, écrivez les classes TypeScript avec les m Vous pouvez utiliser VS Code pour vous aider avec le TypeScript, mais cet outil ne sera pas forcément permis lors d'un examen. ::: -```{.plantuml #fig-coder_sequence_modele caption="Exemple de diagramme de séquence." } +```{.plantuml genurl="true" #fig-coder_sequence_modele caption="Exemple de diagramme de séquence." } @startuml scale 1.0 !include normal.pumlinclude @@ -432,7 +432,7 @@ Pour cet exercice, nous examinerons une conception orientée objet réelle du je Pour visualiser la conception, nous avons généré un diagramme de classes en UML sur la @fig-Emojiopoly_classes avec l'outil [tplant](https://github.com/bafolts/tplant). -```{.plantuml caption="Diagramme de classes logicielles (TypeScript) pour le projet [Emojiopoly](https://github.com/Chuzzy/Emojiopoly)." #fig-Emojiopoly_classes} +```{.plantuml genurl="true" caption="Diagramme de classes logicielles (TypeScript) pour le projet [Emojiopoly](https://github.com/Chuzzy/Emojiopoly)." #fig-Emojiopoly_classes} @startuml ' généré avec tplant a partir d'un clone de https://github.com/Chuzzy/Emojiopoly : ' tplant --input src/monopoly/**/*.ts --output Emojiopoly.puml -A diff --git a/TDD.qmd b/TDD.qmd index b799b562..d4026e26 100644 --- a/TDD.qmd +++ b/TDD.qmd @@ -35,7 +35,7 @@ L'exécution de tests peut même être faite à chaque *commit* du code dans un Il est possible de mesurer la [couverture de code](https://fr.wikipedia.org/wiki/Couverture_de_code)\ {{< fa brands wikipedia-w >}}\ atteinte par les tests (mais ce sujet sort du cadre de la matière de ce manuel). -```{.plantuml #fig-TDD_states caption="États du développement piloté par les tests." } +```{.plantuml genurl="true" #fig-TDD_states caption="États du développement piloté par les tests." } @startuml !include normal.pumlinclude hide empty description diff --git a/TravailEquipe.qmd b/TravailEquipe.qmd index 70fcd19d..83d93d44 100644 --- a/TravailEquipe.qmd +++ b/TravailEquipe.qmd @@ -68,7 +68,7 @@ L'humilité ne veut pas dire "je n'ai pas de valeur" ou "j'accepte les attaques ![Savoir qu'on n'est pas infaillible. ["Brown Eyed Susan"](https://www.flickr.com/photos/dbarronoss/14660203846/) ([CC BY-NC-ND 2.0](https://creativecommons.org/licenses/by-nc-nd/2.0/)) par [dbarronoss](https://www.flickr.com/people/dbarronoss/).](images/flickr_dbarronoss_Brown_Eyed_Susan.jpg){#fig-pas-infaillible width=200px} -```{.plantuml #fig-moi_inf_equipe caption="Une personne humble va accepter une décision prise par l'équipe, même si elle n'est pas en accord à 100%." width=200px} +```{.plantuml genurl="true" #fig-moi_inf_equipe caption="Une personne humble va accepter une décision prise par l'équipe, même si elle n'est pas en accord à 100%." width=200px} @startuml !include ecriture.pumlinclude skinparam rectangleBorderColor transparent diff --git a/presentations/vitrine-rel/open-source-tools-fabriqueREL2023.qmd b/presentations/vitrine-rel/open-source-tools-fabriqueREL2023.qmd index cfb6d181..f47b9a8a 100644 --- a/presentations/vitrine-rel/open-source-tools-fabriqueREL2023.qmd +++ b/presentations/vitrine-rel/open-source-tools-fabriqueREL2023.qmd @@ -185,7 +185,7 @@ format: ::: {.column width="50%"} ````{code-line-numbers=false} -```{.plantuml #fig-ddcDes caption="Diagramme de classes."} +```{.plantuml genurl="true" #fig-ddcDes caption="Diagramme de classes."} @startuml skinparam style strictuml skinparam backgroundcolor transparent @@ -211,7 +211,7 @@ JeuDeDés -right- "[nom]" Joueur : " " ::: ::: {.column width="50%"} -```{.plantuml #fig-ddcDes caption="Diagramme de classes."} +```{.plantuml genurl="true" #fig-ddcDes caption="Diagramme de classes."} @startuml skinparam style strictuml skinparam backgroundcolor transparent