&
mis à jour le 22/10/2024
UML
U
M
L
nifed
odeling
anguage
Suite de diagrammes ayant chacun un but précis dans le but de modéliser l'intégralité d'un projet voire même d'un système d'information complet !
Since 1997
Une succession de diagrammes à réaliser selon la phase en cours du projet, la méthodologie propose de réaliser les diagrammes de composants et déploiement durant la conception. A mon sens, ils devraient être réalisés en phase d'analyse également.
Première étape : Analyser le besoin
La première étape pour réaliser notre phase de modélisation UML est de recueillir le besoin du client et d’en exprimer notre compréhension à travers des diagrammes UML.
Les diagrammes associés sont :
Seconde étape : Analyser le domaine
La seconde étape est de réaliser une analyse du domaine, ici nous allons utiliser d’autres diagrammes pour définir le domaine.
Les diagrammes associés sont :
Troisième étape : Analyser l'applicatif
Ensuite vient l’analyse applicative, qui va nous permettre de définir via des diagrammes UML la structure de l’application que l’on va mettre à disposition au client.
Les diagrammes associés sont :
Dernière étape : La conception
Enfin vient le temps de la conception, ici, il s’agit donc d’utiliser les diagrammes réalisés et les affiner tout au long des développements.
Les diagrammes associés sont :
Tous les diagrammes précédents
Diagramme de composants
Diagramme de déploiements
Exercice (Réaliser un diagramme de contexte)
Pour toute la durée du cours, nous allons prendre le même système d’information cible. L’objectif est de réaliser tous les diagrammes sur ce contexte.
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Exercice (Réaliser un diagramme de contexte)
Le diagramme de packages permet de décomposer le système en catégories ou parties plus facilement observables, « packages ».
C’est un diagramme de contexte avec une granularité plus forte concernant les composants du système d’information.
Ça nous permet de savoir quels sont les différents ensembles qui composent le SI.
Plateforme formations
Exercice (Réaliser un diagramme de packages)
Pour toute la durée du cours, nous allons prendre le même système d’information cible. L’objectif est de réaliser tous les diagrammes sur ce contexte.
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Exercice (Réaliser un diagramme de packages)
Le diagramme de cas d’utilisation représente les fonctionnalités (ou cas d’utilisation) pouvant être réalisées par les acteurs. Elles doivent TOUTES être présente dans le diagramme de cas d’utilisations.
On peut faire un diagramme de cas d’utilisation pour le SI entier ou un pour chaque package ou par acteur.
La syntaxe d'un diagramme de cas d'utilisations
= use
<<exclude>>
= extends
Exercice (Réaliser un diagramme de cas d'utilisations)
Exercice (Réaliser un diagramme de cas d’utilisations)
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Pour chaque cas d’utilisation, on va réaliser un tableau contenant ces informations :
Diagramme qui permet d’avoir une vision d’ensemble des actions qui peuvent être effectués sur le SI. Il développe les scénarios, que ce soit le scénario classique, les exceptions ou les scénarios alternatifs.
Dans l'idéal chaque action fait office d’un diagramme a part entière
C’est un diagramme qui a un début d’action, qui en défini les étapes et qui possède une fin.
Début
Fin
La syntaxe d'un diagramme d'activité
Exercice (Réaliser un diagramme d’activité)
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
La syntaxe
Exercice (Réaliser un diagramme d'états-transitions)
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Il permet de représenter des échanges entre les différents objets et acteurs du système en fonction du temps. Celui-ci représente les méthodes (en termes de développement).
Il ajoute la notion d’acteurs et des informations « temporelles » au diagramme d’activités.
La syntaxe
La syntaxe : Les boucles et conditions
Exercice (Réaliser un diagramme de séquences)
Durant la phase d’analyse, le diagramme de classes représente les informations manipulées par les utilisateurs
Durant la phase de conception, le diagramme de classes représente les objets, propriétés et méthodes de notre projet.
En soit, c’est le seul diagramme OBLIGATOIRE pour une modélisation UML.
(Pour ceux qui arrivent à faire directement un diagramme de classes sans passer par les autres au préalable)
La syntaxe
Réalisez le diagramme de classes des informations ci-dessous
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Exercice (Réaliser un diagramme de classes)
Mettez de côté vos diagrammes dans un dossier (format image) en nommant le fichier avec le nom du diagramme. Vous m'enverrez un zip avec tous les diagrammes à la fin de la formation. J'utiliserai ça pour la notation.
Chaque diagramme doit être présenté textuellement et faire partie intégrante de la réponse au besoin du client.
Pensez que certains lecteurs de votre réponse ne seront pas aussi à l’aise que vous en UML, un texte explicatif peut à la fois aider les non informaticiens mais aussi les informaticiens qui peuvent interpréter différemment vos diagrammes.
D'autres diagrammes existent dans une version plus récente de l'UML, chacun ayant leurs propre intérêt pour compléter la modélisation avec les diagrammes abordés ensemble.
Pour cet exercice, je vous donne des règles métiers et vous devez réaliser 5 diagrammes correspondants (Cas d'utilisations, activités, états-transitions, séquences, classes). Prenez votre temps, posez des questions, sachez que vos compétences seront évaluées via un exercice complètement similaire, avec des règles métiers différentes.
Workshop UML
Si nous avons un peu de temps en fin de journée, nous allons prendre ce temps pour travailler sur l'UML du projet Cube. Mettez vous en groupe et commencez à réaliser les diagrammes dans l'ordre vu durant la formation.
Certains diagrammes sont peut-être optionnels, mais je vous conseil de tous les faire et tous les commenter !
Non noté (pour le moment) mais je pense que nous n'aurons pas le temps d'arriver à cette slide avant la fin de la première journée
Workshop projet Cube
Patterns créateurs (Singleton, factory, abstract factory)
Patterns aidant à la gestion de la création d’objet
Patterns structurants (Façade, proxy, decorator, composite, adapter)
On parle de travailler sur la partie externe des classes du pattern. L’extensibilité et l’encapsulation des classes.
Patterns comportementaux (Strategy, iterator, observer, state)
Ici, on travaille sur la partie interne des classes du pattern. La dynamique des classes du pattern. Améliorer la qualité du code, éviter les duplications ou gérer des problématiques connues.
Principe n°1
Principe n°2
Principe n°3
Rappel de certaines notions objets importantes
La mise en place de Design Pattern va nécessiter des notions objets simples mais importante pour la compréhension de ces derniers. Nous allons revoir rapidement :
L'héritage permet de partager des propriétés et méthodes entre les classes, il suffit d'utiliser le mot clé extends pour que cette classe (fille) hérite de la classe de base (mère).
Le partage de code s'effectue de manière descendante uniquement.
Une interface est un contrat a respecter, il défini la signature des méthodes (définition de méthode sans leur implémentation) qui doivent être implémentées dans les classes respectant ce contrat d'interface.
Une association traduit un lien entre une classe A et une classe B (appel de méthode par exemple).
L'agrégation est une association particulière : l'objet A possède une ou plusieurs instances de B.
Une composition est une agrégation particulière : toutes les instances de B contenues dans A sont supprimées lorsque A est supprimée.
Autre exemple plus complexe (pour revoir un peu d'orienté objet supplémentaire)
Exercice Orienté Objet (pour prendre un peu de temps et aider ceux qui n'ont pas fait d'OO)
Réaliser une composition entre Author et Book.
A mettre de côté et rendre également !
Une classe abstraite (mère) permet de définir les signatures des méthodes et les propriétés qui seront partagés à la classe qui va étendre cette classe abstraite (fille)
L'intérêt principal des classes abstraites est d’informer l’utilisateur (la classe fille) de cette classe qu’une instance de cette première n’a pas d’utilité a être instanciée. Exemple : vous devez gérer un centre de location de véhicules (voiture, camion, vélo ….). Vous avez très certainement une classe Vehicule, dont héritera Velo, Voiture, Camion…
Mais le centre de location n'aura jamais besoin d'instancier un Vehicule.
Les classes abstraites peuvent également posséder des méthodes abstraites. Ce sont des méthodes qui ne possèdent pas de corps, et qui devront obligatoirement être surchargée par les classes qui en hérite
Un autre exemple pour mieux comprendre... Nous avons une classe abstraite Shape et deux classes filles Square & Circle.
Impossible
d'instancier une forme,
Shape est un concept abstrait
Hérite de Shape
Ce qui lui en donne les propriétés & force à redéfinir "Draw"
L'idée principale est de pouvoir mettre en place une certaine stratégie ou ce que l’on va régulièrement appeler un comportement afin de pouvoir en changer dynamiquement au runtime.
Sans pattern stratégie, on serait obligé de multiplier les classes en produit cartésien pour pouvoir avoir autant de combinaisons de comportements que nécessaire. (Horrible)
L’héritage est puissant mais il ne permet de partager du code que de manière verticale, c’est-à-dire à ses enfants.
Par contre, si les enfants veulent partager du code entre eux, aucun moyen de le faire à part en dupliquant le code (Horrible).
Meilleure lisibilité du code. (Pas de duplication, pas de gros pavés de méthodes dans une seule classe)
S’assurer que chaque élément à sa propre responsabilité (découplage fort)
Et surtout avoir des algorithmes interchangeables au runtime sans avoir à multiplier les classes.
Exercice (Réaliser un pattern Strategy)
Reprenez le pattern Stratégie pour l’appliquer à ce sujet :
Une interface StrategieInterface ayant pour contrat function reagir(PersonneInterface $personne);
Trois classes (Enerve, Geek, Heureux) chacune implémentant StrategieInterface et redéfinissant donc la méthode réagir:
Une interface PersonneInteface ayant pour contrat function donnerPhrase();
Une classe Personne qui implémente PersonneInterface et donc redéfini donnerPhrase :
Une classe Contexte qui a une stratégie en propriété.
Réalisez le diagramme UML + le pseudo code amélioré
Définir une dépendance entre un objet observé et un ou plusieurs objets observants.
L’objectif étant de pouvoir notifier les objets observants lorsqu’un changement de statut est opéré sur l’objet observé.
On a parfois besoin de connaître le changement de statut d’un autre objet. Il est possible d’interroger l’objet en continue pour connaître son statut et le mettre à jour si nécessaire.
Ceci est très gourmand s’il y’a plusieurs abonnés et surtout si on interroge toutes les secondes, alors que le statut change de manière aléatoire ?
Ceci n’est pas efficace.
* Optionnelle : Si on ne met pas de lien entre concreteSubject et ConcreteObserver, ça nous force à passer un objet ConcreteSubject dans la méthode update()
* Optionnelle
Eviter les opérations de PULL massives et simplement effectuer un push / pull lorsque c’est nécessaire.
Plus concrètement, améliorer la logique métier
Diminuer le coûts de l’observation
Supprimer la question de l’intervalle d’interrogation
Exercice (Réaliser un pattern Observer)
Reprenez le pattern Observer pour observer la modification d'une température et notifier des objets observants ce changement de température.
Chaque modification de température affiche (dans la console) la nouvelle température pour tous les objets observants.
Pensez bien à avoir plusieurs observants.
Réalisez le diagramme UML + le code complet du pattern
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Comme son nom l’indique, il a pour objectif de rendre une interface non adaptée à une autre, compatible. En rajoutant un objet intermédiaire nommé « Adapter ».
Les interfaces exposées ne sont pas toujours compatibles avec ce que nous avons, il nous faut donc réaliser une adaptation intermédiaire pour pouvoir coupler les deux.
Adapter une interface pour qu’elle s’imbrique dans une autre, tout simplement.
Découplage fort
Peut-être facilement mis en place même après coup, à moindre coût (sauf pour le code client, qui va forcément devoir être adapté ou il ne sera pas homogène)
Permet d’ajouter dynamiquement des propriétés à un objet.
En pouvant empiler/décorer avec autant d’objets décorable que l’on souhaite.
L’objet décoré et le ou les objets décorants s’utilisent de la même façon, excepté que la plupart du temps, les objets décorants ne peuvent pas exister sans objet à décorer.
Duplication de code et multiplication des classes pour gérer toutes les possibilités (inutiles).
Simple à mettre en place
Evite la multiplication des classes
Permet d’ajouter des caractéristiques multiples sans limite (excepté celles définies par l’interface) à un objet de base.
Le fait d’envelopper permet de facilement exécuter des opérations qui sont à effectuer sur chaque enveloppe pour en avoir un résultat global (prix d’une boisson par exemple)
Attention, ça ne permet pas de connaître l'ordre de décoration !!!
Adaptez le diagramme vu ensemble en utilisant la problématique suivante :
On a une boisson de plusieurs type : café, chocolat au lait, thé, …
Chaque boisson peut avoir plusieurs décorations : sucre, caramel, chocolat,…
L'objectif est de calculer le prix à la compilation en fonction de la décoration
Réalisez le code (ou à minima pseudo code) permettant de mettre ceci en œuvre
Décorez un café avec deux fois du caramel et une fois du sucre, par exemple.
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Le pattern singleton est le plus simple des patterns, il permet de s’assurer qu’un objet est instancier qu’une et une seule fois dans toute votre application.
Ce sera toujours la MÊME instance de l’objet quelque soit depuis quel endroit l’objet est appelé.
On instancie un objet quelque part, on y fait des opérations dessus, puis on souhaite à nouveau réutiliser cet objet à un autre endroit.
Pour que les opérations soient gardées en mémoire, on ne peut pas le faire, car on devra réinstancier la classe puis réeffectuer les opérations dessus. (Ou alors rajouter des dépendances inutiles)
S’assurer qu’un objet est instancier qu’une seule fois et y avoir accès facilement depuis n’importe où dans votre application.
Certains estiment que le pattern singleton est un mauvais pattern (à ne pas confondre avec anti-pattern). Pour deux raisons, à ma connaissance :
1. Le pattern singleton est utilisable uniquement en statique, les débats sont nombreux avec tout ce qui tourne autour du mot clé « static ». Je vous laisserai vous renseigner et vous faire votre propre opinion, mais sachez que pour ma part, je l’utilise très fréquemment.
2. D’après certains développeurs, le fait de dire qu’on est certain que l’on veut une seule instance de son objet à tout jamais dans son application n’est pas en lien avec le fait de faire de son application une application évolutive à toute épreuve.
Pour eux, afin que ça reste évolutif, on ne peut pas se limiter à une seule instanciation. Habituellement, l'autre possibilité est d'utiliser une Factory
Je comprends le point de vue, mais je n’y adhère pas. J’utilise fréquemment le singleton pour instancier ma base de données par exemple. Dans 99,99% des cas, je sais à l’avance que je n’aurai qu’une instance de base de données et ceci n’évoluera pas au fil du temps.
Réalisez un pattern Singleton sur un objet de base de données.
Réalisez le diagramme UML + le code qui met en place le pattern
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Permet de gérer des états sur des objets tout en gardant la flexibilité d’opérer toutes les actions que voulues sur chaque état.
Sans avoir à enchainer les if (x.state === State.closed) {…}.
On change le state d’un objet et c’est ce state s’auto-gère en fonction des opérations qui sont proposées par l’interface State.
La gestion d’état sur des objets est gérable avec de simples conditions, mais dans le cas où l’on a beaucoup d’état qui peuvent changer en fonction de différentes opérations, le code devient une succession de condition.
D’une part, c’est incompréhensible à premier abord (surtout sans commentaire, ça peut prendre un certain temps) et d’autre part, lorsque l’on veut ajouter un state ou une opération on se retrouve a devoir modifier tout ça au risque de tout péter.
Exercice (Réaliser un pattern State)
Si nous avons assez de temps, je vais vous demander de réaliser un pattern State, l’idée ici est de gérer les statut d’une porte :
Réalisez le diagramme UML + le pseudo code amélioré
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Exercice (Réaliser un pattern State)
Réalisez le code permettant d'implémenter un pattern State répondant aux besoins précisés par le diagramme d'états transitions envoyé.
(Débutant, confirmé, expert, indétrônable, en pouvant sauter des niveaux que ce soit positivement ou non. Excepté quand on arrive à indétrônable)
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Le pattern command a pour objectif d’encapsuler une requête pour la rendre accessible depuis n’importe quel récepteur et la permettre d’être envoyée depuis n’importe quel émetteur.
L’idée est d’également de s’ajouter la possibilité de « undo » les commandes facilement. (Si en utilisation avec le pattern composite, on peut même effectuer des macro commandes qui exécute plusieurs petites commandes, sans en rendre plus compliqué le undo).
Comment proposer un service d’exécution de requêtes à de multiples clients / sujets ?
Comment s’assurer que l’on nous demande pas d’exécuter quelque chose que l’on ne sait pas traiter ?
De manière générale, comment gérer la commande ? et l'inverser ?
Exercice (Réaliser un pattern Command)
Reprenez le pattern Command pour l’appliquer à ce sujet : Gestion du son, pour l’augmenter et le baisser. L’idée va être d’avoir une ICommand qui va pouvoir execute, unexecute une action.
Cette action est définie dans une classe Receiver.
L’Invoker va lui contenir les Command, ainsi que deux méthodes:
Faites deux Invoker(Remote, Voice) différents et deux Receiver différents (HiFiSystem, TV)
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
C’est sensiblement la même chose que le pattern façade, excepté que le pattern proxy exprime un but précis lors du passage par le proxy (équivalent façade).
3 types de proxys peuvent être utilisés :
J’insiste sur le fait que c’est plus une vision UML différente qu’une implémentation dans le code différente.
Appel d’un composant externe qui nécessite un accès sécurisé, par exemple
Exercice (Réaliser un pattern Proxy)
Je vous demande de réaliser un pattern proxy, par exemple en utilisant le proxy pour valider un token d’authentification simple (un simple « toto » === « toto » suffit.
Pour ceux qui veulent développer un peu je propose de générer un fichier "Bonjour.txt" contenant 500 000 lignes d'enchaînement de mots générées aléatoirement, ou trouvez une idée d'opération couteuse à effectuer, je suis preneur de bonnes idées).
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
C’est simple, c’est un pont.
Un pont entre une classe abstraite et une interface permettant d’anticiper le problème de multiplication de classe vu dans le pattern adapter.
L’idée pour différencier les deux, concrètement, c’est que l’adapter corrige un problème de compatibilité alors que le pont l’anticipe pour ne jamais avoir le problème.
Deux interfaces ne sont pas forcément compatibles si elles n’ont pas été pensées au départ pour l’être.
La gestion d’un produit cartésien de nos classes nécessite la multiplication des classes, pour un 3x3, le gain est de 3 classes, mais pour du 20x20, le gain est élevé.
Exercice (Réaliser un pattern Bridge)
Réaliser un pattern bridge, l’idée est de faire un bridge pour pouvoir lier une clé de voiture avec une clé de maison, ou une clé de garage par exemple :
(J'ai un autre exercice si celui-ci ne vous parle pas trop)
Réalisez le diagramme UML + le code d'implémentation du pattern
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Le pattern façade permet de gérer les multiples dépendances de manière regroupée dans une classe façade qui va nous permettre de définir un certain nombre de dépendances / instanciations à notre place.
Il peut également être utilisé comme gestionnaire de méthodes !
Dans nos codes, les références à d’autres objets sont multiples et fréquentes. Parfois, il devient difficile ou pénible de devoir instancier les 10 objets dont dépendent l’objet que l’on souhaite.
Exercice (Réaliser un pattern Façade)
Réaliser un pattern façade, l'idée est de mettre en place une façade qui va gérer pour nous l'instanciation de sous classes.
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Ce pattern propose une manière de gérer la composition d’objets qui contiennent des objets en arbre.
C’est-à-dire qu’un objet est composé d’un autre objet, qui peut être composé de plusieurs autres objets, etc…
On souhaite pouvoir utiliser les mêmes méthodes que l’on soit dans un nœud composite ou dans un nœud composant.
Comment gérer de la récursivité de manière transparente pour le code utilisateur entre objet, sans utiliser de conditionnel sur le type de l’objet ?
I
Exercice (Réaliser un pattern Composite)
Réaliser un pattern composite, l'idée est de pouvoir construire une arborescence de <ul> et de <li> imbriqués grâce au pattern composite. Il vous faut :
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Le pattern factory a pour objectif de gérer la construction d’objet différemment qu’avec un « new ».
C’est la factory qui s’assure de la création / suppression de ces objets.
En général, une factory est utilisée lorsque l’on souhaite gérer la façon dont sont créer les objets via des méthodes (Par exemple, RandomCarFactory et RegularCarFactory)
On veut parfois ne pas avoir à gérer via le client quel type d’objet sera créer. Ou alors, on souhaite gérer un ordre de création d’objet ou pouvoir le modifier à la volée (par exemple createMutableObject ou createImmutableObject)
Exercice (Réaliser un pattern Factory simple)
Réaliser un pattern Factory afin de pouvoir gérer la création de véhicules différemment à la volée dans le code. Vous allez implémenter :
A noter : Il n'est pas nécessaire de développer un vrai random pour cet exercice (mais ça rajoute un peu de code alors pourquoi pas !)
Optionnel : Faites une classe qui génère des voitures suivant la suite de Fibonacci. Donc, 1 Renault, 1 Audi, 2 Mercedes, 3 Renault, 5 Audi, 8 Mercedes, 13 Renault,...
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Ici, l’objectif est de pouvoir parcourir une liste d’objets d’une manière algorithmique implémentée manuellement.
Aujourd’hui ça semble inutile comme pattern, car on a des structures qui utilise ce pattern pour nous. (ArrayList, List, Map, etc…) Tout ce qui est IEnumerable, en gros (IEnumerable c’est notre Iterator) avec les petites surcouches en LinQ qui vont bien…
Mais ça peut arriver que ceci ne soit pas disponible.
Gestion d’un ensemble d’objet sans avoir accès à des types qui permettent d’itérer sur la liste.
Exercice (Réaliser un pattern Iterator)
Réaliser un pattern Iterator, ici l'objectif est de mettre en place un iterateur pour lister une collection d'items (WordsCollection implements \IteratorAggregate) en AlphabeticalOrderIterator (implements \Iterator) permettant de lister les items de collection.
A noter que PHP met déjà en place pour vous les interface Iterator & IteratorAggregate.
Vous devez donc :
Réalisez le diagramme UML + le code d'implémentation
Mettez de côté vos design pattern dans un dossier en nommant le fichier avec le nom du pattern. Vous m'enverrez un zip avec tous les patterns à la fin de la formation. J'utiliserai ça pour la notation.
Exercice difficile
Petite attention particulière sur la surutilisation : même quand vous aurez l’habitude d’utiliser les design patterns…
Le but des patterns est de répondre à une problématique de code par une conception adaptée ET PAS rendre la conception plus complexe pour mettre des patterns juste parce qu’on veut absolument mettre des patterns partout.
C’est assez effrayant le nombre de développeurs en entreprise qui font ça, de mon expérience, je dirai qu’environ 10% des développeurs que j’ai connu avaient ce syndrome. Travailler avec eux était d’autant plus compliqué que leur syndrome était avancé !
Car ils ajoutent une complexité non négligeable à un projet et ensuite pour faire intervenir une ressource non expérimentée et bien… ça fini souvent avec quelqu'un en pleure avant même d’avoir écrit une ligne de code.
Pour appuyer mes propos, imaginez, nous avons vu une architecture MVC (en 3 couches), y ajouter des patterns n’est déjà pas toujours évident, même si les patterns que l’on a vu s’adaptent bien à l’architecture MVC.
D’autres architectures existent, par exemple SOA, qui est une architecture orientée services. Cette architecture contient, en moyenne pour une utilisation normale, entre 10 et 12 couches. Là, on parle d’une complexité déjà impactante en termes d’architecture…
Ajoutez une surutilisation de patterns et seuls les développeurs séniors seront capables de travailler sur ce projet (mais ça ne donnera envie à personne…)
Evitez absolument la complexité dans vos développements, un pattern n'a d'avantage que s'il est employé correctement
Trois couches
Chaque couche a son propre objectif et ces couches ne communiquent que d'une seule manière avec les autres.
Modèle
Contrôleur
Vue
Création de l'arborescence
Créer une arborescence de dossier comme suit :
Wamp & base de données
Déjà, il faut installer wamp et créer une base,
Le PHP et le MVC
Maintenant qu’on a l’arborescence, on va rajouter quelques fichiers:
Le routing
Faire un routing plus propre (quand on n’utilise pas de framework et qu’on aime faire tout soit même)
Si s'en est ?
Ce sont des frameworks utilisant l’architecture MVC sur lesquels vous aller vous greffer pour réaliser vos développements.
C’est un gain de temps, mais parfois ça peut être contraignant :
Exemples de Frameworks MVC :
Réalisez un jeu du serpent (celui sur jeu de plateau) simple, en MVC :
Une page pour démarrer une partie prenant 2 noms de joueurs (mini-formulaire)
Déroulement de la partie :
2 joueurs lancent un dé (1-6) au tour par tour en appuyant sur un bouton de l'IHM
Affichez uniquement la position (en chiffre) du joueur (sauf si vous êtes vraiment bon en IHM)
Le premier joueur arrivant à la case 50 gagne.
Si l'un des 2 joueur dépasse 50, ce joueur retourne directement à la case 25. Jusqu'à ce qu'un des deux gagne la partie.
La page acclame le joueur qui réussi.
Enregistrez chaque partie terminée dans une base de donnée (une simple table suffit).
Affichez le nombre de parties totales terminées depuis le début du site
Exercice utilisé en workshop final
Envoyer fichier modelisation_test
BON COURAGE !
(après c'est fini)
Evaluation UML + Design Pattern sur papier !
Workshop noté : choisissiez un sujet, réalisez les diagrammes UML (cas d'utilisation, activités, séquences, classes) et que vous implémentiez un Design Pattern, sur PAPIER :
Iterator / Singleton / Proxy / Adapter interdits pour le workshop.
BON COURAGE !
(après c'est fini)
Vous allez recevoir une expression de besoin et un sujet, avec 5 diagrammes à réaliser.
Vous devez me rendre ces diagrammes au format .png (image).
Mettez vos diagrammes dans un dossier avec votre nom & prénom, mettez y les diagrammes et envoyez moi ce zip sur discord ou par email à cdric.brasseur@gmail.com
Visitor (permet d’inspecter les éléments d’un autre objets)