Académique Documents
Professionnel Documents
Culture Documents
STUPID VS SOLID
Intro aux DP
1
08/11/2020
Le principe STUPID
• Acronyme pour :
– Singleton : instances uniques
– Tight Coupling: couplage fort
– Untestability: non testabilité
– Premature Optimizations : optimisations prématurées
– Indescriptive Naming : nommage indéchiffrable
– Duplication : duplications
Singleton
• les singletons sont comparables à des variables globales de
l'application (accessible depuis n'importe où et à n'importe quel
moment dans le code).
• Si l'état d'un singleton est modifiable à tout moment, par
l'intermédiaire de mutateurs (setters) par exemple, alors
n'importe quelle ligne de code de l'application pourrait modifier
cet objet.
• Une autre instruction de l'application exécutée plus tard
recevrait alors un singleton avec un état inattendu, ce qui
pourrait avoir des conséquences nuisibles.
• les singletons introduisent des couplages forts entre les objets
2
08/11/2020
Couplage fort
• Il se traduit par les dépendances qui existent entre
plusieurs modules.
3
08/11/2020
Optimisations prématurées
• Optimiser le code trop tôt dans un but de le rendre plus performant ou
parfois plus concis est toujours un effort inutile car le code n’est pas
fini et sa performance peut être acceptable
• les optimisations prématurées du code rendent la lecture et la
compréhension de ce dernier plus difficiles.
• Il est plus sage de sacrifier ces optimisations au profit d'un code clair et
compréhensible.
• Il convient d'optimiser au moment opportun lorsque ce besoin se fait
réellement sentir.
Nommage indéchiffrable
• Un nommage simple et compréhensible du code
• Il fait gagner un temps précieux lorsqu'il s'agit de le relire, le maintenir ou le
faire évoluer.
• C'est l'une des tâches des plus compliquées pour un développeur.
• Savoir nommer correctement une variable, une fonction, une méthode, une
classe ou encore un espace de nommage n'est pas toujours facile.
• La faible maitrise du métier de l'application que l'on développe complique
cette tache.
• Un bon nommage apporte la sémantique au code
• Il fait éviter des commentaires inutiles.
• Eviter l’usage d'abréviations ou d'acronymes dans le code, car pas tout les
développeurs qui connaissent leurs sens.
4
08/11/2020
Duplications
Garder le code KISS (Keep It Simple Stupid) et DRY (Don't Repeat Yourself).
Les duplications de code augmentent le temps de maintenance et les
risques de bogues.
Une modification du code nécessite de répercuter le changement à
plusieurs endroits.
• Des méthodes simples existent pour réduire les duplications du code.
Dans un ensemble de classes, il s'agit par exemple de profiter de
l'héritage ou de la composition ou de Template en isolant les
redondances dans des classes, interfaces et méthodes.
Le principe SOLID
• SOLID est l'acronyme pour les cinq principes suivants :
– Responsabilité unique (Single Responsability Principle),
– Ouvert / fermé (Open Close Principle),
– Substitution de Liskov (Liskov Substitution Principle),
– Ségrégation d'interfaces (Interface Segregation Principle),
– Injection de dépendance (Dependency Injection Principle).
10
10
5
08/11/2020
11
11
Exemple
<?php
class CsvDataImporter {
public function import($file) { …. }
private function loadFile($file) { …}
private function importData(array $records) {
…}
}
la classe CsvDataImporter realise deux tâches de nature
complètement différente :
– Lire un fichier CSV et transformer les données en tableaux PHP,
– Importer ces enregistrements dans une base de données MySQL.
12
12
6
08/11/2020
<?php
class DataImporter {
private $loader;
private $gateway;
public function __construct(FileLoader $loader, Gateway
$gateway) { ….}
public function import($file) { … }
}
13
13
14
14
7
08/11/2020
15
15
16
8
08/11/2020
17
Exemple
<?php
interface UrlGeneratorInterface {
public function generate($name, $parameters = array()); }
interface UrlMatcherInterface {
public function match($pathinfo); }
interface RouterInterface extends UrlMatcherInterface,
UrlGeneratorInterface {
public function getRouteCollection();
}
Avantages:
• Typer un argument uniquement avec l'interface
UrlGeneratorInterface quand une classe a besoin d'appeler
seulement la méthode generate(…) sur cet argument
• Un des avantages à fractionner des interfaces est la testabilité.
18
18
9
08/11/2020
19
19
20
20
10
08/11/2020
21
21
22
22
11
08/11/2020
23
23
Exemple en php
<?php
interface UrlGeneratorInterface {
public function generate($name, $parameters = array());
}
interface UrlMatcherInterface {
public function match($pathinfo);
}
interface RouterInterface {
public function getRouteCollection();
}
24
24
12
08/11/2020
25
26
26
13
08/11/2020
• Exemple de dépendance
<?php
class DataImporter {
private $loader;
private $gateway;
public function __construct() {
$this->loader = new CsvFileLoader();
$this->gateway = new DataGateway();
}
}
Inconvénients:
• la classe DataImporter devient fortement couplée à sa dépendance
CsvFileLoader.
è Impossibilité de remplacer cette dépendance par une autre pour un
besoin ultérieur.
• Empêche de tester unitairement la classe DataImporter puisque les
dépendances ne peuvent être remplacées par des doublures (« mocks
»).
27
27
• Inversion de dependance:
<?php
class DataImporter {
private $loader;
private $gateway;
public function __construct(FileLoader $loader, Gateway $gateway) {
$this->loader = $loader;
$this->gateway = $gateway; }
}
28
28
14
08/11/2020
29
29
Introduction au DP
• L'utilisation actuelle vient des travaux de l'architecte
Christopher Alexander
• Il a étudié les manières d'améliorer le processus de
conception de bâtiments et des zones urbaines
“Chaque patron est une règle en 3 parties, qui exprime une relation entre un certain
contexte, un problème et une solution.”
• La définition habituelle d'un patron est :
“Une solution à un problème dans un contexte.”
• Les patrons peuvent être utilisés dans de nombreux
domaines différents, y compris le développement logiciel.
30
30
15
08/11/2020
Pourquoi le DP?
"Concevoir un logiciel orienté-objet est difficile, et concevoir
un logiciel orienté-objet réutilisable est encore plus difficile. »
Erich Gamma
• Les concepteurs expérimentés réutilise des solutions qui ont
fonctionné dans le passé
• Les systèmes orientés-objet bien structurés suivent des
patrons récurrents pour les classes et objets
• Les patrons qui ont fonctionné dans le passé permettent
d'être plus productif.
• Les conceptions qui en résultent sont plus flexibles et
réutilisables.
31
31
32
32
16
08/11/2020
Historique des DP
• Cunningham et Beck utilisent les idées d'Alexander pour
développer un petit langage de patrons pour Smalltalk 1990 –
• Le Gang des 4 (« Gang of Four » : Gamma, Helm, Johnson and
Vlissides) commence à travailler à la compilation d'un catalogue
de patrons de conceptions
• Bruce Anderson donne le premier workshop de Patrons au
OOPSLA
• Kent Beck et Grady Booch sponsorisent la première réunion de
ce qui est maintenant connu comme le groupe Hillside
• Le Gang des 4 (GoF) publie le livre des Patrons de conception
33
33
DP GoF
• Le premier livre sur les patrons de conceptions était :
‘Design Patterns Elements of Reuse’
par Erich Gamma, Richard Helm, Ralph Johnson, et John Vlissides’
Les patrons de conception sont :
« Descriptions d'objets et de classes communicantes qui sont
adaptées à la résolution d'un problème général de conception
dans un contexte particulier » Chaque patron de conception
décrit un ensemble d'objets et de classes communicants.
34
34
17
08/11/2020
35
Portée d’un DP
• Portée de Classe
– Focalisation sur les relations entre classes et
leurs sous-classes
– Réutilisation par héritage
• Portée d’Instance
– Focalisation sur les relations entre les objets
– Réutilisation par composition
36
36
18
08/11/2020
37
37
38
38
19
08/11/2020
39
39
40
40
20