Vous êtes sur la page 1sur 204

Gestion de projet

Jean-Charles Rgin
Licence Informatique 3me anne - MIAGE

Gnie Logiciel
Jean-Charles Rgin
Licence Informatique 3me anne - MIAGE

Gnie logiciel

Wikipdia
Wiki
di : Le
L gnie
i logiciel
l i i l (en
( anglais
l i : software
ft
engineering)
i
i ):
ensemble des mthodes, des techniques et des outils concourant la
production d'un logiciel, au-del de la seule activit de
programmation .

Manire dont le code source d'un logiciel est spcifi puis produit.
Concerne le Cycle de vie des logiciels :

analyse du besoin
laboration des spcifications
conceptualisation du mcanisme interne au logiciel
techniques de programmation
dveloppement
phase
h
d
de test
maintenance.

Gnie logiciel

Pas de mthodes particulires prsentes


Bas sur mon exprience
p

Logiciel

Arrt ministriel du 22 dcembre 1981: un logiciel


est dfini comme "un ensemble de programmes, de
procds, de rgles, de documentation relatifs au
fonctionnement dun ensemble de traitement de
linformation".

Logiciel

Les bugs surviennent quand le logiciel ne


correspond pas au besoin.
Un bug = non-respect de la spcification du
systme,
y
, cest--dire de la dfinition de ses
fonctionnalits, de ce que le systme est cens faire.
Un programme bogu = programme dont la mise
en uvre ne vrifie pas la spcification
Ne jouez pas sur les mots

Bugs

Logiciel

Sans bug ?
Validation de Windows 2000
600

000 bta testeurs


Au lancement de sa commercialisation il restait 63 000
problmes potentiels dans le code, dont 28 000 sont
rels.

0,57 erreurs (var non initialises) par millier de


lignes de code en moyenne
MySQL : 0,09

Bugs

LLe 13 novembre
b 2007 au soir, 10000 sites
i web
b hbergs
hb
par Ovh, connaissent des difficults.

Ovh a subit un crash majeur sur un des 16 serveurs de stockage,


stockage
qui fonctionne avec en Raid-6 avec 28 disques, permettant une
tolrance de panne de 2 disques, or 3 disques sont en panne et
le ssystme
stme Raid a t rendu
rend in-oprationnel.
in oprationnel
Les sites ont t inaccessibles (erreur 404) environ 20h.
Les serveurs SQL n'ont
n ont pas t touchs.
Les backups rcent ont saut aussi, les webmestres se sont
retrouvs avec des sites datant davril 2007. Toutes les
modifications
difi ti
faites
f it depuis
d i 7 mois
i par les
l utilisateurs
tili t
sontt perdues
d
Ovh a annonc un "geste commercial" de quelques euros

Bugs

29/12/2005
29/
2/200 Cotisation
C i i retraite
i - Quelque
Q
113
3
personnes ont eu la surprise de recevoir pour Nol
un avis
i d'
d'chance
h
de
d leurs
l
cotisations
ti ti
retraite
t it pour
l'anne 2006 de... deux milliards d'euros
01/11/2005 Gros
G
b
bug lla bourse
b
de
d Tokyo
T k :
toutes les cotations bloques toute la journe.
17/11/2004 aucune couverture rseau

d
durant
15 48h. Chez Bouygues Telecom deux serveurs
d'acheminement
d
h i
td
des appels
l sontt tombs
t b en panne.
L'un tait cens tre le secours de l'autre.

Bugs identifis

Convocation
Con
ocation de centenaires l'cole
l cole : Convocation
C
ti ll'cole
l primaire
i i d
de
personnes ges de 106 ans.

Mission Vnus : passage 5 000 000 de Km de la plante, au lieu de 5 000 Km


prvus.

remplacement d'une virgule par un point (au format US des nombres).

Mariner 1 : 27 juillet 1962, la premire sonde spatiale du programme Mariner fut


dtruite peu de temps aprs son envol. Cot : 80 millions de dollars.

Codage sur deux caractres de lage

un trait dunion
d union oubli dans un programme Fortran
( plus coteux trait dunion de lhistoire , Arthur C. Clarke).

Passage de la ligne : Au passage de l'quateur un F16 se retrouve sur le dos.

changement
h
de
d signe
i
de
d la
l latitude
l i d mall pris
i en compte.

Logiciel partout et trs gros

montre : 2 K instr
instructions
ctions
tlphone mobile : 150 K instructions
automobile : 1 M instructions
central tlphonique : 1 M instructions
noyau Linux : 3,7 M instructions
systme de combat du porte avions Charles de Gaulle : 8 M instructions
portail Yahoo : 11 M instructions
W95 : 10 M instructions
WNT : 16,5
, M instructions
W2K : 30 50 M instructions
Office VX pour Mac : 25 M
Direction gnrale de la comptabilit publique (Bercy) : 160 M instructions Cobol
Catia : 200 M instructions

Bugs

Socrate. systme de rservation de places Socrate


de la SNCF : plantage rgulier
rachat

par la SNCF d'un systme de rservation de


places d'une compagnie arienne, sans radaptation
totale au cahier des charges du transport ferroviaire.

Retards de la mise en service de la Trs Grande


Bibliothque, en 1999. Le systme informatique a
pourtant cot 8 Milliards de F (merci
p
(
Google).
g )

Logiciel partout et trs gros

90% des nouvelles fonctionnalits des automobiles


sont apportes par l'lectronique et l'informatique
embarques.
"Il y a plus d'informatique dans la Volvo S80 que
dans le chasseur F15" dclarait en janvier 2000 le
Prsident d'Audi.

Logiciel : une rgle

Un logiciel nest jamais utilis comme le


programmeur le pense
On ne sait donc pas bien ce qui va intresser les
utilisateurs
Mise

sur la march rapide


Modifications aprs comprhension

Logiciel : fonctions et besoin

U llogiciel
Un
i i l contient
ti t
Plein de fonctions pour les dbutants
Des fonctions pour les gens moyens
Plein de fonctions pour les experts

Les utilisateurs sont


Certains sont dbutants
La grande majorit est moyen
Peu sont experts

Adquation ?

Logiciel

Dtection de bugs automatique ?


Problme de la Halte
consiste, tant donn un programme informatique
quelconque
q
q (au
( sens machine de Turing),
g), dire s'il
finira par s'arrter ou non.
Indcidable : il n'existe p
pas de programme
p g
informatique qui prendrait comme entre le code d'un
programme informatique quelconque et qui grce la
seule analyse de ce code ressortirait VRAI si le
programme s'arrte et FAUX sinon.

La Halte : consquences

PProblme
bl d
du ramasse-miettes
i tt : on cherche
h h librer
lib des
d zones
mmoires juste aprs leur dernire utilisation.
Ce problme est quivalent celui de l'arrt. Rduction : soit P un
programme dont on veut tester l'arrt ; considrons le programme :
crer une zone mmoire X (jamais utilise dans P)
excuter P
crire dans X.
Clairement, la zone mmoire X sert aprs sa cration si et seulement
si P termine. Donc, si on savait dterminer automatiquement au vu de
la lecture du programme si on peut librer X juste aprs son
allocation, on saurait si P termine. Cela est impossible, donc il
n'existe aucun algorithme de ramasse-miettes optimalement prcis.

Comment minimiser les bugs ?

En appliquant certaines rgles de base


En p
pensant aux problmes
p
par
p avance
En testant

Gnie Logiciel

Dfinition gnrale et vue densemble

Gnie logiciel

G un logiciel
Grer
l i i l cest
t considrer
id lles points
i t suivants
i t :
Comptition (que font les autres)
Evolution des techniques (C++ normes,
normes architecture SSE,
SSE
multicores, GPGPU, CUDA)
Tests
Le code
Gestion/Partage du code
Exemples (pas les tests)
Documentation (qd commence ton ?)
Qualit et outils :

Du dveloppement
Du logiciel en lui-mme : facilit dutilisation / accessibilit

Gnie logiciel

G un logiciel
Grer
l i i l cest
t considrer
id lles points
i t suivants
i t :
Optimisation du code (qd ? Ou ?) : profiler, quantify
Protection/Secrets (Obfuscation)
Multithreading
Conception
p
de code (Perenit,
(
Design
g Pattern))
Maintenance/Correction de bugs / Minimiser les
modifications intrusives
Portages :

compilateurs/ machines/systmes/langages (wrapper)


indpendance du code vis--vis du matriel, de lOS

Evolution : ToDo list/ refactoring


Installer

Gnie Logiciel

Les tests

Tests

But :
trouver

un nombre maximum de comportements


problmatiques du logiciel
s'assurer que ce systme ragit de la faon prvue par
ses concepteurs (spcifications)
sassurer que ce systme est conforme aux attentes du
client l'ayant command (besoins), respectivement.

Tests

Tests de bote noire


Le test porte sur le fonctionnement externe du
systme. La faon dont le systme ralise les
traitements n'entre pas dans le champ du test.
Tests de bote blanche
Le test vrifie les dtails d
d'implmentation,
implmentation, cc'est
est
dire le comportement interne du logiciel..

Tests conformit

Tests de conformit
Le test vrifie la conformit du logiciel par rapport
ses spcifications et sa conception.
Tests de non-conformit : on vrifie q
que les cas non
prvus ne perturbent pas le systmes
Tests

de robustesse : on introduit de nouvelles


contraintes
Tests de vulnrabilit : on cherche attaquer le
systmes, le mettre en dfaut

Tests unitaires/couvertures

TTests
t unitaires
it i
Chaque module du logiciel est teste sparment, par
rapport ses spcifications, aux erreurs de logique.
Tests cas limites
Que se passe til si on atteint une borne ? Si un fichier nest
pas prsent ? On essaie les cas limites
Tests derreurs
Comment le logiciel gre til les erreurs ? Peut-on avoir une
erreur dans un gestion derreur ?
Tests de couverture

chaque fonction est appele par au moins un test


chaque code est travers au moins une fois
difficile faire : utilitaires existent (pure coverage)

Tests de prversions

Tests beta
Raliss par des dveloppeurs ou des utilisateurs
slectionns, ils vrifient que le logiciel se comporte
pour l'utilisateur final comme prvu par le cahier
des charges.
Tests alpha
Le logiciel n'est pas encore entirement fonctionnel,
les testeurs alpha vrifient la pr
pr-version.
version.

Tests dintgration
d intgration

