204
Gestion de projet Jean-Charles Régin Licence Informatique 3 ème année - MIAGE

C4_GestionProjet

  • 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