Dive Into Design Patterns FR Demo
Dive Into Design Patterns FR Demo
Dive Into Design Patterns FR Demo
longée
ée aauu cœur de
dess
PATR
TRON
ONSS
DE CONCEP
ONCEPTTION
v2021-1.2
VERSION DÉMO
Objets, classes
Aimez-vous les chats ? J’espère que oui, parce que je vais ten-
ter de vous expliquer le concept de la POO avec différents
exemples de chats.
Une classe est donc un peu comme un plan qui définit la struc-
ture pour les objets. Les objets sont les instances concrètes de
cette classe.
Hiérarchies de classes
Tout va pour le mieux lorsque l’on ne s’occupe que d’une seule
classe, mais bien entendu, un vrai programme en contient bien
11 Introduction à la POO / Les bases de la POO
Une classe parent, comme celle que nous venons juste de dé-
finir, est appelée une classe mère (ou super-classe, ou encore
classe de base). Ses enfants sont des sous-classes (ou classes
dérivées). Les sous-classes héritent de l’état et du comporte-
ment de leur parent et ne définissent que les attributs ou les
comportements qui diffèrent. Par conséquent, la classe Chat
posséderait la méthode miaule , et la classe Chien la mé-
thode aboie .
Organisme .
Les classes d’un diagramme UML peuvent être simplifiées s’il est plus
important d’afficher leurs relations que leur contenu.
13 Introduction à la POO / Les bases de la POO
Réutilisation du code
Les indicateurs les plus importants dans le développement
d’un logiciel sont le coût et le temps. Plus le temps de dévelop-
pement est court, et plus vous entrerez tôt sur le marché par
rapport à vos concurrents. Des coûts de développement faibles
vous permettent d’allouer une plus grande part de votre bud-
get au marketing et de prospecter sur une plus grande échelle.
1
Voici quelques conseils avisés d’Erich Gamma , un des pères
fondateurs des patrons de conception, au sujet du rôle des pa-
trons dans la réutilisation du code :
„
vos idées de conception et vos concepts indépendamment du
code concret.
Extensibilité
Le changement est la seule constante dans la vie d’un
développeur.
• Vous avez sorti un jeu vidéo sur Windows, mais maintenant les
gens veulent une version macOS.
Principes de conception
Un logiciel bien conçu, c’est quoi ? Comment pouvez-vous
l’évaluer ? Quelles pratiques devez-vous suivre pour y parve-
nir ? Comment pouvez-vous rendre votre architecture flexible,
stable et facile à comprendre ?
Nous pouvons anticiper le fait que le code des taxes aura pro-
bablement besoin d’évoluer dans le futur. Le taux de la taxe
varie en fonction du pays, de l’état ou même de la ville de rési-
dence du client, et la formule peut changer tout au long de la
vie du programme à cause de nouvelles lois. Vous allez donc
modifier la méthode getTotalCommande assez souvent. Mais le
nom de la méthode suggère implicitement qu’elle ne se préoc-
cupe pas de la manière dont ce calcul est effectué.
1 method getOrderTotal(order) is
2 total = 0
3 foreach item in order.lineItems
4 total += item.price * item.quantity
5
6 if (order.country == "US")
7 total += total * 0.07 // Taxe américaine
8 else if (order.country == "EU"):
9 total += total * 0.20 // TVA européenne
10
11 return total
AVANT : le code de calcul des taxes est mélangé avec le reste du code de
la méthode.
44 Principes de conception / Encapsuler ce qui varie
1 method getOrderTotal(order) is
2 total = 0
3 foreach item in order.lineItems
4 total += item.price * item.quantity
5
6 total += total * getTaxRate(order.country)
7
8 return total
9
10 method getTaxRate(country) is
11 if (country == "US")
12 return 0.07 // Taxe américaine
13 else if (country == "EU")
14 return 0.20 // TVA européenne
15 else
16 return 0
Patrons de création
Les patrons de création fournissent des mécanismes de créa-
tion d’objets qui augmentent la flexibilité et la réutilisation
du code.
Fabrique
Factory Method
Fabrique abstraite
Abstract Factory
Monteur
Builder
Prototype
Prototype
Singleton
Singleton
FABRIQUE
Alias: Constructeur virtuel, Factory Method
Problème
Imaginez que vous êtes en train de créer une application de
gestion logistique. La première version de votre application
ne propose que le transport par camion, la majeure partie de
votre code est donc située dans la classe Camion .
Solution
Le patron de conception fabrique vous propose de remplacer
les appels directs au constructeur de l’objet (à l’aide de l’opé-
rateur new ) en appelant une méthode fabrique spéciale. Pas
d’inquiétude, les objets sont toujours créés avec l’opérateur
new , mais l’appel se fait à l’intérieur de la méthode fabrique.
Les sous-classes peuvent modifier les classes des objets retournés par la
méthode fabrique.
Tant que les classes produit implémentent une interface commune, vous
pouvez passer leurs objets au code client sans tout faire planter.
Structure
Pseudo-code
Cet exemple montre comment la fabrique peut être utilisée
pour créer des éléments d’une UI (interface utilisateur) multi-
plateforme sans coupler le code client aux classes concrètes
de l’UI.
89 Patrons de création / Fabrique
19 // Produit.
20 Button okButton = createButton()
21 // Utilise le produit.
22 okButton.onClick(closeDialog)
23 okButton.render()
24
25
26 // Les créateurs concrets redéfinissent la méthode fabrique pour
27 // changer le type du produit qui en résulte.
28 class WindowsDialog extends Dialog is
29 method createButton():Button is
30 return new WindowsButton()
31
32 class WebDialog extends Dialog is
33 method createButton():Button is
34 return new HTMLButton()
35
36
37 // L’interface du produit déclare les traitements que tous les
38 // produits concrets doivent implémenter.
39 interface Button is
40 method render()
41 method onClick(f)
42
43 // Les produits concrets fournissent diverses implémentations de
44 // l’interface du produit.
45 class WindowsButton implements Button is
46 method render(a, b) is
47 // Affiche un bouton avec le style Windows.
48 method onClick(f) is
49 // Attribue un événement sur un clic natif dans un
50 // système d’exploitation.
92 Patrons de création / Fabrique
51
52 class HTMLButton implements Button is
53 method render(a, b) is
54 // Retourne une représentation HTML d’un bouton.
55 method onClick(f) is
56 // Attribue un événement sur un clic dans un navigateur
57 // Internet.
58
59
60 class Application is
61 field dialog: Dialog
62
63 // L’application choisit un type de créateur en fonction de
64 // la configuration actuelle ou des paramètres
65 // d’environnement.
66 method initialize() is
67 config = readApplicationConfigFile()
68
69 if (config.OS == "Windows") then
70 dialog = new WindowsDialog()
71 else if (config.OS == "Web") then
72 dialog = new WebDialog()
73 else
74 throw new Exception("Error! Unknown operating system.")
75
76 // Le code client manipule une instance d’un créateur
77 // concret, mais uniquement au moyen de son interface de
78 // base. Tant que le client continue de passer par cette
79 // interface pour manipuler le créateur, vous pouvez passer
80 // n’importe quelle sous-classe du créateur.
81 method main() is
82 this
this.initialize()
93 Patrons de création / Fabrique
83 dialog.render()
Possibilités d’application
Utilisez la fabrique si vous ne connaissez pas à l’avance les
types et dépendances précis des objets que vous allez utiliser
dans votre code.
Mise en œuvre
1. Implémentez la même interface pour tous les produits. Cette
interface doit déclarer des méthodes que tous les produits
peuvent avoir en commun.
96 Patrons de création / Fabrique
veut recevoir.
Avantages et inconvénients
Vous désolidarisez le Créateur des produits concrets.