TTests d'i
d'intgration

i
Les modules valids par les test unitaires sont
rassembls Le test d
rassembls.
d'intgration
intgration vrifie que l'intgration
l intgration
des modules n'a pas altr leur comportement.
Tests d'intgration
d intgration systme
L'application doit fonctionner dans son environnement
production,, avec les autres applications
pp
prsentes
p
de p
sur la plateforme et avec le systme d'exploitation.
Tests de recette
Les utilisateurs finaux vrifient sur site que le systme
rpond de manire parfaitement correcte.

Tests

Tests fonctionnels
L'ensemble des fonctionnalits prvues est test :
fiabilit, performance, scurit, affichages, etc
Tests de non rgression
g
Aprs chaque modification, correction ou
adaptation du logiciel, il faut vrifier que le
comportement des fonctionnalits n'a pas t
perturb, mme lorsqu'elle
lorsqu elle ne sont pas concernes
directement par la modification.

Tests

Tests de performance
On mesure les temps de rponse, les temps de
traitements. On recherche les oprations lentes et
critiques
Tests de monte en charge
On cherche quitter la simulation et pousser le
systme dans ces retranchements. On augmente le
nombre de donnes principales et on regarde le
comportement (quadratique,
(
d
cubique,
b
l
lags
))
Augmentation du nombre dutilisateurs pour un serveur

Tests

Tests de stress
On combine tests de performance et monte en
charge. On peut simuler des dfaillances. Longs en
gnral

Tests

Quand les faire ?


Ds

le dbut
Tout le temps, mais les dveloppeurs naiment pas
crire des tests

Qui les crits ?


Les

dveloppeurs
Quelquun dautre cest bien aussi (autre point de vue =
bugs dtects plus vite; jjai
ai pas pens a ! )

Gnie Logiciel

Le code source

Le code source

Il doit
tre

lisible par les autres (clair). Vous ntes pas seul.

Noms

des fonctions
Noms des variables
Respecter
R
t

les
l normes de
d codage
d
(_
( devant
d
t les
l champs,
h
accolades obligatoires ). Difficile mais important.
tre clairement structur : tre comprhensible assez
facilement
tre concis
Ne pas faire de suppositions sur dautre partie de
votre code

Le code source

Le non respect des normes des entreprises est le


premier reproche fait aux stagiaires par les
entreprises
t
i
Difficile au dbut, mais ncessaire
Parfois connaissance implicite (pas de document
dtaillant tout)
Exemple :
pas

de commentaires pour le code


pas de noms de fonctions trop long
pas de return au milieu des fonctions

Le code source

Il existe quelques rgles communes de codage


http://www.possibility.com/Cpp/CppCodingStandard.

html#names
http://geosoft.no/development/cpppractice.html
http://www.codingstandard.com/HICPPCM/index.html
http://www.misra
http://www.misra-cpp.org/
cpp.org/

Gnie Logiciel

Gestion / Partage du code

Gestion / Partage du code

Plusieurs personnes doivent interagir en mme


temps sur le mme code.
Code commun + chacun dveloppe un truc de son
ct
De

temps en temps modification du code commun

Parfois on veut jsute tester


Parfois on veut revenir une version prcdente
(par exemple comprendre une rgression ou
lapparition dun bug)

Gestion / Partage du code

Un logiciel de gestion de versions permettant de


stocker des informations pour une ou plusieurs
ressources informatiques permettant de rcuprer
toutes les versions intermdiaires des ressources,
ainsi que les diffrences entre les versions.
Les plus connus CVS et subversion (SVN)
Vi l Studio
Visual
S di SSource Safe
S f (Microsoft)
(Mi
f)

Gestion / Partage du code

M
Mutualisation
l
d
du d
dveloppement:
l
Un groupe de dveloppeurs utilise le gestionnaire pour
stocker toute volution du code source.
source
Le gestionnaire

gre les mises jour des sources pour chaque dveloppeur,


conserve une trace de chaque changement (avec commentaire).
travaille par fusion de copies locale et distante, et non par

crasement
d
de la
l version
i distante
di
par la
l version
i locale.
l l

Deux dveloppeurs sur une mme source

les changements du premier soumettre son travail ne seront pas


perdus lorsque le second, qui a donc travaill sur une version non
encore modifie par le premier, renvoie ses modifications.

Gestion / Partage du code

M t li ti du
Mutualisation
d dveloppement:
d l
t avec CVS/Subversion
CVS/S b
i

Fonctionne par un systme de commit/update


Une copie globale + chacun dispose dune
d une copie en locale
Chacun travaille avec sa copie locale
On veut committer les modifications = modifier le fichier
global partir du local
On commence par updater la copie locale :

Introduction des modifications du fichier global dans le fichier local


Prise en compte des modifs de la version globale et modification de
la version locale pour etre compatible. Vrification du code
(compilation, tests). On update de nouveau jusqu quivalence
entre les versions

Modification de la version globale par la version locale

Gestion / Partage du code

Cration de branches = modification sur un


ensemble de fichiers
maintenance

d'anciennes versions du logiciel (sur les


branches) tout en continuant le dveloppement des
futures versions (sur le tronc) ;
dveloppement parallle de plusieurs fonctionnalits
volumineuses sans bloquer le travail quotidien sur les
autres fonctionnalits.

Gnie Logiciel

Les exemples

Les exemples

Il est important de donner un certain nombres


dexemples
La plupart des utilisateurs ne lisent pas la
documentation, mais regardent les exemples
Ils doivent tre pdagogiques :
On

doit pouvoir les comprendre sans documentation


On doit pouvoir sen inspirer : codage par mimtisme
est assez frquent

On met un peu de documentations dans les


exemples.

Gnie Logiciel

La documentation

La documentation

Elle estt ttrs


Ell
iimportante
t t
Elle peut avoir valeur lgale
Avantages
g :

Elle amne des clarifications


Elle donne une vision et une cohrence densemble
Elle fait rflchir
Elle donne un rfrence
Elle permet de dfinir clairement certains concepts

Inconvnients :

Elle peut figer les structures internes


Elle peut limiter les volutions
Elle est pnible crire
Elle met en vidence certains dfauts (mauvaise structure )

La documentation

Il y a une grande diffrence


ff
entre
la

documentation interne (du code, de son organisation,


d son fonctionnement,
des
f
i
des
d algorithmes,
l ih
des
d ides
id ))
la documentation externe (ce que le client voit, les
autres quipes ))

