Upload
pipila
View
5
Download
0
Embed Size (px)
DESCRIPTION
C4_GestionProjet
Citation preview
Gestion de projet
Jean-Charles Rgin
Licence Informatique 3me anne - MIAGE
Gnie Logiciel
Jean-Charles Rgin
Licence Informatique 3me anne - MIAGE
Gnie logicielGnie logiciel
Wiki di L i l i i l ( l i ft i i ) Wikipdia : Le gnie logiciel (en anglais : software engineering) : ensemble des mthodes, des techniques et des outils concourant la production d'un logiciel, au-del de la seule activit de programmation 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 conceptualisation du mcanisme interne au logiciel techniques de programmation dveloppement
h d phase de test maintenance.
Gnie logicielGnie logiciel
Pas de mthodes particulires prsentes Bas sur mon expriencep
LogicielLogiciel
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".
LogicielLogiciel
Les bugs surviennent quand le logiciel ne correspond pas au besoin.
Un bug = non-respect de la spcification du systme, cest--dire de la dfinition de ses y ,fonctionnalits, de ce que le systme est cens faire.
Un programme bogu = programme dont la mise Un programme bogu = programme dont la mise en uvre ne vrifie pas la spcification
Ne jouez pas sur les mots
BugsBugs
LogicielLogiciel
Sans bug ? Validation de Windows 2000 600 000 bta testeurs Au lancement de sa commercialisation il restait 63 000 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 moyennelignes de code en moyenne
MySQL : 0,09
BugsBugs
L 13 b 2007 10000 i b hb Le 13 novembre 2007 au soir, 10000 sites web hbergs par Ovh, connaissent des difficults. Ovh a subit un crash majeur sur un des 16 serveurs de stockage Ovh a subit un crash majeur sur un des 16 serveurs de 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 s stme Raid a t rend in oprationnel le systme Raid a t rendu in-oprationnel.
Les sites ont t inaccessibles (erreur 404) environ 20h. Les serveurs SQL n'ont pas t touchs. Les serveurs SQL n ont pas t touchs. Les backups rcent ont saut aussi, les webmestres se sont
retrouvs avec des sites datant davril 2007. Toutes les difi ti f it d i 7 i l tili t t dmodifications faites depuis 7 mois par les utilisateurs sont perdues
Ovh a annonc un "geste commercial" de quelques euros
BugsBugs
29/ 2/200 C i i i Q 3 29/12/2005 Cotisation retraite - Quelque 113 personnes ont eu la surprise de recevoir pour Nol
i d' h d l ti ti t it un avis d'chance de leurs cotisations retraite pour l'anne 2006 de... deux milliards d'euros01/11/2005 G b l b d T k 01/11/2005 Gros bug la bourse de Tokyo : toutes les cotations bloques toute la journe.17/11/2004 d 17/11/2004 aucune couverture rseau durant 15 48h. Chez Bouygues Telecom deux serveurs d' h i t d l t t b d acheminement des appels sont tombs en panne. L'un tait cens tre le secours de l'autre.
Bugs identifisBugs identifis
Con ocation de centenaires l'cole C ti l' l i i d Convocation de centenaires l cole : Convocation l cole primaire de personnes ges de 106 ans. Codage sur deux caractres de lage
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. un trait dunion oubli dans un programme Fortran un trait 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.h d i d l l i d l i changement de signe de la latitude mal pris en compte.
Logiciel partout et trs grosLogiciel partout et trs gros
montre 2 K instr ctions montre : 2 K instructions 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 Direction gnrale de la comptabilit publique (Bercy) : 160 M instructions Cobol Catia : 200 M instructions
BugsBugs
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 Google).p ( g )
Logiciel partout et trs grosLogiciel 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 rgleLogiciel : une rgle
Un logiciel nest jamais utilis comme le programmeur le pense
On ne sait donc pas bien ce qui va intresser les utilisateursMise sur la march rapideModifications aprs comprhensionModifications aprs comprhension
Logiciel : fonctions et besoinLogiciel : fonctions et besoin
U l i i l ti t Un logiciel contient Plein de fonctions pour les dbutants Des fonctions pour les gens moyens 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 ?
LogicielLogiciel
Dtection de bugs automatique ? Problme de la Halte consiste, tant donn un programme informatique
quelconque (au sens machine de Turing), dire s'il q q ( g),finira par s'arrter ou non.
Indcidable : il n'existe pas de programme p p ginformatique 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 : consquencesLa Halte : consquences
P bl d i tt h h lib d Problme du ramasse-miettes : on cherche librer des 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 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 ?Comment minimiser les bugs ?
En appliquant certaines rgles de base En pensant aux problmes par avancep p p En testant
Gnie LogicielGnie Logiciel
Dfinition gnrale et vue densemble
Gnie logicielGnie logiciel
G l i i l t id l i t i t Grer un logiciel cest considrer les points suivants : Comptition (que font les autres) Evolution des techniques (C++ normes architecture SSE Evolution des techniques (C++ normes, architecture SSE,
multicores, GPGPU, CUDA) Tests Le code Gestion/Partage du code Exemples (pas les tests) Exemples (pas les tests) Documentation (qd commence ton ?) Qualit et outils : Qualit et outils : Du dveloppement Du logiciel en lui-mme : facilit dutilisation / accessibilit
Gnie logicielGnie logiciel
G l i i l t id l i t i t Grer un logiciel cest considrer les points suivants : Optimisation du code (qd ? Ou ?) : profiler, quantify Protection/Secrets (Obfuscation) Protection/Secrets (Obfuscation) Multithreading Conception de code (Perenit, Design Pattern)p ( g ) Maintenance/Correction de bugs / Minimiser les
modifications intrusives Portages Portages : compilateurs/ machines/systmes/langages (wrapper) indpendance du code vis--vis du matriel, de lOS
Evolution : ToDo list/ refactoring Installer
Gnie LogicielGnie Logiciel
Les tests
TestsTests
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.
TestsTests
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'implmentation, c'est Le test vrifie les dtails d implmentation, c est dire le comportement interne du logiciel..
Tests conformitTests conformit
Tests de conformit Le test vrifie la conformit du logiciel par rapport ses spcifications et sa conception.
Tests de non-conformit : on vrifie que les cas non qprvus ne perturbent pas le systmes Tests de robustesse : on introduit de nouvelles Tests de robustesse : on introduit de nouvelles
contraintes Tests de vulnrabilit : on cherche attaquer le Tests de vulnrabilit : on cherche attaquer le
systmes, le mettre en dfaut
Tests unitaires/couverturesTests unitaires/couvertures
T t it i Tests unitairesChaque module du logiciel est teste sparment, par rapport ses spcifications, aux erreurs de logique.
Tests cas limitesQue se passe til si on atteint une borne ? Si un fichier nest pas prsent ? On essaie les cas limitespas prsent ? On essaie les cas limites
Tests derreursComment 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 fonction est appele par au moins un test chaque code est travers au moins une fois difficile faire : utilitaires existent (pure coverage)
Tests de prversionsTests 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 Tests alpha Le logiciel n'est pas encore entirement fonctionnel, les testeurs alpha vrifient la pr-version. les testeurs alpha vrifient la pr version.
Tests dintgrationTests d intgration
T d'i i Tests d'intgrationLes modules valids par les test unitaires sont rassembls Le test d'intgration vrifie que l'intgration rassembls. Le test d intgration vrifie que l intgration des modules n'a pas altr leur comportement.
Tests d'intgration systme Tests d intgration systmeL'application doit fonctionner dans son environnement de production, avec les autres applications prsentes p , pp psur la plateforme et avec le systme d'exploitation.
Tests de recetteLes utilisateurs finaux vrifient sur site que le systme rpond de manire parfaitement correcte.
Tests Tests
Tests fonctionnelsL'ensemble des fonctionnalits prvues est test : fiabilit, performance, scurit, affichages, etc
Tests de non rgressiongAprs chaque modification, correction ou adaptation du logiciel, il faut vrifier que le adaptation du logiciel, il faut vrifier que le comportement des fonctionnalits n'a pas t perturb, mme lorsqu'elle ne sont pas concernes perturb, mme lorsqu elle ne sont pas concernes directement par la modification.
TestsTests
Tests de performanceOn 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
( d b l ) comportement (quadratique, cubique, lags ) Augmentation du nombre dutilisateurs pour un serveur
TestsTests
Tests de stressOn combine tests de performance et monte en charge. On peut simuler des dfaillances. Longs en gnral
TestsTests
Quand les faire ? Ds le dbut Tout le temps, mais les dveloppeurs naiment pas
crire des tests
Qui les crits ? Les dveloppeurs Les dveloppeursQuelquun dautre cest bien aussi (autre point de vue =
bugs dtects plus vite; jai pas pens a ! ) bugs dtects plus vite; j ai pas pens a ! )
Gnie LogicielGnie Logiciel
Le code source
Le code sourceLe code source
Il doit tre lisible par les autres (clair). Vous ntes pas seul. Noms des fonctions Noms des variables
R t l d d ( d t l h Respecter les normes de codage (_ devant les champs, accolades obligatoires ). Difficile mais important.
tre clairement structur : tre comprhensible assez tre clairement structur : tre comprhensible assez facilement
tre concis tre concis Ne pas faire de suppositions sur dautre partie de
votre code
Le code sourceLe code source
Le non respect des normes des entreprises est le premier reproche fait aux stagiaires par les
t ientreprises 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 sourceLe 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-cpp.org/ http://www.misra cpp.org/
Gnie LogicielGnie Logiciel
Gestion / Partage du code
Gestion / Partage du codeGestion / 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 jsute tester Parfois on veut revenir une version prcdente
(par exemple comprendre une rgression ou lapparition dun bug)
Gestion / Partage du codeGestion / 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 S di S S f (Mi f ) Visual Studio Source Safe (Microsoft)
Gestion / Partage du codeGestion / Partage du code
M l d d l Mutualisation du dveloppement: Un groupe de dveloppeurs utilise le gestionnaire pour
stocker toute volution du code source stocker toute volution du code source. Le gestionnaire gre les mises jour des sources pour chaque dveloppeur,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
d l i di l i l l crasement de la version distante par la version locale. Deux dveloppeurs sur une mme source les changements du premier soumettre son travail ne seront pas 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 codeGestion / Partage du code
M t li ti d d l t CVS/S b i Mutualisation du dveloppement: avec CVS/Subversion Fonctionne par un systme de commit/update Une copie globale + chacun dispose dune copie en locale Une copie globale chacun dispose d une copie en locale Chacun travaille avec sa copie locale On veut committer les modifications = modifier le fichier
global partir du localglobal 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 versionsentre les versions
Modification de la version globale par la version locale
Gestion / Partage du codeGestion / 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 LogicielGnie Logiciel
Les exemples
Les exemplesLes 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 documentationOn doit pouvoir sen inspirer : codage par mimtisme
est assez frquent On met un peu de documentations dans les
exemples.
Gnie LogicielGnie Logiciel
La documentation
La documentationLa documentation
Ell t t i t t Elle est trs importante Elle peut avoir valeur lgale Avantages :g
Elle amne des clarifications Elle donne une vision et une cohrence densemble Elle fait rflchir 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 peut limiter les volutions Elle est pnible crire Elle met en vidence certains dfauts (mauvaise structure )
La documentationLa documentation
ff Il y a une grande diffrence entre la documentation interne (du code, de son organisation,
d f i d l i h d id )des son fonctionnement, des algorithmes, des ides ) la documentation externe (ce que le client voit, les
autres quipes )autres quipes )
Il f t d tt diff D t = Il faut garder cette diffrence. Documenter = rigidifierL t t t d t (f it Lopen source est trs rarement document (fait exprs)
La documentationLa 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 !!!) Doxygen (Dmo !!!)
La documentationLa documentation
3 t d d t ti t 3 types de documentation courants Getting started : petit manuel expliquant comment utiliser le logiciel partir de 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 logiciel avec des exemples trs simple Manuel de lutilisateur : manuel principalement bas sur des exemples et des concepts.
li f i l h l l i i l explique comment faire quelque chose avec le logiciel Manuel de rfrence : manuel de type dictionnaire yp explique de faon trs prcise le fonctionnement de chaque
fonctionnalit
La documentationLa 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 explique comment utiliser de nouvelles fonctions la place
de prcdentes Release notes : contient lensemble des modifications depuis la dernire
versionf i l f i li b l l l rfrencie les fonctionnalits obsoltes et les remplaante
prsente les nouveauts
La documentationLa documentation
Indpendance ou pas du code source ? a se discute
Difficult majeure : faire voluer le produit et la documentation en mme tempsdocumentation en mme temps
Une documentation obsolte est un vrai problme
Ce qui est valable pour la documentation est aussi valable pour les commentaires
Gnie LogicielGnie Logiciel
La qualit et les outils
Qualit logicielleQualit logicielle
Q l l ll Qualit logicielle Qualit du dveloppement et les outils
Q li d l i i l Qualit du logiciel
Qualit Aptitude lemploi + conformit aux spcifications
Automatisation des tests Procdures de contrle Dfinition de critres et de mesures
Qualit du dveloppementQualit du dveloppement
O til d d l t Outils de dveloppement Visual Studio Eclipse
Outils de tests unitaires cppUnit Visual Studio : http://msdn microsoft com/fr fr/library/bb385902 aspx Visual Studio : http://msdn.microsoft.com/fr-fr/library/bb385902.aspx Visual Studio : http://msdn.microsoft.com/en-us/library/d3bbz7tz.aspx
(DEMO) O til d i i d bl (i t ki t ) Outils de suivi des problmes (issue tracking system)
Mantis Bugzilla
Outils de couverture de code Couverture de code : pure coverage
Qualit du dveloppementQualit 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 dsallocationsOutils : Valgrind (Linux) Purify, BoundsChecker, Outils : Valgrind (Linux) Purify, BoundsChecker,
Insure++ (Windows)
Fuites mmoires : Memory leaksFuites mmoires : Memory leaks
Wh b tt i d When a button is pressed: 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 ltagecourant.
Qualit du dveloppementQualit du dveloppement
O til d fili dt ti d ti iti d d Outils de profiling : dtection des parties critiques du code, en terme de performance quantifyq y gprof Visual Studio Profiler http://msdn.microsoft.com/fr-
fr/magazine/cc337887 aspx (DEMO)fr/magazine/cc337887.aspx (DEMO) AMD CodeAnalyst Intel Vtune
Optimisations guides par le profil O f it l i On fait plusieurs run Le compilateur sadapte (ex: dfinit les tests par dfauts
diffremment)
ProfilageProfilage
P S li Par Sampling On fait tourner le code et toutes les ms (ou moins) on regarde
dans quelle fonction on est : on tablit des statistiques dutilisationdans quelle fonction on est : on tablit des statistiques d utilisation Avantage : le code nest pas modifi, et cela donne une ide
relle Inconvnient : pas toujours trs prcis
Par InstrumentationO f f On modifie le code afin de pouvoir mesuer prcisment le temps pass dans chaque fonction
Avantage : rsultats assez fins Avantage : rsultats assez fins Inconvnient : modifie le code donc ne mesure pas exactement la
ralit
Qualit du dveloppementQualit 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 Visual Studio Dotfuscator pour .NET
http://msdn.microsoft.com/en-us/library/ms227240.aspx/ y/ p
Qualit du logicielQualit du logiciel
F ilit d tili ti Facilit dutilisation Accessibilit
On doit pouvoir faire simplement des choses simples On peut accepter de la complexit pour des choses 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 LogicielGnie Logiciel
Optimisation du code
Optimisation du codeOptimisation du code
Ne pas optimiser nimporte quelle partie du code Chercher le code critiqueq Ne pas chercher optimiser btementOn fait une boucle complexe au lieu de 2 simpleOn fait une boucle complexe au lieu de 2 simple Le compilateur sait faire plein doptimisations
O li i d d d fi hi (l On lit moins de donnes dans un fichier (laccs est couteux)
Optimisation du codeOptimisation du code
O Optimisation Du modle / de larchitecture (on considre le problme
sous un autre angle)sous un autre angle) De lalgorithme / de mthode Du code source Du code source
Exemple : rsolution de problme difficiles Gains Exemple : rsolution de problme difficiles. Gains potentiels Changement de modle : 1 000 000g Changement dalgorithme de recherche : 1 000 Optimisation du code source : 10
Optimisation du codeOptimisation du code
ff G Exemple : rsolution de problme difficiles. Gains potentiels Changement de modle : 1 000 000 Changement dalgorithme de recherche : 1 000Optimisation 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 codeOptimisation du code
O Optimisation Du modle / de larchitecture (on considre le
bl l )problme sous un autre angle) Trs difficile Peut ne conduire aucun rsultat Peut ne conduire aucun rsultat
De lalgorithme / de mthode Assez difficile Assez difficile Peut ne pas bien marcher, amlioration pas certaine
Du code source Beaucoup plus facile Rsultats peu prs certains
Amlioration de lalgorithmeAmlioration de l 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 Trouver des bonnes pages web de chercheurs ou de
gens particulirement intresssAtt ti lt t i t th i Attention aux rsultats uniquement thoriques Tri : au moins n log(n) en thorieOk, mais uniquement si comparaison Tri de nombres : presque linaire ! Voir Cormen
Amlioration du codeAmlioration du code
Documentations Intel :
// / / / /http://www.intel.com/Assets/PDF/manual/248966.pdf AMD :
h // d /http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25112 PDF12.PDF
C++ : http://www.agner.org/optimize/optimizing_cpp.pdfhttp://www.open-p // pstd.org/jtc1/sc22/WG21/docs/TR18015.pdf*http://en.wikibooks.org/wiki/Optimizing_C%2B%2B
Gnie LogicielGnie Logiciel
Protection / Secrets (Obfuscation/obfucateur)(Obfuscation/obfucateur)
Protection du code / SecretsProtection du code / Secrets
Il ne sagit pas ici de brevet logiciel Comment protger certaines parties du codeObfuscation
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 / SecretsProtection du code / Secrets
Class MaSuperStructureDeDonnee { Class MaSuperStructureDeDonnee {int* superdataastucieuxvoid superastucepourajouter(int i){}
public:ajouter(int i){superastucepourajouter(i);}};
.h visible .h visibleClass VisibleSdd {MaSuperStructureDeDonnee* super; //ptrpublic:ajouter(int i);
}} .cpp invisible
VisibleSdd::ajouter(int i){super->ajouter(i);}
Inconvnient : on perd de la performance Avantage : introduit de la souplesse
Gnie LogicielGnie Logiciel
Multithreading
MultithreadingMultithreading
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
S fi d h l d! Se mfier des smaphores, mutex etc : cest lourd! Tendance actuelle : spin lock et attente active
Mmoire partageMmoire partage Systmes multicores vont continuer
MultithreadingMultithreading
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 MultithreadingSuper Multithreading
Ordinateur scalaire = GPU Super multithreading = massivement parallle p g pOpenCL CUDA CUDAGPGPU : general purpose GPU
Gnie LogicielGnie Logiciel
Portages
PortagesPortages
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
PartagesPartages
C d tili bl l i il t / hi /OS Code utilisables avec plusieurs compilateurs/machines/OS On prvoit ds le dbut une utilisation multi-systmes .h (hardware.h) dfinissant les constantes et spcificits de chaque .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 compilateurs/machines/OS Utilisation dun sous-ensemble du langage Gestion mmoire contrle Gestion des threads contrle (Windows vs POSIX) 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
PortagesPortages
W tili ti d d it d l Wrapper : utilisation dun code crit dans un langage partir dun autre langage Fine couche de code qui permet de traduire une interface 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 qui permet du code Java s'excutant q p
l'intrieur de la JVM d'appeler et d'tre appel par des applications natives crites dans dautres langages
Gnie LogicielGnie Logiciel
Installer
InstallerInstaller
Programme permettant linstallation propre de programme. Gre aussi la dsinstallation InstallShieldWindows installer Nullsoft scriptable install system (NSIS)
http://nsis.sourceforge.net/Main_Pagep // g / _ g
InstallerInstaller
L t t d li t ll ti d l i i l t i l Le test de linstallation dun logiciel nest pas simple 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 : Avantage : on repart dun systme propre et vierge chaque fois
Inconvnients La virtualisation peut contenir des bugs La virtualisation peut contenir des bugs Ne correspond aucune installation relle
Gnie LogicielGnie Logiciel
Maintenance
MaintenanceMaintenance
M i t Maintenance corrective : corriger les bugs dfauts de fonctionnement non-conformits d'un logiciel,
volutive : faire voluer l'application en l'enrichissant de fonctions ou de modules supplmentaires en l enrichissant de fonctions ou de modules supplmentaires en remplaant une fonction existante par une autre en proposant une approche diffrente. d i adaptative : 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).
MaintenanceMaintenance
C ti d b Correction de bugs Bugs de code simple Bugs dalgorithme : lalgorithme est faux Bugs d algorithme : 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 du code pour riendonc il faut viter d crire du code pour rien Rgression trs dsagrable. Introduction dans nouvelles
versions de problmes qui nexistaient pas avant : bugs performance temps/mmoire
Gnie LogicielGnie Logiciel
Evolution / Rcriture
EvolutionEvolution
Il est ncessaire de pouvoir faire voluer un logiciel Un logiciel nest jamais utilis comme son concepteur g j p
lavait pens ou de la faon dont le concepteur lavait imagin.g
Un logiciel volue Parce q e le concepte r a des no elles ides Parce que le concepteur a des nouvelles ides Parce que les utilisateurs ont de nouvelles requtes Parce la comptition est l.
EvolutionEvolution
Il t f il d f i l l i i l t t il Il nest pas facile de faire voluer un logiciel, surtout sil est mal structur On ne comprend pas bien lagencement des modules On ne comprend pas bien l 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 tempsC l d f d l Cela permet aussi de fixer des limites au dveloppement courant On fera cette partie dans la prochaine version On fera cette partie dans la prochaine version On amliorera cette autre partie dans les prochaines
versions
Rcriture / RefactoringRcriture / 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 aussiaussi.
Refactorisation / RusinageRefactorisation / 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 sa maintenance, p , changer sa gnricit (on parle aussi de remaniement).
RefactorisationRefactorisation
A f t d l i d' l i i l t Au fur et mesure de la vie d'un logiciel on est amen implmenter de nouvelles fonctions corriger des bugs.
Ces modifications ne s'imbriquent pas toujours avec lgance dans l'architecture du logiciell architecture du logiciel.
Le code source devient de plus en plus complexe .De temps en temps il f l i lifiil faut le simplifier Supprimer les informations redondantes/dupliques Simplifier l'algorithmique des mthodes p g q Limiter la complexit des classes Limiter le nombre de classes
RefactorisationRefactorisation
R f t i ti i l Refactorisation simple Modification de la prsentation (mise en page / indentation /
commentaires) Modification de l'algorithmique Relocalisation de procdures R f t i ti l R f t d l ti Refactorisation complexe : Refonte de la conception 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 LogicielGnie Logiciel
Conception de code Architecture Logicielle Architecture Logicielle Design Patterns et anti-patterns
Conception de codeConception de code
Q l l f d Quelque soit le mtier que vous comptez faire dans linformatique, il est prfrable de savoir coder E ti ti d t d d l t Estimation du temps de dveloppement Comprhension des difficults internes / des clients Comprhension des avantages et des inconvnients des Comprhension des avantages et des inconvnients des
produits Il est difficile de faire des produits simples quand on ne sait p p q
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 codeConception de code
E i d i i l t diffi il Ecrire un code propre qui puisse voluer est difficile
Le code sale permet de gagner du temps court terme Le code sale permet de gagner du temps court terme, mais coute trs cher ensuite Bugs Design complexe Difficilement modulable Evolution non pense 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 codeLe mauvais code
Cest du code qui est trs dpendant de son utilisation
Coder souvent trs rapidement pour rpondre un besoin spcifiquep q
Image : Couler dans le bronze L h t t d f ti t t d Lenchevtrement des fonctions est trs grand Ds que lon touche quelque chose, on est amen
h htoucher autre chose Vision globale peu prs impossible
Le mauvais codeLe mauvais code
C f ff Contient des fonctions avec effet 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 bordEffet de bord
#i l d #include using namespace std; int a; ;void f() {
a = 2; } } int main () {
a = 1; cout
Le mauvais codeLe mauvais code
bl l d d Le problme majeur : la productivit dcroit 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 codeLe mauvais code
S Syndrome de la vieille voiture :On possde une vieille voiture en bon tat voir trs bon
O l i i d d itat. On la nettoie souvent, on essaie den prendre soin Un jour, on heurte quelque chose. Le pare-choc est
abim cest bien ennuyeux Ca cote trop cher de le abim, c est bien ennuyeux. Ca cote trop cher de le rparer, alors on laisse comme a.
La voiture est maintenant raye mais comme le pare- La voiture est maintenant raye, mais comme le parechoc est abim on nessaie plus de camoufler la rayure
La voiture prend un coup de vieux et le dlabrement p psacclre
Le logiciel volue de la mme faong
Le mauvais codeLe mauvais code
Pourquoi crit-on du mauvais code ? Press par le tempsOn en a marre de ce codeOn a la flemme de le repenserp
Rgle pour le code Rgle pour le code Plus tard signifie jamais
Le mauvais codeLe mauvais code
S Supprimer du mauvais nest pas simple Les produits existent, ce nest pas si simple de les
i Il f d d l ircrire. Il faut se mettre daccord sur la rcritureQue fait-on ?Qui le fait ?Qui le fait ?
La direction prfre que vous soyez plus productif (au sens nouveau produit)sens nouveau produit)
Est-ce que cela vaut la peine ?
On rcrit.
Le mauvais codeLe mauvais code
Rcriture totale : Pas seulement un changement de version (maintenance
peut tre problmatique) En gnral un changement de nom du produitWindows 7 vs Vista vs XP : pas la mme chose que les
Service Packs Pas toujours simple : Office, Firefox etc
Le mauvais codeLe mauvais code
C ? Comment lviter ? Dire la vrit : la direction, aux gens du marketing,
h f d jaux chefs de projets Cest risqu (licenciement) mais cest responsable
L d d i i i Les codeurs doivent assumer un certain pouvoir Si un patient dit un chirurgien quil ne devrait pas se laver
les mains avant doprer le chirurgien doit refuser les mains avant d oprer le chirurgien doit refuser
Avec lexprience, on sait quon na pas le choix : on Avec l exprience, on sait qu on n a pas le choix : on doit viter le mauvais code
Le code propreLe 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 d ) le dgrader)
Le code propreLe code propre
G B h (Obj t O i t d A l i d D i ith G. Booch, (Object Oriented Analysis and Design with Applications) Ne cache jamais les intentions du concepteur 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 dEclipsed Eclipse 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 LogicielGnie Logiciel
Conception de code Architecture Logicielle Architecture Logicielle Design Patterns et anti-patterns
Architecture LogicielleArchitecture Logicielle
Larchitecture logicielle dcrit dune manire symbolique et schmatique les diffrents composants
fdun ou de plusieurs systmes informatiques, leurs interrelations et leurs interactions.
Complmentaire de lanalyse fonctionnelle. Analyse fonctionnelle Dcrit ce que doit raliser un systme, le quoi
Architecture logicielle Architecture logicielle Dcrit comment le systme doit tre conu pour rpondre
aux spcifications, le comment p ,
Architecture LogicielleArchitecture Logicielle
Objectifs Rduction des cots Augmentation de la qualit
Architecture LogicielleArchitecture Logicielle
Norme ISO 9126 Q alit logicielle Norme ISO 9126 Qualit logicielle Interoprabilit Portabilit Compatibilit : Compatibilit : Validit Vrifiabilit Intgrit Intgrit Fiabilit Maintenabilit Rutilisabilit Extensibilit Efficacit Autonomie Transparence Composabilit Simplicit d'utilisation
Architecture LogicielleArchitecture Logicielle
I t bilit Interoprabilit capacit du logiciel communiquer et utiliser les ressources d'autres logiciels
Portabilit possibilit de compiler le code source et/ou d'excuter le logiciel sur des plates-
formes (machines, systmes d'exploitation, environnements) diffrents. Compatibilit
possibilit de fonctionner correctement dans un environnement ancien (compatibilit descendante) ou plus rcent (compatibilit ascendante).
Validit conformit des fonctionnalits du logiciel avec celles dcrites dans le cahier des
charges. Vrifiabilit
simplicit de vrification de la validit.
Architecture LogicielleArchitecture Logicielle
I t it Intgrit facult protger ses fonctions et ses donnes d'accs non autoriss.
Fiabilit facult grer correctement ses propres erreurs de fonctionnement en
cours d'excution. Maintenabilit Maintenabilit
simplicit de correction et de modification du logiciel Rutilisabilit
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 LogicielleArchitecture Logicielle
Effi it Efficacit capacit exploiter au mieux les ressources offertes par la ou les
machines o le logiciel sera implant. Autonomie
capacit de contrle de son excution, de ses donnes et de ses communications.
Transparence capacit pour un logiciel de masquer l'utilisateur (humain ou machine)
les dtails inutiles l'utilisation de ses fonctionnalits. Composabilit
capacit pour un logiciel de combiner des informations provenant de sources diffrentessources diffrentes.
Simplicit d'utilisation facilit d'apprentissage et d'utilisation du logiciel par les usagers.
Architecture LogicielleArchitecture 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 oriente objets
Architecture LogicielleArchitecture 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 psubstantielles
La rutilisation de composants ncessite de La rutilisation de composants ncessite de crer une architecture logicielle permettant une
intgration harmonieuse de ces composants intgration harmonieuse de ces composants. crer et maintenir une bibliothque logicielle
Architecture logicielleArchitecture logicielle
A h d t D l t t l Approche ascendante : Dveloppement pour et par la rutilisation
Avec une bibliothque on renverse les rles 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 est un frameworkd application est un framework
L'architecte doit trouver les composants logiciels appropris p g pp p crer les composants manquants, les documenter et les intgrer
la bibliothque.
Architecture LogicielleArchitecture 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 LogicielleArchitecture Logicielle
A hit t h Architecture en couches 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 t composants.
Couche = composants possdant une grande cohsion (smantiques semblables)A hi h il d h Architecture en couches = un empilement de couches.
Tous les composants des couches suprieures dpendants fonctionnellement des composants des couches infrieures.
Trs utilise (trop ?)
Architecture LogicielleArchitecture Logicielle
A hit t t l d Architecture centre sur les donnes Un composant central, baptis serveur de donnes (SGBD, Datawarehouse,
Blackboard), est responsable de la gestion des donnes (conservation, ajout, retrait, mise--jour, synchronisation, ...) e a , se jou , sy c o sa o , )
Les composants priphriques, baptiss clients, utilisent le composant central Le serveur peut tre
passif (SGBD, Datawarehouse) en ne faisant quobir aux ordresp (SG , ) q 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 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 LogicielleArchitecture Logicielle
Architect re oriente objets Architecture 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 La communication et la coordination entre les objets sont ralises par un
mcanisme de passage de messages. Encapsulation = architecture dtaille de chaque objet
Regroupement des donnes et des mthodes concernant les mmes objets 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
Hritage Hritage 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 semblables sur des objets diffrentsp j
Gnie LogicielGnie Logiciel
Conception de code Architecture Logicielle Architecture Logicielle Design Patterns et anti-patterns
Design patternsDesign patterns
M tif d ti ( f i t d ti ) d i t d Motifs de conceptions (parfois patron de conception) dcrivent des solutions standard pour rpondre des problmes d'architecture et de conception des logiciels. WikipdiaB R d l bl l d b But : Rsoudre les problmes rcurrents suivant le paradigme objet.
Dfinition dcrivent des procds de conception gnraux (pas comment rsoudre p p g (p
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 de l'exprience appliqu la conception p p pp q p
logicielle. Grande influence sur larchitecture logicielle
Design patternsDesign 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 patternsDesign patterns
Design Patterns Elements of Reusable Object-Oriented Software , Erich Gamma, Richard Helm, Ralph Johnson et John Vlissides, 1995.
Les auteurs = Gang of Fourg Viennent des travaux de Christopher Alexander
dans les annes 1970dans les annes 1970
Design patternsDesign patterns
La description dun pattern suit un formalisme fixe Nom Description du problme Description de la solutionp Consquences
Design patternsDesign patterns
3 3 types : Creational Patterns
ti d l ti d bj t d f i di t gestion de la cration dobjets de faon indirecte Structural Patterns organisation des classes en sparant linterface de organisation des classes en sparant l interface de
limplmentation Behavioural Patterns organisation des objets pour quils collaborent
23 tt d l li 23 patterns dans le livre Il en existe dautres. On en verra quelques uns
Design PatternsDesign 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 PatternsDesign Patterns
Crational Abstract Factory Builder Factory Methody Prototype Singleton Singleton
Abstract FactoryAbstract Factory
P t d tili d l i Permet dutiliser des classes sans se soucier de leur implmentation relle des objets rellement cres des objets rellement cres
Et en utilisant uniquement des interfaces abstraites
Exemple : je veux utiliser un bouton graphique qui a une mthode j g p q q
paint avec Windows et OSX. Les dtails dimplmentation et les cration dobjets
mimporte peu m importe peu. Je veux juste faire : buttoncreateButton() puis
buttonpaint()
Abstract FactoryAbstract Factory
struct Button { struct Button { virtual void paint() = 0;
}; struct WinButton : public Button {
void paint (){ std::cout
Abstract FactoryAbstract Factory
LE CODE MAJEUR LE CODE MAJEUR struct Application {
Application(GUIFactory* factory){ Button * button = factory->createButton(); y ();button->paint(); }
};
/* application : */ int main() {
GUIFactory* factory1 = new WinGUIFactory(); GUIFactory* factory2 = new OSXGUIFactory(); GUIFactory factory2 = new OSXGUIFactory(); Application* winApp = new Application (factory1); Application* osxApp = new Application (factory2);
delete factory1, factory2; return 0;
}
BuilderBuilder
b d d b l d Le but de ce pattern est dabstraire les tapes de construction dun objet P d l ti d bj t l Pour dcomposer la cration dobjets complexes Pour tre gnrique : diffrentes implmentations de ces
tapes conduisent la construction de reprsentationtapes conduisent la construction de reprsentationdobjets diffrentes.
Exemple : Je veux faire des pizzas Cest les ingrdients mis qui dfinissent une pizza, donc une
classe
BuilderBuilder
/* P d it */ /* Produit */ class Pizza { // CONTIENT JUSTE LES CHAMPS
private String pate = ""; private String sauce = "";
i t St i it "" private String garniture = ""; public void setPate(String pate) { this.pate = pate; } public void setSauce(String sauce) { this.sauce = sauce; } public void setGarniture(String garniture) {
hi i i } this.garniture = garniture; } }
/* Construction Abstraite */ abstract class CtorPizza {//CONTIENT LES METHODES INITIALISANT LES CHAMPSabstract 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 mettrePate(); public abstract void ajouterSauce(); public abstract void ajouterGarniture();
}
BuilderBuilder
/* C t ti C t */ //EXEMPLE INSTANTIATION /* Construction Concrete */ //EXEMPLE INSTANTIATIONclass CtorPizzaHawaii extends CtorPizza {
public void mettrePate() { pizza.setPate("croise"); } public void ajouterSauce() { pizza setSauce("douce"); } public void ajouterSauce() { pizza.setSauce( douce ); } public void ajouterGarniture() { pizza.setGarniture("jambon+ananas"); }
} }
/* Constrcution Concrete */ //EXEMPLE INSTANTIATION l C Pi Pi d C Pi { class CtorPizzaPiquante extends CtorPizza {
public void mettrePate() { pizza.setPate("feuillete"); } public void ajouterSauce() { pizza.setSauce("piquante"); } public void ajouterGarniture() { public void ajouterGarniture() {
pizza.setGarniture("pepperoni+salami"); } }
BuilderBuilder
/* Di t */ /* Directeur */ // CLASSE QUI GERE LA CREATION DES PIZZASclass Serveur {
private CtorPizza ctorPizza; 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();
} }}
BuilderBuilder
/* U li t d t i */ /* Un client commandant une pizza. */ 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(); Pizza pizza = serveur.getPizza();
} }
Factory MethodFactory Method
On cre dynamiquement des objets en fonction de paramtres passs la fabriqueOn 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 MethodFactory Method
public class FabriqueAnimal { Animal getAnimal(String typeAnimal){
if (typeAnimal.equals("chat")) { return new Chat();
} else if (typeAnimal.equals("chien")) {return new Chien();
}} }
}
PrototypePrototype
C ti l Cration par clonage 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 copieA li d l t d bj t f t h Au lieu dappeler new et de crer un objet from scratch on clone un objet prcdent
Permet de faire des codes indpendants de la notion 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)
SingletonSingleton
On veut ne crer quune et une seule instance dune classe Besoin de coordonner des oprations Efficacit
Principe Principe Le premier appel cre une instance
L i i i Les suivants retourne un pointeur vers cette instance
SingletonSingleton
t l t l Si l t { template class Singleton { public:
static T& Instance() { // suppose que T a un constructeur par dfaut // suppose que T a un constructeur par dfaut static T theSingleInstance; return theSingleInstance;
} } };
class OnlyOne : public Singleton { class OnlyOne : public Singleton { // constructeurs/destructeur de OnlyOne accessibles au Singleton friend class Singleton; //...dfinir ici le reste de l'interface //...dfinir ici le reste de l interface };
Design PatternsDesign Patterns
Structural Patterns Adapter or Wrapper Bridge Compositep Decorator Facade Facade Flyweight (poids-plume)
P Proxy
AdaptorAdaptor
P t d ti i t f t i t f Permet de convertir une interface en une autre interface Rsout les problmes dincompatibilit dinterfaces Permet lintgration de classes non modifiables Permet l 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) 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 : Wi d j f it t d lAPI Wi d pour Windows je fait un wrapper autour de lAPI Windows
pour Unix je fait un wrapper autour de lAPI Unix Les deux wrappers ont la meme API : la dpendance a disparu
BridgeBridge
B t d l li t f d l t But dcoupler linterface dune classe et son implmentation Permet de faire varier les deux indpendamment 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 pouvoir la changer sans impacter p , p g plAPI
Parfois appel Handle
BridgeBridge
l M Cl { class MyClass {MyClassI* _impl;int premier(){return _implpremier();}
{ }int dernier(){return _impldernier();}}
Class MyClassI {// ici les donnes membres
{ // fint premier(){ // ici le code de la fonction}int dernier(){ // ici le code de la fonction(){ //}
}
CompositeComposite
But essayer de fdrer les traitements de plusieurs objets qui sont presque semblables Augmenter le code commun Rduire le code rptitifp
On a limpression dutiliser de multiples objets de la On a l impression d utiliser de multiples objets de la mme faon avec des lignes de codes identiques ou presquepresque
CompositeComposite
ExempleOn a des adultesOn a des enfants Chacun a des traitements particuliersOn va crer une classe Personne et travailler avec
autant que possible. Seuls certains traitement seront spcialissspcialiss
Lid i i t d COMPOSANT d Lide ici est de penser COMPOSANT dun GROUPE. On va travailler avec le GROUPE
DecoratorDecorator
But : attacher dynamiquement de nouvelles caractristiques un objet runtime, condition que certains travaux aient t fait compile-time
Alternative au sous-classement qui ne peut tre fait q pqu compile-time
Lextension des fonctionnalits est appele L extension des fonctionnalits est appeledcoration et est ralise par une class Dcoratorqui enrobe la classe originalequi enrobe la classe originale.
DecoratorDecorator
O d it S it C t l l On procde comme suit. Soit Component une classe que lonveut pouvoir enrichir runtime On sous-classe Component par une classe Decoratorp p On ajoute dans Decorator un pointeur vers la classe Component Le constructeur de Decorator accepte un objet Component ce qui
permet daffecter le pointeurpermet d affecter le pointeur Dans la classe Decorator toutes les mthodes hrites de
Component sont rediriges vers le pointeursL f ti f () d t d i t f (){ t f () } d l La fonction func() de component devient func(){ptrfunc();} dans le Decorator
Dans la classe Decorator on surcharge toutes les fonctions de C t d t t difi l t tComponent dont on veut modifier le comportement
On dfinit alors plusieurs Decorator. A runtime on pourra dterminer lesquels utiliserq
DecoratorDecorator
En C# // Dclarations En C# // Dclarations abstract class Voiture {
public abstract double Prix { get; } } class AstonMartin : Voiture { class AstonMartin : Voiture {
public override double Prix { get { return 999.99; } } }
// D t // Dcorateur class Option : Voiture {
protected Voiture _originale; protected double _tarifOption; public Option(Voiture originale, double tarif) { public Option(Voiture originale, double tarif) {
_originale = originale; _tarifOption = tarif;
} public override double Prix { get { return _originale.Prix + _tarifOption; } }
}}
DecoratorDecorator
l Cli ti ti O ti { class Climatisation : Option { public Climatisation (Voiture originale) : base(originale, 1.0) { }
} class Parachute : Option {
bli P h t (V it i i l ) b ( i i l 10 0) { } public Parachute (Voiture originale) : base(originale, 10.0) { } } class Amphibie : Option {
public Amphibie (Voiture originale) : base(originale, 100.0) { } } // Implmentation
class Program { static void Main() {
Voiture astonMartin= new AstonMartin(); Voiture astonMartin new AstonMartin(); astonMartin = new Climatisation(astonMartin); astonMartin = new Parachute(astonMartin); astonMartin = new Amphibie(astonMartin);
Console.WriteLine(astonMartin.Prix); // affiche 1110.99 }
}
FacadeFacade
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 en introduisant des mthodes pour les co p e d e e odu sa des odes pou es tches les plus courantes
Rend lutilisation dune libraire indpendante du reste Rend l utilisation d une libraire indpendante du reste du code
FacadeFacade
Utili ti d ti l d f ti Utilisation de parties complexes comme des fonctions hardware sur le CPU ou la mmoire
/* Complex parts */ / Complex parts / class CPU {
public void freeze() { ... } public void jump(long position) { } public void jump(long position) { ... } public void execute() { ... }
} class Memory { class Memory {
public void load(long position, byte[] data) { ... } } l H dD i { class HardDrive {
public byte[] read(long lba, int size) { ... } }
FacadeFacade
/* F d */ /* Facade */ class Computer {
public void startComputer() { cpu.freeze(); p ();memory.load(BOOT_ADDRESS,
hardDrive.read(BOOT_SECTOR, SECTOR_SIZE)); cpu.jump(BOOT_ADDRESS);
t () cpu.execute(); }
} /* Client */ / Client /
class You { public static void main(String[] args) {
Computer facade = new Computer(); facade.startComputer();
} }
Flyweight (poids plume)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 utilisen partageant autant que possible les donnes avec des objets similaires
Souvent certaines parties de ltat dun objet peuventtre partages et il est commun de les mettre dans des structures de donnes externes et de les passer, quandils sont utiliss, des objets poids plumes temporaires
Flyweight (poids plume)Flyweight (poids plume)
E l l i Exemple classique Reprsentation graphique de caractres Il est utile davoir pour chaque caractre dun document un Il est utile d avoir pour chaque caractre d 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 davoir de faon indpendante Il est clairement impossible d avoir de faon indpendantecette 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 mmespropritsp p
ProxyProxy
B t t l l bj t But : contrler laccs un objet Cest une classe fonctionnant comme une interface vers autre chose :
une connexion rseau, , un large objet en mmoire, un fichier une ressource quil est impossible de dupliquer une ressource qu il est impossible de dupliquer
Cela permet de faire croire quil y a des objets distincts alors quecela nest pas le cas. 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 proxy comme sil tait lobjet et cest le proxy qui gre lindirectionp y j p y q g
ProxyProxy
l d Exemple typique de proxy le pointeur avec compteur de rfrence
Par exemple on peut coupler des proxys avec le fl i h flyweight pattern On cre une instance dun gros objet
O d lti l i t d t bj t On cre de multiple instance du proxy vers cet objet Toutes les oprations demandes au proxy sont transfres
vers lobjet originalvers l objet original Le projet gre alors les rfrences vers lobjet et peut le
faire disparaitre lorsquil devient inutile
Design PatternDesign Pattern
B h i l Behavioral Chain of responsibility Command Command Interpreter Iterator Mediator Memento Observer State Strategy Strategy Template Method (patron de mthode) Visitor
Chain of responsibilityChain of responsibility
Pattern qui consiste en une source dobjetcommande 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
U i i i j d Un mcanisme existe aussi pour ajouter des lments en fin de la chane
CommandCommand
B t li ti t l d i iti t d But : grer linvocation en sparant le code initiateur de laction du code de laction elle-mme Gre la dlgationg Permet lexcution diffre sans avoir besoin de tout connaitre
lors de la compilation
Dfini une classe qui est utilise pour reprsenter et encapsuler toutes les informations requise pour appeler une p q p ppmthode plus tard Le nom de la mthode Lobjet qui possde la mthode L objet qui possde la mthode Les valeurs des paramtres de la mthode
CommandCommand
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
CommandCommand
/*the Command interface*/ /*the Command interface*/ public interface Command {
void execute(); }/* f ti */ /* ma fonction */public Func implements Command {
MyObj _obj;int _para1;OtherObj para2;OtherObj _para2;// ctor void execute(){
_objafonction(_para1,_para2);}
}} /* la classe MyObj */
/* l l */ /* lappelant */Command c=new Func(obj,p1,p2);c execute();
InterpreterInterpreter
Linterpreter spcifie comment valuer des squences dans un langage Dfinit la grammaire du langage Lutilise pour interprter des tats du langagep p g g The interpreter pattern specifies how to evaluate
sentences in a language. The basic idea is to have a g gclass 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 compositepattern and is used to evaluate (interpret) the sentence
InterpreterInterpreter
interface Expression { interface Expression { public int interpret(X variables);
} class Number implements Expression {
private int number; public Number(int number) { this number = number; } public Number(int number) { this.number = number; } public int interpret(X variables) { return number; }
} class BinaryOp {
Expression leftOp; Expression rightOp; 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; private String name; public Variable(String name) { this.name = name; } public int interpret(X variables) { return variables.get(name); }
}
InterpreterInterpreter
class Evaluator { class Evaluator { private Expression syntaxTree; public Evaluator(String expression) {
Stack eStack = new Stack(); for (String token : expr.split(" ")) { for (String token : expr.split( )) {
if (token.equals("+")) { Expression subExpr = new Plus(eStack.pop(),eStack.pop());eStack.push( subExpr);
} if ( k l (" ")) { if (token.equals("-")) {
Expression subExpr = new Minus(eStack.pop(), eStack.pop()); eStack.push( subExpr );
} default : eStack push( new Variable(token) ); default : eStack.push( new Variable(token) );
}syntaxTree = eStack.pop();
} public int evaluate(X context) { p ( ) {
return syntaxTree.interpret(context); }
}
IteratorIterator
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 primitivesprimitives Accder llment point en cours
S d l i l i Se dplacer pour pointer vers le suivant
IteratorIterator
f Permet de dfinir des algorithmes gnriques sur des structures de donnes sans avoir besoin de faire d i h t d d des versions pour chaque type de donnes
Exemple : Plus court chemin dans un grapheMme algorithme et mme code si le graphe est
reprsent par Liste des voisinsMatrice dadjacence
IteratorIterator
La STL (Standard Template Library) fait grand usage des iterator
Attention la modification (suppression /ajout) du Attention, la modification (suppression /ajout) du container pendant le balayage Certains iterator impose n maintien constant d Certains iterator impose un maintien constant du
container pendant le balayage
IteratorIterator
bli l BitS tIt t i l t It t { public class BitSetIterator implements Iterator { 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++); boolean b bitset.get(index++); return new Boolean(b);
} public void remove() { }public void remove() { }
}
MediatorMediator
L di t f it i t f ifi bl di t f Le mediator fournit une interface unifie pour un ensemble dinterfaces Rduire les dpendances entre les classes Simplifier la communication entre les classes
Problme de communication entre classes Beaucoup de classes : traitement de donnes rpartis entre les classes Problme de comprhension et de lisibilit Problme de comprhension et de lisibilit
Mediator : on cre une classe qui sert faire la communication avec toutes 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)
MementoMemento
L f l d b Le memento fournit la manire de renvoyer un objet un tat prcdent (undo via rollback)
Utilis par 2 objets Utilis par 2 objets Loriginator (le crateur) : objet ayant un tat interne Le caretaker (le gardien) : celui qui modifie le crateur mais qui Le caretaker (le gardien) : celui qui modifie le crateur mais qui
veut pouvoir dfaire les modifications
Principe 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
MementoMemento
O d f i l M ObjM t i t On va donc faire une classe MyObjMemento qui est une classe interne
MyObj aura deux fonctions MyObj aura deux fonctions saveToMemento qui retourne lobjet MyObjMemento restoreFromMemento qui prend en paramtre un MyObjMemento
et qui restore lobjet courantet qui restore lobjet courant
Peut tre difficile mettre en uvre, surtout si plusieurs , pmodifications
Difficile de retourner directement un tat sans passer par les sa egarde intermdiaireles sauvegarde intermdiaire Aspect ayant souvent peu dintrt donc il vaut lieux penser en
terme de pile
ObserverObserver
( Lobserver est un pattern dans lequel un objet (le sujet) maintient la liste de ses dpendants (les observers) notifie automatiquement les observers aprs chaque
difi ti d j t l t d l th d modification du sujet en appelant une de leur mthode (ou en passant par des commandes)
Principalement utilis pour mettre en oeuvre la ti ti llprogrammation vnementielle
Appel aussi Publisher/Subscriber
ObserverObserver
M Mise en uvre Systme dabonnement : le subscriber sabonne au publisher
et dfinit la fonction que le publisher devra appeler quand et dfinit la fonction que le publisher devra appeler quand un vnement se produit
Le publisher gre la liste des abonnsp g 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
StateState
S State est utilis pour reprsent ltat dun objet afin de modifier son comportement sans pour autant
difi li tmodifier linstance
Deux classes State : dfinit labstraction du comportement dun objet Context : interface entre cet objet et le reste de
lapplication
Gre des automates tats simple
StateState
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
StateState
i t f St t { interface State { public void writeName(StateContext sContext, String name);
} class StateA implements State { class StateA implements State {
public void writeName(StateContext sContext, String name) { System.out.println(name.toLowerCase()); sContext.setState(new StateB()); sContext.setState(new StateB());
} } class StateB implements State { p {
private int count=0; public void writeName(StateContext sContext, String name){
System.out.println(name.toUpperCase()); { }if(++count>1) { sContext.setState(new StateA()); }
} }
StateState
public class StateContext { public class StateContext { private State myState; public StateContext() { setState(new StateA()); } // normally only called by classes implementing the State interface public
void setState(State stateName) { 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");
} } }
StrategyStrategy
S Strategy permet de changer lalgorithme 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
StrategyStrategy
S l ti Solution Utilisation de test ou de switch : si mon tableau est tri alors
algo1, sinon algo2g , g Problmes : rptition de test/switchs pour toutes les fonctions
(maximum, 2ndmin etc)
Principe : On cre une classe Strategy racine interne qui a autant de gy q
classes drives que dalgorithmes possibles La classe externe contient un pointeur sur la classe Strategy
racine interneracine interne On va ensuite dterminer runtime quelle instance sera
effectivement affect au pointeur
StrategyStrategy
l St t I t f { class StrategyInterface { public: virtual void execute() const = 0;
}; class ConcreteStrategyA: public StrategyInterface {
bli i t l id t () t { public: virtual void execute() const { cout
StrategyStrategy
l C t t { class Context { private: StrategyInterface * _strategy; public: explicit Context(StrategyInterface* strategy): _strategy(strategy) { } void set_strategy(StrategyInterface *strategy) { _strategy = strategy; }
id t () t { t t t () } void execute() const { _strategyexecute(); } };
int main(int argc, char *argv[]) { ConcreteStrategyA cStrategyA; ConcreteStrategyA cStrategyA; ConcreteStrategyB cStrategyB; ConcreteStrategyC cStrategyC; Context context(&cStrategyA); context.execute(); context.execute(); context.set_strategy(&cStrategyB); context.execute(); context.set_strategy(&cStrategyC); context execute(); context.execute(); return 0;
}
Template MethodTemplate Method
Dfinit une mthode non abstraite (Template method) dans une classe abstraite et fait appel des mthodes abstraites pour fonctionner
Cest la classe parent qui appelle les oprations p q pp pnexistant que dans les sous-classes Un peu inhabituel normalement : les sous-classes Un peu inhabituel, normalement : les sous classes
concrtes appellent les mthodes de la super-classe.
Nest pas li aux templates du C++ ou Java
Template MethodTemplate Method
f Parfois appel mthode socle parce quelle ancre solidement un comportement qui sapplique toute l hi hi d lla hirarchie de classe
Fortement reli au pattern NVI (Non-Virtual I f ) Interface).
Le pattern NVI reconnait le bnfice dune mthode b l d h d b non abstraite appelant des mthodes abstraites, ce
qui permet de modifier facilement le code interne ( difi l t l t t i t t l (on modifie les pr et les post traiements avant les appels au code abstrait).
Template MethodTemplate Method
b t t l G { abstract class Game { protected int playersCount; abstract void initializeGame(); abstract void makePlay(int player); y( p y );abstract boolean endOfGame(); abstract void printWinner();
/* A t l t th d */ /* A template method : */ final void playOneGame(int playersCount) {
this.playersCount = playersCount; initializeGame(); ();int j = 0; while (!endOfGame()) {
makePlay(j); j = (j + 1) % playersCount; } printWinner() } printWinner();
} }
Template MethodTemplate Method
//Now we can extend this class in order to implement actual games class Monopoly extends //Now we can extend this class in order to implement actual games: class Monopoly extendsGame {
/* Implementation of necessary concrete methods */ void initializeGame() { // Initialize money } void makePlay(int player) { // Process one turn of player } 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 } 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 declarations for the chess game. */ / p g /// ...
}
VisitorVisitor
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 Conforme au principe ouvert/ferm open/closed principle "software entities (classes, modules,
functions, etc.) should be open for extension, but closed for , ) p ,modification"
VisitorVisitor
P i 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* v)
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)
}
VisitorVisitor
class Visitor { class Visitor {virtual void visit(MyObjA* obj);virtual void visit(MyObjB* obj);
}Cl M Vi it 1 bli Vi it { Class MyVisitor1 : public Visitor {
void visit(MyObjA* obj){// traitement pour obj de type MyObjA
}void visit(MyObjB* obj){void visit(MyObjB obj){
// traitement pour obj de type MyObjB}
On a M ObjA t(Vi it * ){ i it(thi ) } MyObjA::accept(Visitor* v){vvisit(this);} 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
VisitorVisitor
O t dfi i t t On veut dfinir un nouveau comportement On cre une classe NvComportement qui hrite de Visitor
Class NvComportement : public Visitor {d (M Ob A* b ){void visit(MyObjA* obj){
// traitement pour obj de type MyObjA}
id i it(M ObjB* bj){void visit(MyObjB* obj){// traitement pour obj de type MyObjB
}O bl d bj O f i l i d On a un ensemble dobjet O, on veut faire les traitements de NvComportement pour tous les objets :
NvComportement v;for(int i=0 i
Design PatternsDesign Patterns
Autres patterns : Creational Lazy InitializationObject PoolObject Pool
Concurrency patternsM iMonitor
Lazy InitializationLazy Initialization
Pattern permettant de retarder linitialisation dun objet
Utile si linitialisation est couteuse Ide : viter de faire du travail systmatique pour Ide : viter de faire du travail systmatique pour
rienMi Mise en uvre Simplement en utilisant un flag qui dtermine si lobjet
est jour ou pas
Lazy InitializationLazy Initialization
S li l i j Se gnralise pour les mises jour 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 quune liste soit trie De temps en temps on a besoin qu une liste soit trie On maintient la liste trie. Peut complexifier le code On met jour uniquement lorsquon en a besoin
Object PoolObject Pool
U bj t l t bl d bj t i iti li i Un object pool est un ensemble dobjets non initialiss qui 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
C t t ti li d tt f t Cest un type particulier de pattern factory Le pooling dobjets peut offrir une amlioration sensible des
performances.pe o a ces. Attention dans un environnement multithread de ne pas
bloquer les objets en attente
MonitorMonitor
A h h i l i t h tili t d f Approche pour synchroniser plusieurs tches utilisant de faon 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
les place dans une classe particulire : le Monitorp 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-patternsAnti patterns
Les anti-patterns sont des erreurs courantes de conception des logiciels.
Leur nom vient de l'absence ou de la