Il ffautt garder
d cette
tt diff
diffrence. D
Documenter
t =
rigidifier
L
Lopen
source estt trs
t rarementt document
d
t (fait
(f it
exprs)

La documentation

Mme sil y a des documentalistes ou si elle est


sous-traite les dveloppeurs et responsables de
projets sont impliqus (relecture modifications
obligatoires)
Il existe des outils pour la gnrer automatiquement
Doxygen

(Dmo !!!)

La documentation

3 types
t
de
d documentation
d
t ti courants
t

Getting started :
petit manuel expliquant comment utiliser le logiciel partir de
rien.
commence par un guide dinstallation, puis prsente rapidement le
logiciel avec des exemples trs simple

Manuel de lutilisateur :
manuel principalement bas sur des exemples et des concepts.
explique
li
comment ffaire
i quelque
l
chose
h
avec lle llogiciel
ii l

Manuel de rfrence :
manuel de type
yp dictionnaire
explique de faon trs prcise le fonctionnement de chaque
fonctionnalit

La documentation

Documentation entre versions :


Migration

guide :

explique

un ancien utilisateur comment passer la


nouvelle version (lutiliser au mieux).
explique comment utiliser de nouvelles fonctions la place
de prcdentes
Release

notes :

contient

lensemble des modifications depuis la dernire

version
rfrencie
f
i lles ffonctionnalits
i
li obsoltes
b l et lles remplaante
l
prsente les nouveauts

La documentation

Indpendance ou pas du code source ?


a

se discute

Difficult majeure : faire voluer le produit et la


documentation en mme temps
Une documentation obsolte est un vrai problme
Ce qui est valable pour la documentation est aussi
valable pour les commentaires

Gnie Logiciel

La qualit et les outils

Qualit logicielle

Q l llogicielle
Qualit
ll
Qualit du dveloppement et les outils
Qualit
Q li du
d logiciel
l ii l

Qualit

Aptitude lemploi + conformit aux spcifications

Automatisation des tests


Procdures de contrle
Dfinition de critres et de mesures

Qualit du dveloppement

O til d
Outils
de d
dveloppement
l
t

Outils de tests unitaires

cppUnit
Visual Studio : http://msdn.microsoft.com/fr-fr/library/bb385902.aspx
http://msdn microsoft com/fr fr/library/bb385902 aspx
Visual Studio : http://msdn.microsoft.com/en-us/library/d3bbz7tz.aspx
(DEMO)

O til d
Outils
de suivi
i id
des problmes
bl
(issue
(i
t ki system)
tracking
t )

Visual Studio
Eclipse

Mantis
Bugzilla

Outils de couverture de code

Couverture de code : pure coverage

Qualit du dveloppement

Outils de tests mmoire


Fuite

mmoire (memory leaks) : absence de


dsallocation mmoire : la mmoire grossit en
permanence.
Accs de la mmoire non alloue
Accs de la mmoire libre
Double dsallocations
Outils : Valgrind (Linux) Purify, BoundsChecker,
Insure++ (Windows)

Fuites mmoires : Memory leaks

Wh a button
When
b tt is
i pressed:
d
Get some memory, which will be used to remember the floor
number
Put the floor number into the memory
Are we already on the target floor?

If so, we have nothing to do: finished


Otherwise:

Wait until the lift is idle


Go to the required floor
Release the memory we used to remember the floor number

Fuite mmoire si on appuie sur le bouton de ltage


courant.

Qualit du dveloppement

Outils
O
til d
de profiling
fili : dtection
dt ti des
d parties
ti critiques
iti
d
du code,
d
en terme de performance

quantifyy
q
gprof
Visual Studio Profiler http://msdn.microsoft.com/frfr/magazine/cc337887 aspx (DEMO)
fr/magazine/cc337887.aspx
AMD CodeAnalyst
Intel Vtune

Optimisations guides par le profil

On ffaitit plusieurs
O
l i
run
Le compilateur sadapte (ex: dfinit les tests par dfauts
diffremment)

Profilage

P Sampling
Par
S
li

On fait tourner le code et toutes les ms (ou moins) on regarde


dans quelle fonction on est : on tablit des statistiques dutilisation
d utilisation
Avantage : le code nest pas modifi, et cela donne une ide
relle
Inconvnient : pas toujours trs prcis

Par Instrumentation

On modifie
O
f le code afin
f de pouvoir mesuer prcisment le temps
pass dans chaque fonction
Avantage : rsultats assez fins
Inconvnient : modifie le code donc ne mesure pas exactement la
ralit

Qualit du dveloppement

Outils dobfuscation (obfuscateur) : modifie un code


source afin de le rendre illisible. Surtout pour Java
et .NET (dcompilables facilement)
http://en.wikipedia.org/wiki/Obfuscated_code
//
/
/
RetroGuard,

ProGuard et yGuard pour Java


Visual Studio Dotfuscator pour .NET
http://msdn.microsoft.com/enus/library/ms227240.aspx
/
y/
p

Qualit du logiciel

FFacilit
ilit dutilisation
d tili ti
Accessibilit
On doit pouvoir faire simplement des choses simples
On peut accepter de la complexit pour des choses
complexes
La majeure partie des utilisateurs est de niveau moyen :
pas dbutant et pas experts
Voir section architecture

Gnie Logiciel

Optimisation du code

Optimisation du code

Ne pas optimiser nimporte quelle partie du code


Chercher le code critique
q
Ne pas chercher optimiser btement
On

fait une boucle complexe au lieu de 2 simple


Le compilateur sait faire plein doptimisations
On
O lit
li moins
i de
d d
donnes
dans
d
un fichier
fi hi (laccs
(l est
couteux)

Optimisation du code

O
Optimisation
Du modle / de larchitecture (on considre le problme
sous un autre angle)
De lalgorithme / de mthode
Du code source

Exemple : rsolution de problme difficiles


difficiles. Gains
potentiels
Changement
g
de modle : 1 000 000
Changement dalgorithme de recherche : 1 000
Optimisation du code source : 10

Optimisation du code

Exemple : rsolution de problme difficiles.


ff
G
Gains
potentiels
Changement

de modle : 1 000 000


Changement dalgorithme de recherche : 1 000
Optimisation du code source : 10

Projet ROCOCO (plusieurs annes, 6 personnes


impliques)
Changement

de modle : 5%
Changement dalgorithme de recherche : 20%
Optimisation du code source : 75%

Optimisation du code

O
Optimisation
Du

modle / de larchitecture (on considre le


problme
bl sous un autre angle)
l )
Trs

difficile
Peut ne conduire aucun rsultat
De

lalgorithme / de mthode

Assez

difficile
Peut ne pas bien marcher, amlioration pas certaine
Du

code source

Beaucoup

plus facile
Rsultats peu prs certains

Amlioration de llalgorithme
algorithme

Regardez la littrature
Chercher les bons mots cls ((doivent marcher dans
wikipdia) puis DBLP et google scholar
Trouver des bonnes pages web de chercheurs ou de
gens particulirement intresss
Att ti aux rsultats
Attention
lt t uniquement
i
t th
thoriques
i
Tri

: au moins n log(n) en thorie


Ok, mais uniquement si comparaison
Tri de nombres : presque linaire ! Voir Cormen

Amlioration du code

Documentations
Intel :
http://www.intel.com/Assets/PDF/manual/248966.pdf
//
/
/
/
/
AMD :
h //
http://www.amd.com/usd
/
en/assets/content_type/white_papers_and_tech_docs/251
12 PDF
12.PDF
C++ : http://www.agner.org/optimize/optimizing_cpp.pdf
http://www.openp //
p
std.org/jtc1/sc22/WG21/docs/TR18015.pdf*
http://en.wikibooks.org/wiki/Optimizing_C%2B%2B

Gnie Logiciel

Protection / Secrets
(Obfuscation/obfucateur)

Protection du code / Secrets

Il ne sagit pas ici de brevet logiciel


Comment protger certaines parties du code
Obfuscation

http://en.wikipedia.org/wiki/Obfuscated_code
Ne pas les donner! Donc pas de .h dtaills

Ides de base :
on

cre une classe encapsulant une autre classe.


on place la classe secrte dans une librairie
on minimise les .h visibles

Protection du code / Secrets

Class MaSuperStructureDeDonnee {
int* superdataastucieux

void superastucepourajouter(int i){}


public:
ajouter(int i){superastucepourajouter(i);}
};
.h visible
Class VisibleSdd {
MaSuperStructureDeDonnee* super; //ptr
public:
ajouter(int i);
}}
.cpp invisible
VisibleSdd::ajouter(int i){super->ajouter(i);}
Inconvnient : on perd de la performance
Avantage : introduit de la souplesse

Gnie Logiciel

Multithreading

Multithreading

Il est indispensable de penser au multithreading de


nos jours
Attention : multithreading diffrent de paralllisme
au sens large
Pas

la mme chose que les systmes rpartis

Pas

de problmes de pertes de messages, de dates


Se
S mfier
fi d
des smaphores,

h
mutex etc : cest
llourd!
d!
Tendance actuelle : spin lock et attente active
Mmoire

partage

Systmes multicores vont continuer

Multithreading

Apprendre penser diffremment


Il

va falloir utiliser plusieurs curs pour une mme


application
Pas de variables partages non protges
Design Pattern : Moniteur (on regroupe les objets
partags)

Super Multithreading

Ordinateur scalaire = GPU


Super
p multithreading
g = massivement parallle
p
OpenCL
CUDA
GPGPU

: general purpose GPU

Gnie Logiciel

Portages

Portages

Le mme logiciel peut tre utilis avec


Des

compilateurs diffrents
Des machines diffrentes
Des OS diffrents
Des langages diffrents

Ce nest pas une obligation, mais cela peut se


produire

Partages

C d utilisables
Code
tili bl avec plusieurs
l i
compilateurs/machines/OS
il t
/
hi /OS

On prvoit ds le dbut une utilisation multi-systmes


.h (hardware.h) dfinissant les constantes et spcificits de chaque
compilateur, chaque machine, chaque OS
On rend le code le plus indpendant possibles des
compilateurs/machines/OS

Utilisation dun sous-ensemble du langage


Gestion mmoire contrle
Gestion des threads contrle (Windows vs POSIX)

Franchement difficile avec le graphique


Utilisation de librairies permettant cela
Demande une trs bonne connaissance des
compilateurs/machines/OS

Portages

Wrapper : utilisation
W
tili ti d
dun code
d critit d
dans un llangage
partir dun autre langage
Fine couche de code qui permet de traduire une interface
en une autre interface. Ex code C et classe C++ autour
Utiliser pour simplifier, pour clarifier
Utiliser pour rendre proprement compatible des formats
dapparences incompatibles

Java Native Interface

framework q
qui permet
p
du code Java s'excutant
l'intrieur de la JVM d'appeler et d'tre appel par des
applications natives crites dans dautres langages

Gnie Logiciel

Installer

Installer

Programme permettant linstallation propre de


programme. Gre aussi la dsinstallation
InstallShield
Windows

installer
Nullsoft scriptable install system (NSIS)
http://nsis.sourceforge.net/Main_Page
p //
g
/
_ g

Installer

L test
Le
t t de
d linstallation
li t ll ti dun
d logiciel
l i i l nest
t pas simple
i l parce que

Les machines ne sont pas toutes les mmes

les logiciels installs peuvent tre diffrents


Lhistorique dinstallation/dsinstallation ne sont pas les mmes

Si une installation a prcdemment choue, elle a pu laisser des traces


utiles linstallation courante

Ide : virtualisation

Avantage :

on repart dun systme propre et vierge chaque fois

Inconvnients

La virtualisation peut contenir des bugs


Ne correspond aucune installation relle

Gnie Logiciel

Maintenance

Maintenance

M i t
Maintenance

corrective : corriger les bugs

volutive : faire voluer l'application

dfauts de fonctionnement
non-conformits d'un logiciel,
en ll'enrichissant
enrichissant de fonctions ou de modules supplmentaires
en remplaant une fonction existante par une autre
en proposant une approche diffrente.

adaptative
d
i :

adapter l'application pour quelle fonctionne sur des versions plus


rcentes des logiciels de base (sans changer la fonctionnalit du
l i i l)
logiciel)
migrer l'application sur de nouveaux logiciels de base (systme
d'exploitation, systme de gestion de base de donnes).

Maintenance

C
Correction
ti d
de bugs
b
Bugs de code simple
Bugs d
dalgorithme
algorithme : lalgorithme
l algorithme est faux
Bugs conceptuels plus complexe (le code est juste mais ce
nest pas cela quil faut faire)

Minimiser les modifications intrusives


A chaque nouveau code de nouveaux bugs sont introduits,
donc il faut viter d crire
crire du code pour rien
Rgression trs dsagrable. Introduction dans nouvelles
versions de problmes qui nexistaient pas avant :

bugs
performance temps/mmoire

Gnie Logiciel

Evolution / Rcriture

Evolution

Il est ncessaire de pouvoir faire voluer un logiciel


Un logiciel
g
nest jamais
j
utilis comme son concepteur
p
lavait pens ou de la faon dont le concepteur
lavait imagin.
g
Un logiciel volue
Parce

que
q e le concepteur
concepte r a des nouvelles
no elles ides
Parce que les utilisateurs ont de nouvelles requtes
Parce la comptition est l.

Evolution

Il nest
t pas facile
f il de
d faire
f i voluer
l
un llogiciel,
i i l surtout
t t sil
il
est mal structur
On ne comprend pas bien llagencement
agencement des modules
On ne mesure pas bien limpact des modifications
Une mauvaise modularit impose un travail trop important

La possibilit dvoluer doit tre prise en compte tout le


temps
C l permet aussi de
Cela
d fixer
f
des
d limites
l
au
dveloppement courant
On fera cette partie dans la prochaine version
On amliorera cette autre partie dans les prochaines
versions

Rcriture / Refactoring

De temps en temps il faut rcrire/repenser


certaines parties du code
A partir de combien de if une fonction doit-elle
tre rcrite ?
Les requtes voluant, il est normal que le code
aussi.
aussi

Refactorisation / Rusinage

La refactorisation (refractoring) est une opration


de maintenance du code informatique. Elle consiste
retravailler le code source non pour ajouter une
fonctionnalit supplmentaire au logiciel mais pour
amliorer

sa lisibilit,
simplifier
p
sa maintenance,,
changer sa gnricit (on parle aussi de remaniement).

Refactorisation

A fur
Au
f ett mesure de
d la
l vie
i d'un
d' logiciel
l i i l on estt amen

implmenter de nouvelles fonctions


corriger des bugs.

Ces modifications ne s'imbriquent pas toujours avec lgance dans


ll'architecture
architecture du logiciel
logiciel.
Le code source devient de plus en plus complexe .De temps en temps
il ffaut le
l simplifier
i lifi

Supprimer les informations redondantes/dupliques


Simplifier
p
l'algorithmique
g
q des mthodes
Limiter la complexit des classes
Limiter le nombre de classes

Refactorisation

R f t i ti simple
Refactorisation
i l

R f t i ti complexe
Refactorisation
l
:R
Refonte
f t d
de la
l conception
ti

Modification de la prsentation (mise en page / indentation /


commentaires)
Modification de l'algorithmique
Relocalisation de procdures
modifier la hirarchie de classes composant l'application.
modification de la structure du code

Activits de refactorisation

Suppression du code mort


Ajout d'assertions (mise en place dassert)
Renommage des classes et des mthodes pour tre plus en
cohrence avec leur rle

Gnie Logiciel

Conception de code
Architecture Logicielle
Design Patterns et anti-patterns

Conception de code

Quelque
Q
l
soit lle mtier que vous comptez ffaire d
dans
linformatique, il est prfrable de savoir coder
EEstimation
ti ti du
d temps
t
de
d dveloppement
d l
t
Comprhension des difficults internes / des clients
Comprhension des avantages et des inconvnients des
produits
Il est difficile de faire des p
produits simples
p quand
q
on ne sait
pas coder : quest-ce qui est complexe ou pas ?
Vous avez besoin de recul
Les informaticiens ont de la considration pour les bons
codeurs

Conception de code

E i un code
Ecrire
d propre quii puisse
i voluer
l
estt difficile
diffi il
Le code sale permet de gagner du temps court terme,
terme
mais coute trs cher ensuite

Bugs
Design complexe
Difficilement modulable
Evolution non pense

Evolution peut entrainer une dgradation de la qualit du


code et la fin une non maitrise du code

Faillites connues

Le mauvais code

Cest du code qui est trs dpendant de son


utilisation
Coder souvent trs rapidement pour rpondre un
besoin spcifique
p
q
Image : Couler dans le bronze
L h t
Lenchevtrement
td
des ffonctions
ti
estt trs
t grand
d
Ds

que lon touche quelque chose, on est amen


toucher
h autre chose
h
Vision globale peu prs impossible

Le mauvais code

Contient des fonctions


C
f
avec effet
ff de bord
Une fonction est dite effet de bord (side-effect) si
elle modifie un tat autre que sa valeur de retour.
modifie

une variable statique ou globale


modifie un ou plusieurs de ses arguments
crit des donnes vers un cran ou un fichier
lit des donnes provenant d'autres fonctions effet de
bord.

Les effets de bord rendent souvent le comportement


des programmes plus difficiles comprendre.

Effet de bord

#include
#i
l d <i
<iostream>
t
>
using namespace std;
int a;;
void f() {
a = 2;
}
int main () {
a = 1;
cout << a << endl;
f();
cout << a << endl;
}

Le mauvais code

Le problme
bl
majeur : la
l productivit
d
dcroit
d
On nose plus toucher au programme
On crit des interfaces de partout
On les comprend
On sait ce quelle font
Ca minimise les interactions avec le mauvais code

Problme : ca a le mme effet que le mauvais code


Tout est complexifier
On ne peut toucher rien

Le mauvais code

S
Syndrome
de la vieille voiture :
On

possde une vieille voiture en bon tat voir trs bon

tat.
On
O la
l nettoie
i souvent, on essaie
i den
d prendre
d soin
i
Un jour, on heurte quelque chose. Le pare-choc est
abim ccest
abim,
est bien ennuyeux
ennuyeux. Ca cote trop cher de le
rparer, alors on laisse comme a.
La voiture est maintenant raye,
raye mais comme le parepare
choc est abim on nessaie plus de camoufler la rayure
La voiture p
prend un coup
p de vieux et le dlabrement
sacclre

Le logiciel
g
volue de la mme faon

Le mauvais code

Pourquoi crit-on du mauvais code ?


Press

par le temps
On en a marre de ce code
On a la flemme de le repenser
p

Rgle pour le code


Plus

tard signifie jamais

Le mauvais code

S
Supprimer
du mauvais nest pas simple
Les

produits existent, ce nest pas si simple de les


rcrire.
i Il ffaut se mettre d
daccord
d sur lla rcriture
i
Que

fait-on ?
Qui le fait ?
La

direction prfre que vous soyez plus productif (au


sens nouveau produit)
Est-ce que cela vaut la peine ?

On rcrit.

Le mauvais code

Rcriture totale :
Pas

seulement un changement de version (maintenance


peut tre problmatique)
En gnral un changement de nom du produit
Windows

7 vs Vista vs XP : pas la mme chose que les


Service Packs
Pas toujours simple : Office, Firefox etc

Le mauvais code

C
Comment
lviter ?
Dire

la vrit : la direction, aux gens du marketing,


aux chefs
h f d
de projets
j
Cest risqu (licenciement) mais cest responsable
Les
L codeurs
d
doivent
d i
assumer un certain
i pouvoir
i
Si

un patient dit un chirurgien quil ne devrait pas se laver


les mains avant doprer
d oprer le chirurgien doit refuser

Avec lexprience,
l exprience, on sait quon
qu on na
n a pas le choix : on
doit viter le mauvais code

Le code propre

Quest-ce que cest ?


B.

Stroustrup (inventeur du C++)

Un

bon code fait une chose et la fait bien


Simple (pour dtecter facilement les bigues)
Agrable, lgant (pour la lisibilit)
Dpendances minimes (pour la maintenance)
Gestion des erreurs totales
Perfs proches de lidal (pour viter loptimiseur fou qui va
l d
le
dgrader)
d )

Le code propre

G. Booch,
G
B h (Object
(Obj t Oriented
O i t d Analysis
A l i and
dD
Design
i with
ith
Applications)
Ne cache jamais les intentions du concepteur
Constitu dabstractions nettes et de lignes de contrle
franches.
Simple et direct.

Dave Thomas, fondateur dOTI, parrain de la stratgie


d Eclipse
dEclipse
Un code propre peut tre lu et amlior par un
dveloppeur autre que lauteur dorigine.
Il dispose de tests unitaires et de tests de recette
Il fournit une API claire et minimale

Gnie Logiciel

Conception de code
Architecture Logicielle
Design Patterns et anti-patterns

Architecture Logicielle

Larchitecture logicielle dcrit dune manire


symbolique et schmatique les diffrents composants
dun ou de plusieurs systmes informatiques,
f
leurs
interrelations et leurs interactions.
Complmentaire de lanalyse fonctionnelle.
Analyse fonctionnelle

Dcrit ce que doit raliser un systme, le quoi

Architecture logicielle

Dcrit comment le systme doit tre conu pour rpondre


aux spcifications,
p
, le comment

Architecture Logicielle

Objectifs
Rduction

des cots
Augmentation de la qualit

Architecture Logicielle

Norme ISO 9126 Qualit


Q alit logicielle

Interoprabilit
Portabilit
Compatibilit :
Validit
Vrifiabilit
Intgrit
Fiabilit
Maintenabilit
Rutilisabilit
Extensibilit
Efficacit
Autonomie
Transparence
Composabilit
Simplicit d'utilisation

Architecture Logicielle

I t
Interoprabilit
bilit

Portabilit

possibilit de fonctionner correctement dans un environnement ancien


(compatibilit descendante) ou plus rcent (compatibilit ascendante).

Validit

possibilit de compiler le code source et/ou d'excuter le logiciel sur des platesformes (machines, systmes d'exploitation, environnements) diffrents.

Compatibilit

capacit du logiciel communiquer et utiliser les ressources d'autres logiciels

conformit des fonctionnalits du logiciel avec celles dcrites dans le cahier des
charges.

Vrifiabilit

simplicit de vrification de la validit.

Architecture Logicielle

I t it
Intgrit

Fiabilit

simplicit de correction et de modification du logiciel

Rutilisabilit

facult grer correctement ses propres erreurs de fonctionnement en


cours d'excution.

Maintenabilit

facult protger ses fonctions et ses donnes d'accs non autoriss.

capacit de concevoir le logiciel avec des composants dj conus


rutilisation simple de ses propres composants pour le dveloppement
d'autres logiciels.

Extensibilit

possibilit d'tendre simplement les fonctionnalits d'un logiciel sans


compromettre son intgrit et sa fiabilit.

Architecture Logicielle

Effi it
Efficacit

Autonomie

capacit pour un logiciel de masquer l'utilisateur (humain ou machine)


les dtails inutiles l'utilisation de ses fonctionnalits.

Composabilit

capacit de contrle de son excution, de ses donnes et de ses


communications.

Transparence

capacit exploiter au mieux les ressources offertes par la ou les


machines o le logiciel sera implant.

capacit pour un logiciel de combiner des informations provenant de


sources diffrentes.
diffrentes

Simplicit d'utilisation

facilit d'apprentissage et d'utilisation du logiciel par les usagers.

Architecture Logicielle

Au moins 5 types
Approche

ascendante : Dveloppement pour et par la


rutilisation
Approche descendante : Architecture en appels et
retours
Architecture en couches
Architecture centre sur les donnes
Architecture oriente objets

Architecture Logicielle

Approche ascendante : Dveloppement pour et


par la rutilisation
La rutilisation de composants logiciels est l'activit
permettant de raliser les conomies les plus
p
p
substantielles
La rutilisation de composants ncessite de
crer

une architecture logicielle permettant une


intgration harmonieuse de ces composants.
composants
crer et maintenir une bibliothque logicielle

Architecture logicielle

Approche
A
h ascendante
d t : Dveloppement
D l
t pour ett par la
l
rutilisation
Avec une bibliothque on renverse les rles
Crer une application revient

crer les composants de bibliothque ncessaires


puis construire l'application l'aide de ces composants.

Une telle bibliothque, facilitant le dveloppement


d'application
d
application est un framework
L'architecte doit

trouver les composants


p
logiciels
g
appropris
pp p
crer les composants manquants, les documenter et les intgrer
la bibliothque.

Architecture Logicielle

Approche descendante : Architecture en appels et


retours
Par

raffinement successifs (N. Wirth) : diviser pour


rgner
Dcouper une fonctionnalit en sous-fonctionnalits qui
sont galement divises en sous sous-fonctionnalits et
ainsi de suite
Trs utilise

Architecture Logicielle

A hit t
Architecture
en couches
h

La conception de logiciels ncessite de recourir des bibliothques.


Une bibliothque trs spcialise utilise des bibliothques moins
spcialises qui elles-mmes utilisent des bibliothques gnriques
Les nouveaux composants utilisent les anciens et ainsi de suite, la
bibliothque tend donc devenir une sorte d'empilement de
composants.
t
Couche = composants possdant une grande cohsion (smantiques
semblables)
A hi
Architecture
en couches
h = un empilement
il
de
d couches.
h
Tous les composants des couches suprieures dpendants
fonctionnellement des composants des couches infrieures.
Trs utilise (trop ?)

Architecture Logicielle

A hit t
Architecture
centre
t sur les
l donnes
d

Un composant central, baptis serveur de donnes (SGBD, Datawarehouse,


Blackboard), est responsable de la gestion des donnes (conservation, ajout,
retrait,
e a , mise--jour,
se jou , sy
synchronisation,
c o sa o , ...))
Les composants priphriques, baptiss clients, utilisent le composant central
Le serveur peut tre

p
passif
(SGBD,
(SG , Datawarehouse)) en ne faisant q
quobir aux ordres
actif (Blackboard) en notifiant un client si un changement qui le concerne se produit.

Sparation claire des donnes (serveurs) des traitements et de la prsentation


(clients)
Avantage : trs grande intgrabilit : des clients peuvent tre ajouts sans
affecter les autres clients.
Dfaut : tous les clients sont dpendants de l'architecture des donnes qui doit
rester stable et qui est donc peu extensible.

Architecture Logicielle

Architecture
Architect
re oriente objets
Les composants du systme (objets) intgrent des donnes et les oprations de
traitement de ces donnes.
La communication et la coordination entre les objets sont ralises par un
mcanisme de passage de messages.
Encapsulation = architecture dtaille de chaque objet

Hritage

Regroupement des donnes et des mthodes concernant les mmes objets


Donnes accessibles par une couche d'interface et non par accs direct
Masquage des sous-fonctions inutiles pour utiliser l'objet
Regroupe les fonctionnalits communes plusieurs classes dans un mme objet
Permet dviter la redondance de code
Facilite lextensibilit

Polymorphisme

utilise des objets diffrents (possdant des comportements distincts) de manire identique
Permet de dfinir des mthodes aux comportements
p
semblables sur des objets
j diffrents

Gnie Logiciel

Conception de code
Architecture Logicielle
Design Patterns et anti-patterns

Design patterns

Motifs
M
tif de
d conceptions
ti
( f i patron
(parfois
t
de
d conception)
ti ) d
dcrivent
i t des
d
solutions standard pour rpondre des problmes d'architecture et
de conception des logiciels. Wikipdia
B : R
But
Rsoudre
d lles problmes
bl
rcurrents

suivant le
l paradigme
d
objet.
b
Dfinition

dcrivent des p
procds de conception
p
gnraux
g
(pas
(p comment rsoudre
un problme particulier ce qui est le rle des algorithmes)
formalisation de bonnes pratiques, ce qui signifie qu'on privilgie les
solutions prouves.
mthode de conception = manire standardise de rsoudre un
problme qui s'est dj pos par le pass.
un outil de capitalisation
p
de l'exprience
p
appliqu
pp q la conception
p
logicielle.

Grande influence sur larchitecture logicielle

Design patterns

Avantages :
Un vocabulaire commun
Capitalisation de lexprience
Un niveau d abstraction plus lev qui permet dlaborer
des constructions logicielles de meilleure qualit
Rduire la complexit
Rduire le temps de dveloppement
Eviter la prsence danti-patrons
Guide/catalogue de solutions
Indpendant du langage

Design patterns

Design Patterns Elements of Reusable ObjectOriented Software , Erich Gamma, Richard Helm,
Ralph Johnson et John Vlissides, 1995.
Les auteurs = Gang
g of Four
Viennent des travaux de Christopher Alexander
dans les annes 1970

Design patterns

La description dun pattern suit un formalisme fixe


Nom
Description

du problme
Description
p
de la solution
Consquences

Design patterns

3 types :

Creational Patterns

Structural Patterns

organisation des classes en sparant llinterface


interface de
limplmentation

Behavioural Patterns

gestion
ti de
d la
l cration
ti dobjets
d bj t de
d faon
f
indirecte
i di t

organisation des objets pour quils collaborent

23 patterns
tt
dans
d
le
l livre
li
Il en existe dautres. On en verra quelques uns

Design Patterns

Avant-propos
Je

vais essayer de ne pas thoriser (faire de la thorie)


autour des Design Patterns mais dtre le plus concret
possible
Je vais essayer de donner des exemples gnriques
mais prcis

Design Patterns

Crational
Abstract

Factory

Builder
Factory
y

Method
Prototype
Singleton

Abstract Factory

P
Permet
t dutiliser
d tili des
d classes
l
sans se soucier
i
de leur implmentation relle
des objets rellement cres

Et en utilisant uniquement des interfaces abstraites

Exemple :
j veux utiliser un bouton g
je
graphique
p q qui
q a une mthode
paint avec Windows et OSX.
Les dtails dimplmentation et les cration dobjets
mimporte
m
importe peu
peu.
Je veux juste faire : button createButton() puis
buttonpaint()

Abstract Factory

struct Button {
virtual void paint() = 0;
};
struct WinButton : public Button {
void paint (){ std::cout << " II'm
m a window button \n
\n";; }
};
struct OSXButton : public Button {
void paint (){ std::cout << " I'm a OSX button \n"; }
};
struct GUIFactory {
virtual Button* createButton () = 0;
};
struct WinGUIFactory
W
: public GUIFactory {
Button* createButton (){ return new WinButton(); }
};
struct OSXGUIFactory : public GUIFactory {
Button* createButton (){ return new OSXButton(); }
Button
};

Abstract Factory

LE CODE MAJEUR
struct Application {
Application(GUIFactory* factory){
y
();
Button * button = factory->createButton();
button->paint(); }
};
/* application : */
int main() {
GUIFactory* factory1 = new WinGUIFactory();
GUIFactory* factory2 = new OSXGUIFactory();
GUIFactory
Application* winApp = new Application (factory1);
Application* osxApp = new Application (factory2);

delete factory1, factory2;


return 0;

Builder

Le but
b de
d ce pattern est dabstraire
d b
l tapes de
les
d
construction dun objet
PPour dcomposer
d
l cration
la
ti dobjets
d bj t complexes
l
Pour tre gnrique : diffrentes implmentations de ces
tapes conduisent la construction de reprsentation
dobjets diffrentes.

Exemple :
Je veux faire des pizzas
Cest les ingrdients mis qui dfinissent une pizza, donc une
classe

Builder

/* Produit
P d it */
class Pizza { // CONTIENT JUSTE LES CHAMPS
private String pate = "";
private String sauce = "";
private
i t String
St i garniture
it
= ""
"";
public void setPate(String pate) { this.pate = pate; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setGarniture(String garniture) {
this.garniture
hi
i
= garniture;
i
}
}
/* Construction Abstraite */
abstract class CtorPizza {//CONTIENT LES METHODES INITIALISANT LES CHAMPS
protected Pizza pizza;
public Pizza getPizza() { return pizza; }
public void creerNouvellePizza() { pizza = new Pizza(); }
public abstract void mettrePate();
public abstract void ajouterSauce();
public abstract void ajouterGarniture();
}

Builder

/* C
Construction
t ti Concrete
C
t */ //EXEMPLE INSTANTIATION
class CtorPizzaHawaii extends CtorPizza {
public void mettrePate() { pizza.setPate("croise"); }
public void ajouterSauce() { pizza.setSauce(
pizza setSauce("douce");
douce ); }
public void ajouterGarniture() {
pizza.setGarniture("jambon+ananas"); }
}
/* Constrcution Concrete */ //EXEMPLE INSTANTIATION
class
l
C Pi Pi
CtorPizzaPiquante
extends
d CtorPizza
C Pi
{
public void mettrePate() { pizza.setPate("feuillete"); }
public void ajouterSauce() { pizza.setSauce("piquante"); }
public void ajouterGarniture() {
pizza.setGarniture("pepperoni+salami"); }
}

Builder

/* Directeur
Di t
*/
// CLASSE QUI GERE LA CREATION DES PIZZAS
class Serveur {
private CtorPizza ctorPizza;
public void setCtorPizza(CtorPizza mp) { ctorPizza = mp; }
public Pizza getPizza() { return ctorPizza.getPizza(); }

public void construirePizza() {


ctorPizza.creerNouvellePizza();
ctorPizza.mettrePate();
();
ctorPizza.ajouterSauce();
ctorPizza.ajouterGarniture();
}

Builder

/* U
Un client
li t commandant
d t une pizza.
i
*/
class Exemple {
public static void main(String[] args) {
Serveur serveur = new Serveur();
CtorPizza ctorPizzaHawaii = new
CtorPizzaHawaii();
();
CtorPizza ctorPizzaPiquante = new
CtorPizzaPiquante();

serveur.setCtorPizza(ctorPizzaHawaii);
serveur.construirePizza();
Pizza pizza = serveur.getPizza();
serveur getPizza();

Factory Method

On cre dynamiquement des objets en fonction de


paramtres passs la fabrique
On

dtermine la classe dont on va crer une instance


en fonction du paramtre pass en paramtre
Un Animal partir de son nom

Chat donne instance de la classe Chat


Chient donne instance de la class Chient

Factory Method

public class FabriqueAnimal {


Animal getAnimal(String typeAnimal){
if (typeAnimal.equals("chat")) {
return new Chat();
} else if (typeAnimal.equals("chien")) {
return new Chien();
}
}
}

Prototype

C ti par clonage
Cration
l
Gestion de temps de cration trs long (reprise et modifs
des anciens lments))
Copie dobjets sans utiliser les constructeurs par recopie

On dfinit une fonction virtuelle clone qui ralise une


copie
A lieu
Au
li dappeler
d
l new ett d
de crer
un objet
bj t from
f
scratch
t h
on clone un objet prcdent
Permet de faire des codes indpendants de la notion
de constructeur par recopie (que lon peut justement
vouloir interdire par ailleurs cause du temps de copie)

Singleton

On veut ne crer quune et une seule instance dune


classe
Besoin

de coordonner des oprations


Efficacit

Principe
Le

premier appel cre une instance


Les
L suivants
i
retourne un pointeur
i
vers cette instance
i

Singleton

ttemplate<typename
l t <t
T> class
l
Singleton
Si l t {
public:
static T& Instance() {
// suppose que T a un constructeur par dfaut
static T theSingleInstance;
return theSingleInstance;
}
};
class OnlyOne : public Singleton<OnlyOne> {
// constructeurs/destructeur de OnlyOne accessibles au Singleton
friend class Singleton<OnlyOne>;
//...dfinir ici le reste de l'interface
l interface
};

Design Patterns

Structural Patterns
Adapter

or Wrapper

Bridge
Composite
p
Decorator
Facade
Flyweight
Proxy
P

(poids-plume)

Adaptor

P
Permet
t de
d convertir
ti une interface
i t f
en une autre
t interface
i t f

Rsout les problmes dincompatibilit dinterfaces


Permet llintgration
intgration de classes non modifiables
Permet de fdrer du code : cas des portages

Exemple

Une API sous Unix (ex: POSIX)


Une API sous Windows (Multithread)
Je veux une API commune afin de ne pas tre gner dans le reste
de mon code avec cette dpendance du systme :

pour Windows
Wi d
jje ffaitit un wrapper autour
t
d
de lAPI Windows
Wi d
pour Unix je fait un wrapper autour de lAPI Unix
Les deux wrappers ont la meme API : la dpendance a disparu

Bridge

BButt d
dcoupler
l li
linterface
t f
d
dune classe
l
ett son
implmentation
Permet de faire varier les deux indpendamment
Permet de cacher la structure de limplmentation

Exemple
La plupart des structures de donnes
Une pile : peut-tre implmente par un tableau ou par une
liste. En externe on ne doit pas le savoir. La structure interne
peut-tre cache,, on doit p
p
pouvoir la changer
g sans impacter
p
lAPI

Parfois appel Handle

Bridge

class
l MyClass
M Cl {
MyClassI* _impl;
int premier(){return _implpremier();}
int dernier(){return
{
_impldernier();}}
}
Class MyClassI {
// ici les donnes membres
int premier(){{ // ici le code de la ffonction
}
int dernier(){
(){ // ici le code de la fonction
}
}

Composite

But essayer de fdrer les traitements de plusieurs


objets qui sont presque semblables
Augmenter

le code commun
Rduire le code rptitif
p

On a limpression
l impression dutiliser
d utiliser de multiples objets de la
mme faon avec des lignes de codes identiques ou
presque

Composite

Exemple
On

a des adultes
On a des enfants
Chacun a des traitements particuliers
On va crer une classe Personne et travailler avec
autant que possible. Seuls certains traitement seront
spcialiss

Lide ici
Lid
i i estt d
de penser COMPOSANT dun
d
GROUPE. On va travailler avec le GROUPE

Decorator

But : attacher dynamiquement de nouvelles


caractristiques un objet runtime, condition
que certains travaux aient t fait compile-time
Alternative au sous-classement q
qui ne peut
p tre fait
qu compile-time
LLextension
extension des fonctionnalits est appele
dcoration et est ralise par une class Dcorator
qui enrobe la classe originale.
originale

Decorator

On procde
O
d comme suit.
it Soit
S it Component
C
t une classe
l
que lon
l
veut pouvoir enrichir runtime

On sous-classe Component
p
par
p une classe Decorator
On ajoute dans Decorator un pointeur vers la classe Component
Le constructeur de Decorator accepte un objet Component ce qui
permet d
daffecter
affecter le pointeur
Dans la classe Decorator toutes les mthodes hrites de
Component sont rediriges vers le pointeurs

LLa fonction
f ti func()
f () de
d componentt devient
d i t func(){ptrfunc();}
f (){ t f () } dans
d
l
le
Decorator

Dans la classe Decorator on surcharge toutes les fonctions de


C
Component
t dont
d t on veutt modifier
difi lle comportement
t
t

On dfinit alors plusieurs Decorator. A runtime on pourra


dterminer lesquels
q
utiliser

Decorator

En C# // Dclarations
abstract class Voiture {
public abstract double Prix { get; }
}
class AstonMartin : Voiture {
public override double Prix { get { return 999.99; } }
}
// Dcorateur
D
t
class Option : Voiture {
protected Voiture _originale;
protected double _tarifOption;
public Option(Voiture originale, double tarif) {
_originale = originale;
_tarifOption = tarif;
}
public override double Prix { get { return _originale.Prix + _tarifOption; } }
}

Decorator

class
l Cli
Climatisation
ti ti : O
Option
ti {
public Climatisation (Voiture originale) : base(originale, 1.0) { }
}
class Parachute : Option {
public
bli PParachute
h t (V
(Voiture
it
originale)
i i l ):b
base(originale,
( i i l 10
10.0)
0) { }
}
class Amphibie : Option {
public Amphibie (Voiture originale) : base(originale, 100.0) { } }
// Implmentation
class Program {
static void Main() {
Voiture astonMartin
astonMartin= new AstonMartin();
astonMartin = new Climatisation(astonMartin);
astonMartin = new Parachute(astonMartin);
astonMartin = new Amphibie(astonMartin);

Console.WriteLine(astonMartin.Prix); // affiche 1110.99

Facade

Une facade est un objet qui fourni une interface


simplifie une grande partie de code comme une
librairie
Une faade

Rend

lutilisation dune librairie plus simple utiliser et


comprendre
co p e d e een introduisant
odu sa des mthodes
odes pour
pou les
es
tches les plus courantes
Rend lutilisation
l utilisation dune
d une libraire indpendante du reste
du code

Facade

Utilisation
Utili
ti d
de parties
ti complexes
l
comme d
des ffonctions
ti
hardware sur le CPU ou la mmoire
//* Complex parts *//
class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) { ... }
}
class
l HardDrive
H dD i {
public byte[] read(long lba, int size) { ... }
}

Facade

/* Facade
F d */
class Computer {
public void startComputer() {
p
();
cpu.freeze();
memory.load(BOOT_ADDRESS,
hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
t ()
}
}
/* Client *//
/
class You {
public static void main(String[] args) {
Computer facade = new Computer();
facade.startComputer();
}
}

Flyweight (poids plume)

But: faire de lobjet mme pour les trs petites choses,


comme des lettres, des icones qui reviennent tout le
temps ... Sans utiliser trop de mmoire.
Un flyweight est un objet qui minimise la mmoire utilis
en partageant autant que possible les donnes avec
des objets similaires
Souvent certaines parties de ltat dun objet peuvent
tre partages et il est commun de les mettre dans des
structures de donnes externes et de les passer, quand
ils sont utiliss, des objets poids plumes temporaires

Flyweight (poids plume)

EExemple
l classique
l i
Reprsentation graphique de caractres
Il est utile d
davoir
avoir pour chaque caractre d
dun
un document un
objet qui contient diverses informations sur le caractres

Sa police
Sa taille
Sa mise en vidence (en gras, italique)

Il est clairement impossible d


davoir
avoir de faon indpendante
cette information pour chaque caractre
Solution

Pour chaque caractre on a un pointeur vers un objet flyweight


qui est partag par tous les caractres ayant les mmes
p p
proprits

Proxy

BButt : contrler
t l laccs
l un objet
bj t
Cest une classe fonctionnant comme une interface vers autre chose :

Cela permet de faire croire quil y a des objets distincts alors que
cela nest pas le cas.

une connexion rseau,,


un large objet en mmoire,
un fichier
une ressource quil
qu il est impossible de dupliquer

On utilisera normalement un objet alors quil est en fait manipul


distance via un rseau

Lutilisateur na pas grer ce que fait le proxy, il peut utiliser le


proxyy comme sil tait lobjet
p
j et cest le p
proxyy qui
q g
gre lindirection

Proxy

Exemple
l typique de
d proxy

le pointeur avec compteur de rfrence

Par exemple on peut coupler des proxys avec le


fl
flyweight
i h pattern
On cre une instance dun gros objet
On
O cre
de
d multiple
lti l iinstance
t
d
du proxy vers cett objet
bj t
Toutes les oprations demandes au proxy sont transfres
vers llobjet
objet original
Le projet gre alors les rfrences vers lobjet et peut le
faire disparaitre lorsquil devient inutile

Design Pattern

B h i l
Behavioral
Chain of responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method (patron de mthode)
Visitor

Chain of responsibility

Pattern qui consiste en une source dobjet


commande et en une chaine dobjets de traitements
Chaque

objet de traitement contient un ensemble de


rgle logiques
qui

dcrivent les types dobjet de commandes quil peut


traiter
qui dcrivent comment passer ceux quils ne peut pas traiter
au suivant de la chane

Un mcanisme
U
i
existe
i aussii pour ajouter
j
d
des
lments en fin de la chane

Command

BButt : grer
linvocation
li
ti en sparant

t le
l code
d initiateur
i iti t
d
de
laction du code de laction elle-mme

Gre la dlgation
g
Permet lexcution diffre sans avoir besoin de tout connaitre
lors de la compilation

Dfini une classe qui est utilise pour reprsenter et


encapsuler
p
toutes les informations requise
q
pour
p
appeler
pp
une
mthode plus tard

Le nom de la mthode
LLobjet
objet qui possde la mthode
Les valeurs des paramtres de la mthode

Command

3 termes sont souvent associs avec ce pattern


Client

: instantie la commande et fourni les informations


pour appeler la mthode plus tard
Invoker : dcide quand la mthode doit tre appele
Receiver : instance de la classe qui contient la mthode,
objet sur lequel la mthode est invoque

Command

/*the Command interface*/


public interface Command {
void execute();
}
/* ma fonction
f ti */
public Func implements Command {
MyObj _obj;
int _para1;
OtherObj _para2;
para2;
// ctor
void execute(){
_objafonction(_para1,_para2);
}
}
/* la classe MyObj */

/* lappelant
l
l
*/
Command c=new Func(obj,p1,p2);
c execute();

Interpreter

Linterpreter spcifie comment valuer des


squences dans un langage
Dfinit

la grammaire du langage
Lutilise p
pour interprter
p
des tats du langage
g g
The interpreter pattern specifies how to evaluate
sentences in a language.
g g The basic idea is to have a
class for each symbol (terminal or nonterminal) in a
specialized computer language. The syntax tree of a
sentence in the language is an instance of the composite
pattern and is used to evaluate (interpret) the sentence

Interpreter

interface Expression {
public int interpret(X variables);
}
class Number implements Expression {
private int number;
public Number(int number) { this.number
this number = number; }
public int interpret(X variables) { return number; }
}
class BinaryOp {
Expression leftOp;
Expression rightOp;
public BinaryOp(Expression left, Expression right) { leftOp = left; rightOp = right; }
}
class Plus extends BinaryOp implements Expression {
public int interpret(X variables) { return leftOp.interpret(variables) + rightOp.interpret(variables); }
}
class Minus extends BinaryOp implements Expression {
interpret(X variables) { return leftOp.interpret(variables) - rightOp.interpret(variables); }
}
class Variable implements Expression {
private String name;
public Variable(String name) { this.name = name; }
public int interpret(X variables) { return variables.get(name); }
}

Interpreter

class Evaluator {
private Expression syntaxTree;
public Evaluator(String expression) {
Stack<Expression> eStack = new Stack<Expression>();
for (String token : expr.split(
expr.split(" "))
)) {
if (token.equals("+")) {
Expression subExpr = new Plus(eStack.pop(),eStack.pop());
eStack.push( subExpr);
}
if (token.equals("-"))
( k
l (" ")) {
Expression subExpr = new Minus(eStack.pop(), eStack.pop());
eStack.push( subExpr );
}
default : eStack.push(
eStack push( new Variable(token) );
}
syntaxTree = eStack.pop();
}
public int evaluate(X
p
( context)) {
return syntaxTree.interpret(context);
}
}

Iterator

Un iterator est un objet qui permet de parcourir les


lments contenus dans un autre objet, le plus
souvent un conteneur (liste, arbre, pile, ensemble )
Ressemble un pointeur disposant de deux
primitives
Accder

llment point en cours


Se
S dplacer
d l
pour pointer
i
vers lle suivant
i

Iterator

Permet de dfinir
f des algorithmes gnriques sur
des structures de donnes sans avoir besoin de faire
d versions
des
i
pour chaque
h
ttype d
de donnes
d
Exemple :
Plus

court chemin dans un graphe


Mme algorithme et mme code si le graphe est
reprsent par
Liste

des voisins
Matrice dadjacence

Iterator

La STL (Standard Template Library) fait grand


usage des iterator
Attention, la modification (suppression /ajout) du
Attention
container pendant le balayage
Certains

iterator impose unn maintien constant d


du
container pendant le balayage

Iterator

public
bli class
l BitSetIterator
BitS tIt t implements
i l
t Iterator<Boolean>
It t <B l > {
private final BitSet bitset;
private int index;
public BitSetIterator(BitSet bitset) { this.bitset = bitset; }
public boolean hasNext() {
return index < bitset.length();
g ();
}
public Boolean next() {
boolean b = bitset.get(index++);
return new Boolean(b);
}
public void remove() { }
}

Mediator

L mediator
Le
di t fournit
f
it une interface
i t f
unifie
ifi pour un ensemble
bl dinterfaces
di t f

Problme de communication entre classes

Beaucoup de classes : traitement de donnes rpartis entre les classes


Problme de comprhension et de lisibilit

Mediator : on cre une classe qui sert faire la communication avec toutes les
classes

Rduire les dpendances entre les classes


Simplifier la communication entre les classes

Lorsquune classe veut interagir avec une autre, elle passe par le mdiator qui transmettra
linformation

Utilis lors de la maintenance ou le refactoring de code


Permet de dfinir des protocoles propres
Rduit le coupling (couplage : change dinformation entre les classes)

Memento

LLe memento fournit


f
la
l manire
d
de renvoyer un objet
b un
tat prcdent (undo via rollback)
Utilis par 2 objets

Principe

Loriginator (le crateur) : objet ayant un tat interne


Le caretaker (le gardien) : celui qui modifie le crateur mais qui
veut pouvoir dfaire les modifications
Le caretaker demande loriginator un objet memento
Le caretaker fait la modification de loriginator

Pour restaurer ltat prcdent on utilise le memento


Notons que le caretaker ne doit pas toucher au memento

Memento

On va donc
O
d
faire
f i une classe
l
M ObjM
MyObjMemento
t quii estt une
classe interne
MyObj aura deux fonctions

saveToMemento qui retourne lobjet MyObjMemento


restoreFromMemento qui prend en paramtre un MyObjMemento
et qui restore lobjet courant

Peut tre difficile mettre en uvre,, surtout si p


plusieurs
modifications
Difficile de retourner directement un tat sans passer par
les sauvegarde
sa egarde intermdiaire

Aspect ayant souvent peu dintrt donc il vaut lieux penser en


terme de pile

Observer

Lobserver est un pattern dans lequel un objet (le


(
sujet)
maintient

la liste de ses dpendants (les observers)


notifie automatiquement les observers aprs chaque
modification
difi ti d
du sujet
j t en appelant
l t une d
de lleur mthode
th d
(ou en passant par des commandes)

Principalement utilis pour mettre en oeuvre la


programmation
ti vnementielle

ti ll
Appel aussi Publisher/Subscriber

Observer

M en uvre
Mise
Systme dabonnement : le subscriber sabonne au publisher
et dfinit la fonction que le publisher devra appeler quand
un vnement se produit
Le p
publisher g
gre la liste des abonns
Quand le publisher est modifi, alors il notifie tous les
subscriber abonn en appelant la fonction associe

Quadruplet (Publisher, Event, Subscriber, Command)

Fonction notify : quand le publisher subit lvnement Event


alors il appelle la commande Command pour le subscriber

State

State est utilis pour reprsent ltat dun objet


S
afin de modifier son comportement sans pour autant
modifier
difi linstance
li t
Deux classes
State

: dfinit labstraction du comportement dun objet


Context : interface entre cet objet et le reste de
lapplication

Gre des automates tats simple

State

Ide principale
La

classe State dfinit des actions qui sont dpendantes


dun contexte (ltat particulier dans lequel on se
trouve)
Les

mthodes prennent un contexte en paramtre


Les mthodes peuvent modifier le contexte
Laction

demande State est donc effectue par le


contexte : indirection
State::Func(Context

Ctx){CtxFunc();}
Eventuellement CtxFunc(); et modification de Ctx

State

iinterface
t f
St
State
t {
public void writeName(StateContext sContext, String name);
}
class StateA implements State {
public void writeName(StateContext sContext, String name) {
System.out.println(name.toLowerCase());
sContext.setState(new StateB());
}
}
class StateB implements
p
State {
private int count=0;
public void writeName(StateContext sContext, String name){
System.out.println(name.toUpperCase());
if(++count>1) { sContext.setState(new StateA()); }
}
}

State

public class StateContext {


private State myState;
public StateContext() { setState(new StateA()); }
// normally only called by classes implementing the State
void setState(State stateName) {
this.myState = stateName;
}
public void writeName(String name) {
this.myState.writeName(this, name);
}
}
public class TestClientState {
public static void main(String[] args) {
StateContext sc = new StateContext();
sc.writeName("Monday");
sc.writeName("Tuesday");
sc.writeName("Wednesday");
sc writeName("Thursday");
sc.writeName(
Thursday );
sc.writeName("Saturday");
sc.writeName("Sunday");
}
}

interface public

Strategy

Strategy permet de changer lalgorithme


S
slectionn runtime
Cela permet chaque objet de dcider quel
algorithme va tre utilis
Exemple :
Minimum

dun container

Pas

tri : on balaie
Tri : on retourne le premier
Je

veux un container gnrique

Strategy

S l ti
Solution

Utilisation de test ou de switch : si mon tableau est tri alors


algo1,
g , sinon algo2
g

Problmes : rptition de test/switchs pour toutes les fonctions


(maximum, 2ndmin etc)

Principe :
On cre une classe Strategy
gy racine interne q
qui a autant de
classes drives que dalgorithmes possibles
La classe externe contient un pointeur sur la classe Strategy
racine interne
On va ensuite dterminer runtime quelle instance sera
effectivement affect au pointeur

Strategy

class
l StrategyInterface
St t
I t f
{
public: virtual void execute() const = 0;
};
class ConcreteStrategyA: public StrategyInterface {
public:
bli virtual
i t l void
id execute()
t () constt {
cout << "ConcreteStrategyA execute method" << endl;
}
};
class
l ConcreteStrategyB:
C
S
B public
bli StrategyInterface
S
I
f
{
public: virtual void execute() const {
cout << "ConcreteStrategyB execute method" << endl;
}
};
class ConcreteStrategyC: public StrategyInterface {
public: virtual void execute() const {
cout << "ConcreteStrategyC
gy execute method" << endl;
}
};

Strategy

class
l Context
C t t{
private: StrategyInterface * _strategy;
public: explicit Context(StrategyInterface* strategy): _strategy(strategy) { }
void set_strategy(StrategyInterface *strategy) { _strategy = strategy; }
void
id execute()
t () constt { _strategyexecute();
t t
t () }
};
int main(int argc, char *argv[]) {
ConcreteStrategyA cStrategyA;
ConcreteStrategyB cStrategyB;
ConcreteStrategyC cStrategyC;
Context context(&cStrategyA);
context.execute();
context.set_strategy(&cStrategyB);
context.execute();
context.set_strategy(&cStrategyC);
context execute();
context.execute();
return 0;
}

Template Method

Dfinit une mthode non abstraite (Template


method) dans une classe abstraite et fait appel
des mthodes abstraites pour fonctionner
Cest la classe p
parent qui
q appelle
pp
les oprations
p
nexistant que dans les sous-classes
Un

peu inhabituel,
inhabituel normalement : les sous-classes
sous classes
concrtes appellent les mthodes de la super-classe.

Nest pas li aux templates du C++ ou Java

Template Method

Parfois
f appel mthode socle parce quelle ancre
solidement un comportement qui sapplique toute
l hirarchie
la
hi
hi d
de classe
l
Fortement reli au pattern NVI (Non-Virtual
I
Interface).
f )
Le pattern NVI reconnait le bnfice dune mthode
non abstraite
b
appelant
l
des
d mthodes
h d abstraites,
b
ce
qui permet de modifier facilement le code interne
( modifie
(on
difi lles pr
ett les
l postt traiements
t i
t avantt les
l
appels au code abstrait).

Template Method

abstract
b t t class
l Game
G
{
protected int playersCount;
abstract void initializeGame();
y( p
player);
y );
abstract void makePlay(int
abstract boolean endOfGame();
abstract void printWinner();

/* A template
t
l t method
th d : */
final void playOneGame(int playersCount) {
this.playersCount = playersCount;
();
initializeGame();
int j = 0;
while (!endOfGame()) {
makePlay(j); j = (j + 1) % playersCount;
} printWinner();
printWinner()
}

Template Method

//Now we can extend this class in order to implement actual games:


games class Monopoly extends
Game {
/* Implementation of necessary concrete methods */
void initializeGame() { // Initialize money }
void makePlay(int player) { // Process one turn of player }
boolean endOfGame() { // Return true of game is over according to Monopoly rules }
void printWinner() { // Display who won }
/* Specific declarations for the Monopoly game. */
// ...
}
class Chess extends Game {
/* Implementation of necessary concrete methods */
void initializeGame() { // Put the pieces on the board }
void makePlay(int player) { // Process a turn for the player }
boolean endOfGame() {
// Return true if in Checkmate or Stalemate has been reached }
void printWinner() { // Display the winning player }
//* Specific
p
declarations for the chess g
game. *//
// ...
}

Visitor

Le pattern visitor (visiteur) est un manire de sparer un


algorithme de la structure de lobjet sur lequel il opre
Permet lajout de nouvelles oprations sur un objet sans
modifier la structure de lobjet (la classe de lobjet)
Limite les modifications intrusives
Conforme au principe ouvert/ferm

open/closed principle "software entities (classes, modules,


p for extension,, but closed for
functions,, etc.)) should be open
modification"

Visitor

Pi i :
Principe

On ajoute chaque classe que lon veut pouvoir tendre une mthode
virtuelle (mthode callback) accept qui prend en paramtre un Visitor :
MyObj accept(Visitor* v)
MyObj::accept(Visitor*

On dfinit un visitor : cest--dire une sous-classe de Visitor


On ajoute dans Visitor une fonction virtuelle visit qui prend en
paramtre lobjet que lon veut tendre : visit(MyObj* obj)
On surcharge cette fonction dans le visiteur que lon a cr

On dfinit le code de la fonction accept de MyObj pour que la fonction


visit soit appele
MyObj::accept(Visitor** v){{
vvisit(this)
}

Visitor

class Visitor {
virtual void visit(MyObjA* obj);
virtual void visit(MyObjB* obj);
}
Cl MyVisitor1
Class
M Vi it 1 : public
bli Visitor
Vi it {
void visit(MyObjA* obj){
// traitement pour obj de type MyObjA
}
void visit(MyObjB
visit(MyObjB* obj){
// traitement pour obj de type MyObjB
}
On a

MyObjA::accept(Visitor*
M
ObjA
t(Vi it * v){vvisit(this);}
){ i it(thi ) }
MyObjB::accept(Visitor* v){vvisit(this);}

On a un ensemble dobjet O, on veut faire les traitements de MyVisitor1 pour tous les objets :
MyVisitor1 v;
for(int i=0;i<n;i++){{
O[i]accept(v);
}

Visitor

On veutt dfi
O
dfinir
i un nouveau comportement
t
t
On cre une classe NvComportement qui hrite de Visitor
Class NvComportement : public Visitor {
void
d visit(MyObjA*
(M Ob A* obj){
b ){
// traitement pour obj de type MyObjA
}
void
id visit(MyObjB*
i it(M ObjB* obj){
bj){
// traitement pour obj de type MyObjB
}
O a un ensemble
On
bl dobjet
d bj O
O, on veut faire
f i les
l traitements
i
d
de
NvComportement pour tous les objets :
NvComportement v;
for(int i=0;i<n;i++){
i=0 i<n i++){
O[i]accept(v);
}

Design Patterns

Autres patterns :
Creational
Lazy

Initialization
Object Pool

Concurrency patterns
Monitor
M i

Lazy Initialization

Pattern permettant de retarder linitialisation dun


objet
Utile si linitialisation est couteuse
Ide : viter de faire du travail systmatique pour
rien
Mi en uvre
Mise
Simplement

en utilisant un flag qui dtermine si lobjet


est jour ou pas

Lazy Initialization

SSe gnralise
li pour les
l mises
i jour
j
On utilise un stamp/timer (horloge) pour dterminer si lobjet est
jour ou pas.

Compteur correspondant au moment o certains vnements se


produisent
Compteur global et local (li lobjet). On compare si galit. Si pas
galit

on met jour
on affecte le compteur local avec le global

Exemple :

De temps en temps on a besoin qu


quune
une liste soit trie

On maintient la liste trie. Peut complexifier le code


On met jour uniquement lorsquon en a besoin

Object Pool

Un object
U
bj t pooll estt un ensemble
bl d
dobjets
bj t non iinitialiss
iti li quii
sont prts tre utiliss
Evite une allocation/Dsallocation permanente dobjets

Au lieu de dallouer les objets on les demande lobject pool


Au lieu de dsallouer des objets on les rends lobject pool

Cestt un ttype particulier


C
ti li de
d pattern
tt
f t
factory
Le pooling dobjets peut offrir une amlioration sensible des
pe o a ces.
performances.
Attention dans un environnement multithread de ne pas
bloquer les objets en attente

Monitor

Approche
A
h pour synchroniser
h i plusieurs
l i
t
tches
h utilisant
tili t d
de faon
f
concurrente plusieurs ressources
Le principe est de regrouper dans une mme classe des mthodes
sur des objets qui doivent tre en exclusion mutuelle (un seul thread
la fois)

La synchronisation un peu partout dans le code est trs difficile grer


On dfinit les donnes qui doivent tre partages par des objets et on
place dans une classe particulire
p
: le Monitor
les p
Le Monitor gre les accs concurrentiels laide doutils de
synchronisation : lock, unlock, smaphore
Toutes les fonctions du monitor sont thread-safe
En gnral, le Monitor est en accs exclusif

Anti patterns
Anti-patterns

Les anti-patterns sont des erreurs courantes de


conception des logiciels.
Leur nom vient de l'absence ou de la mauvaise
utilisation de design
g patterns
p
Les anti-patterns se caractrisent souvent par
une
ne

lenteur
lente r excessive
e cessi e du
d logiciel,
logiciel
des cots de ralisation ou de maintenance levs,
des comportements anormaux
la prsence de bugs

Anti patterns
Anti-patterns

Pas vraiment formalis


Valables dans beaucoup
p de domaines de la gestion
g
de projet
Organisation
Management
Conception
Programmation

Anti patterns
Anti-patterns

Certains sont marrants


Management

Champignon : garder ses employs non


informs et mal-informs (les garder dans le noir et les
nourrir avec du crottin)

Anti patterns
Anti-patterns

Ab t ti inverse
Abstraction
i
:

Usine gaz (Gaz factory):

Interface tellement norme quon arrive plus limplmenter

Bouton magic (Magic pushbutton) :

Systme dune complexit non ncessaire qui fuit de partout

Interface norme (Interface bloat) :

interface qui noffrent pas les fonctions ncessaires lutilisateur alors


quelle pourrait. Lutilisateur doit utiliser des fonctions complexes pour
faire des choses simples

Coder limplmentation directement lintrieur du code de linterface


sans aucune abstraction

Sit ti d
Situation
de comptition
titi (Race
(R
h
hazard)
d) :

Ne pas tenir compte de diffrents ordre possibles de dclenchement des


vnements.

Anti patterns
Anti-patterns

Obj t di
Objet
divin
i (God
(G d object):
bj t)

Fantme (Poltergeists):

Classe qui require que ses mthodes soient appeles dans un ordre
particulier

Problme du yoyo (Yo-yo


(Yo yo problem):

Objets dont le seul rle est de passer de linformation un autre objet.

Couplage squentiel (Sequential coupling):

Concentrer trop de fonctions et de donnes dans une seule classe


(contraire de diviser pour rgner)

Graphe dhritage tellement long et compliqu que le programmeur


doit passer en permanence dune classe lautre pour comprendre la
structure du programme

Action distance (Action at distance):

Emploi immodr de variables globales ou de dpendances entre objets

Anti patterns
Anti-patterns

C
Croyance
aveugle
l (Blind
(Bli d faith):
f ith)

Ancre de bateau ((Boat anchor):)

Utiliser des patterns ou des mthodes sans les comprendre

Codage matriel (Hard code):

Garder un composant inutilis en pensant que cela pourra resservir plus


tard

Programmation religieuse (Cargo cult programming):

Prtendre avoir corriger un bug sans faire un test pour le vrifier

Programmer en faisant
f
des suppositions non explicits sur la machine ou
lOS utilis

Coule de lave (Lava flow):

Mettre en production une partie du code immature forant la lave se


solidifier et en empchant ainsi sa modification

Anti patterns
Anti-patterns

N b magique
Nombre
i
(M i numbers):
(Magic
b )

Programmation spaghetti (Spaghetti code):

Programmer en procdant principalement par couper-coller et modification au


lieu de dvelopper du code gnrique

Marteau dor (Golden hammer):

Faire un code ressemblant un plat de spaghetti : il est impossible de modifier


une petite partie du code sans altrer le fonctionnement de tous les autres
composants

Programmation par couper-coller (Copy and paste programming):

Introduire des nombre inexpliqu dans des algorithmes (en pensant que jamais
une donne naura cette valeur)
Valable aussi avec des chanes

Supposer que la solution favorite rsout tous les problmes

Facteur dimpossibilit (Improbability factor):

Programmer en supposant quil est improbable quune erreur arrive

Anti patterns
Anti-patterns

O i i i prmature
Optimisation

(Premature
(
optimization):)

Programmer par Accident (Programming by accident):

Programmer en optimisant en permanence des bouts de


code au lieu de ssintrer
intrer la structuration,
structuration la maintenance
et le design correcte (et parfois mme lefficacit relle)
Programmer en corrigeant les bugs en se contentant de
modifier le code au hasard jusqu ce que cela marche et
non en rflchissant aux problmes

Rinventer la roue (Reinventing the wheel):

Prfrer mal rinventer des solutions existantes plutt que


dutiliser lexistant

Vous aimerez peut-être aussi