CSC4102 : Qualit e du mod'ele UML et patrons de conception - Denis Conan, avec Paul Gibson

La page est créée Éric Pierre
 
CONTINUER À LIRE
CSC4102 : Qualit e du mod'ele UML et patrons de conception - Denis Conan, avec Paul Gibson
CSC4102 : Qualité du
modèle UML et patrons de
conception
Revision : 3937

Denis Conan, avec Paul Gibson
Janvier 2019
CSC4102 : Qualit e du mod'ele UML et patrons de conception - Denis Conan, avec Paul Gibson
Sommaire

       1. Motivations et objectifs

       2. Qualité du modèle UML

       3. Patrons de conception

       4. Mise en pratique en TP (2h) + HP (3h)

2/37    01/2019          Denis Conan      CSC4102 : Qualité du modèle UML et patrons de conception
1 Motivations et objectifs

       1.1   Qu’est-ce que la qualité d’un modèle UML ?
       1.2   Pourquoi les patrons de conception ?
       1.3   Quels sont les objectifs de la séance ?
       1.4   Après la séance, à quoi ça sert ? où ? quand ?

3/37    01/2019             Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
1.1 Qu’est-ce que la qualité d’un modèle UML ?
        Quelques premiers éléments de réponse à partir de               [Lange and Chaudron, 2004]
          « An empirical assessment of completeness in UML designs. »
        • Well-formedness : The basic level of analysis is within a single diagram. In the
          semantics section of the UML specification well-formedness rules for model
          elements are defined.
         − These restrictions prevent designers from producing diagrams that contain
             serious flaws.
                  • Cf. les jeux des 7 erreurs du cours de la séance 6
        • Consistency : Overlapping diagrams refer to common information. If two
          diagrams in the model contain contradictory common information, then there
          is an inconsistency between these diagrams.
           −    If an inconsistency between two diagrams remains unresolved,
                miscommunication and high integration effort are likely to happen.
        •    Completeness : A UML model is complete, if for each element in the one
             diagram it’s expected counterpart in the other diagram is present.
           −       Violations of model completeness can cause unimplemented functionality.
                       • Dans le module CSC4102, nous ne modélisons pas tout

4/37     01/2019              Denis Conan          CSC4102 : Qualité du modèle UML et patrons de conception
1.2 Pourquoi les patrons de conception ?
       Est-ce une conception réutilisable, évolutive, adaptable, performante...
       Christopher Alexander,
       A pattern language : towns, buildings, construction
       [Alexander et al., 1977]

        As an element in the world, each pattern is a relationship between a certain
          context, a certain system of forces which occurs repeatedly in that context,
          and a certain spatial configuration which allows these forces to resolve
          themselves.
        As an element of language, a pattern is an instruction, which shows how
          this spatial configuration can be used, over and over again, to resolve the
          given system of forces, wherever the context makes it relevant.
       La différence entre les concepteurs novices et expérimentés est typiquement
       l’expérience
        Le novice hésite beaucoup entre différentes variantes

        L’expert trouve tout de suite la « bonne » solution (adaptable, évolutive...)

5/37     01/2019                  Denis Conan     CSC4102 : Qualité du modèle UML et patrons de conception
1.3 Quels sont les objectifs de la séance ?

        Vérifier la qualité du modèle de la solution actuellement proposée

        • Identification et correction des problèmes de cohérence :
         − Entre les diagrammes UML
         − Entre le modèle UML et le code JAVA
        Étudier l’application d’un patron de conception

        •    Notre objectif n’est pas que vous deveniez des « experts », mais que vous
             connaissiez le concept pour avoir appliqué au moins un patron de conception
        • Exigence extraite du cahier des charges
         − « Comme le nombre d’états globaux atteignables à partir d’un état global
                   est important, vous proposerez deux stratégies de construction du graphe
                   des états globaux (jusqu’à la découverte d’une situation d’interblocage ou
                   jusqu’à la fin de l’exécution du système sans interblocage). »
        •    Modélisation avec le patron de conception Stratégie

6/37     01/2019               Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
1.4 Après la séance, à quoi ça sert ? où ? quand ?

        En plus de la connaissance d’un domaine métier
          (par exemple le contrôle aérien, la gestion d’actifs, ou encore le vote électronique)
          la connaissance des patrons de conception est efficace
        •    C. Alexander a proposé le concept de langage de patrons pour l’architecture et
             l’urbanisation des systèmes de systèmes
           −       Pattern language : a method of describing good design practices or patterns of
                   useful organization within a field of expertise [Wikipedia, 2016]
        •    Aujourd’hui, partout : des sciences sociales au logiciel, en passant par la pédagogie
        •    Nous sommes intrinsèquement bons dans la reconnaissance de patrons

        À l’avenir (après ce module), essayez l’approche de conception à base de
          patrons
         1. À partir des exigences, considérez les concepts, les problèmes, les contextes, les
            attributs de qualité
         2. Cherchez à appliquer les patrons de conception (génériques),
            avant de construire des solutions spécifiques

7/37     01/2019               Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
2 Qualité du modèle UML

       2.1 À propos de cohérence
       2.2 Principes généraux de la méthode OOSDA

8/37    01/2019         Denis Conan        CSC4102 : Qualité du modèle UML et patrons de conception
2.1 À propos de cohérence
        Étant donné le diagramme de classes qui suit
                                                                                       Médiathèque
                                          Localisation                            nom:string
                                   salle:string
                                   rayon:string                  *
                   *
                                                           >
                       Genre                                Empruntable
                                             est rangé

              nom:string                                 duréeEmprunt():integer
              nbEmprunts:integer=0                       tarifEmprunt():double
                                                                                                 *
                                                                                             FicheEmprunt
                                                                                         dateEmprunt:Date
                                                                                                                                                            *
                       posséder

                                                                                         dateLimite:Date
                                                 *                                       dateRappel:Date                                   CategorieClient
                                                  Document                               /dépassé:booléen
                                                                                                                                     nomCat: string
                                        code:string                                      /tarif:double
                                        titre:string                                                                                 nbEmpruntsMax:integer
                                    *   auteur:string
                                                                       *                  0..1
                                                                                                                                     cotisation:double
                                        année:string                                                              *                  coefTarif:double
                                        empruntable:booléen=F

                                                                                                      concerner
                                                                                                                                     coefDurée:double
                                        /emprunté:booléen=F                  concerner                                               codeReductionActif:boolean
                                        nbEmprunts:integer=0

                                                                     Vidéo                                                   *

                                                                                                                                               appartenir
                      Audio                              duréeFilm:integer                                       Client
            classification:string                        mentionLégale:string                        nom:string
            nbEmpruntsTotal:integer=0                    nbEmpruntsTotal:integer=0                   prenom:string
            DURÉE:integer=4*7                            DURÉE:integer=2*7                           adresse:string
            TARIF:double=1.0                             TARIF:double=1.5                            dateInscription:Date                 *
                                                                                                     dateRenouvellement:Date
                                                                                                     nbEmpruntsEffectues:integer=0
                                                                                                     /nbEmpruntsDepasses:integer=0
                                            Livre                                                    /nbEmpruntsEncours:integer=0
                                  nombrePage:integer                                                 codeRéduction:integer
                                  nbEmpruntsTotal:integer=0                                          enRetard:booleen
                                  DURÉE:integer=6*7
                                  TARIF:double=0.5

9/37     01/2019                             Denis Conan                                    CSC4102 : Qualité du modèle UML et patrons de conception
2.1.1 Exemple de non-respect de la navigabilité

     Diagramme de séquence du cas d’utilisation « ajouter un document »

        •     Selon le diagramme de classes, l’association Localisation—Document n’est
              pas franchissable vers Document

                         m:Médiathèque                 l:Localisation                   d:Document                         g:Genre

              ajouterDocument(code,g,l)

                                          doc=chercherDocument(code):Document

        opt                                                                   [doc==null]
                                     ajouterDocument(d,g)
                                                                  ajouterDocument(l)
                                                                                                    ajouterDocument(d)

                                                                   association
                                                                   non franchissable

10/37   01/2019                   Denis Conan                 CSC4102 : Qualité du modèle UML et patrons de conception
2.1.2 Exemple de parcours d’association inexis-
                  tante
     Diagramme de séquence du fragment « création de la fiche d’emprunt »
        •   Dans le diagramme de classes, l’association Document—Client n’existe pas

              m:Mediathèque                               c:Client              d:Document                 g:Genre

                                                                   :CatégorieClient

                      dateLimite=dateRetour(dateEmprunt,dn):date

                                                              dn=dureeEmprunt():int
                                                                   cD=getCoefDuree():double

                      tarif=tarifEmprunt():double
                                                                                                  association
                                                          tarif=sommeDue(tn):double               non existante
                                                                   cT=getCoefTarif():double
                      
                                        f:FicheEmprunt

                      emprunter()
                                                                                           emprunter()
                                                                          emprunter()

11/37   01/2019               Denis Conan                    CSC4102 : Qualité du modèle UML et patrons de conception
2.2 Principes généraux de la méthode OOSDA
     How can one know if a given class is well designed ?
         « Object Oriented Design with Applications »[?]pages 123–125]OOSDABooch

        •    Sufficient : enough characteristics of the abstraction to permit meaningful and
             efficient interaction
        •    Complete : general enough to be commonly usable
         − Many high-level operations can be composed from low-level ones
         − Attention cependant à l’encapsulation (p.ex. tous les getters ? non !)
        • Primitive : [only] operations that can be efficiently implemented [with] the
             underlying representation of the abstraction
        • Coupling :
         − On the one hand, weakly coupled classes are desirable
         − On the other hand, inheritance —which tightly couples superclasses and
                   their subclasses— helps us to exploit the commonality among abstractions
        • Cohesion :
         − The least desirable form of cohesion = coincidental cohesion : entirely
                   unrelated abstractions are thrown into the same class
          −        The most desirable form of cohesion = functional cohesion : the elements of
                   a class all work together to provide some well-bounded behavior
12/37    01/2019              Denis Conan              CSC4102 : Qualité du modèle UML et patrons de conception
2.2.1 Exemple de questionnement de la cohésion
                    m:Mediathèque                              c:Client               d:Document             g:Genre

                                                                     :CatégorieClient

                            dn=dureeEmprunt():int

                            dateLimite=dateRetour(dateEmprunt,dn):date
                                                                         cD=getCoefDuree():double

                            bd=emprunter(f):booléen
                                                                                                bg=emprunter():booléen
                            bc=emprunter():booléen

                            tn=tarifEmprunt():double

                            tarif=sommeDue(tn):double
                                                                     cT=getCoefTarif():double
                            
                                             f:FicheEmprunt

        Cohésion fortuite : pourquoi toute l’algorithmique serait dans la façade ?
            Les autres classes se dégradent en simples structures de données (sans algo.)
              Risque d’introduction de getters/setters, ce qui contredit l’ensapsulation
    X Cohésion fonctionnelle : FicheEmprunt responsable de calculer dateLimite... ?
        X Elle connaı̂t via ses associations toutes les informations nécessaires
13/37   01/2019             Denis Conan                          CSC4102 : Qualité du modèle UML et patrons de conception
2.2.2 Exemple de modélisation préférée
     Ce que nous avions proposé lors de la conception préliminaire

                  m:Médiathèque                      c:Client     :CatégorieClient         d:Document            :Genre

                                        «new»
                       «create(c,d)»
                                   f:FicheEmprunt

                                                       dn=duréeEmprunt(): Integer

                         dateLimite=dateRetour(dateEmprunt,dn): Date

                                                    cD=getCoefDurée(): Double

                                                        bd=emprunter(f): Booléen
                                                                                                emprunter(): Booléen

                                     bc=emprunter(): Booléen

                                                        tn=tarifEmprunt(): Double

                                    tarif=sommeDue(tn): Double

                                                    cT=getCoefTarif(): Double

14/37   01/2019                   Denis Conan                    CSC4102 : Qualité du modèle UML et patrons de conception
3 Patrons de conception

        3.1   Principe
        3.2   Définition et éléments essentiels
        3.3   Catégories des patrons de conception « du GoF »
        3.4   Création, patron de conception Singleton
        3.5   Structure, patron de conception Façade
        3.6   Structure, patron de conception Composite
        3.7   Comportement, patron Stratégie
        3.8   Comportement, Observable—Observateur
        3.9   Combinaison de patrons de conception, exemple de MVC

15/37    01/2019          Denis Conan       CSC4102 : Qualité du modèle UML et patrons de conception
3.1 Principe
        E. Gamma, R. Helm, R. Johnson, J. Vlissides,
        (le Gang of Four, GoF ),
        Design Patterns : Elements of Reusable Object-Oriented Software
        [Gamma et al., 1994], ACM SIGSOFT Outstanding Research Award, 2010

     « Lors de la conception, s’inspirer de modèles tels que “la représentation de
          situations à l’aide d’objets” ou “l’habillage d’objets permettant l’ajout ou le
          retrait facile de fonctionnalités” »
        • « Valeur de l’expérience », « sentiment de déjà vu »
         − « Si l’on parvenait à se souvenir des détails du problème antérieur, et de la
                   façon dont il avait été résolu, on pourrait alors réutiliser cette expérience, au
                   lieu d’avoir à la redécouvrir »
                        • « Recueillir l’expertise en matière de conception orientée objet, sous
                           forme de modèle de conception, aussi appelé patron de conception »
                        • « Chaque patron de conception, systématiquement, nomme, explique
                           et évalue un concept important et qui figure fréquemment dans les
                           systèmes orientés objet »

16/37    01/2019                Denis Conan              CSC4102 : Qualité du modèle UML et patrons de conception
3.2 Définition et éléments essentiels
        Définition et éléments « du GoF »   [Gamma et al., 1994]

     Définition :

        •    C’est une description d’objets coopératifs et de classes que l’on a spécialisés
             pour résoudre un problème général de conception dans un contexte particulier
     Quatre éléments essentiels :

        • Nom : identification d’un concept, vocabulaire dans un catalogue
        • Problème : décrit la ou les situations dans lesquelles le patron s’applique
         − Expose le sujet à traiter et son contexte
         − Avec parfois une liste de conditions à satisfaire
        • Solution : décrit les éléments qui constituent la conception
         − Relations entre eux, leur part dans la solution, leur coopération
         − Description générique d’un problème de conception
        • Conséquences : effets résultants de l’application du modèle sur la conception
             ainsi que les variantes de compromis

17/37    01/2019            Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
3.3 Catégories des patrons de conception « du
                  GoF »
     Création : Un patron de création permet de résoudre les problèmes liés à la
        création et la configuration d’objets
        •   Singleton (Singleton), Fabrique abstraite (Abstract Factory ), Constructeur
            (Builder ), Fabrique (Factory Method), Prototype (Prototype)
     Structure : Un patron de structure permet de résoudre les problèmes liés à
        la structuration des classes et leur interface en particulier
        •   Façade (Facade), Adaptateur (Adapter ), Pont (Bridge),
            Composite (Composite), Décorateur (Decorator ), Poids-plume (Flyweight),
            Mandataire (Proxy )
     Comportement : Un patron de comportement permet de résoudre les
        problèmes liés aux interactions entre les classes
        •   Chaı̂ne de responsabilité (Chain of responsibility), Commande (Command),
            Interpréteur (Interpreter ), Itérateur (Iterator ), Médiateur (Mediator ),
            Memento (Memento), Observateur—Observable (Observer ), État (State),
            Stratégie (Strategy ), Patron de méthode (Template Method), Visiteur
            (Visitor )
18/37   01/2019           Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
3.4 Création, patron de conception Singleton
    1. Problème : dans l’étude de cas Médiathèque, pour la classe de la Façade,
        •   Comment assurer qu’une classe n’a qu’une instance ? facilement accessible ?
    2. Solution
          Une variable globale permet d’accéder à un objet, mais il est plus difficile
          d’ajouter la contrainte de l’instance unique
        X Une meilleure solution consiste à confier à la classe elle-même la responsabilité
          d’assurer l’unicité1

                                     Médiathèque
                         −nom:string                                     if (instance == null) {
                         −instance:Médiathèque
                                                                           instance=new Médiathèque(nom);
                         −Médiathèque(String nom)                        }
                         +getInstance(String nom):Médiathèque            return instance;

    3. Conséquences
        •   La méthode getInstance définit (l’algorithme de) la création
        •   Difficulté avec le concept de généralisation spécialisation : dérivation de la
            classe singleton
        1. Cf. classes du paquetage seance9.patrondeconception.singleton
19/37   01/2019             Denis Conan                         CSC4102 : Qualité du modèle UML et patrons de conception
3.5 Structure, patron de conception Façade I

    1. Problème : dans l’étude de cas Médiathèque
        •   Comment créer un nouveau client ? Dans une catégorie client, mais laquelle ?
            Donc, commencer par créer la catégorie client ? Mais, comment ?

                                                   Localisation
                                            salle:string
                                            rayon:string

                                                                     >
                              Genre                                   Empruntable
                                                      est rangé

                     nom:string                                   duréeEmprunt():integer
                     nbEmprunts:integer=0                         tarifEmprunt():double

                                                                                                    FicheEmprunt
                                                                                                dateEmprunt:Date
                               posséder

                                                                                                dateLimite:Date
                                                          *                                     dateRappel:Date                                   CategorieClient
                                                           Document                             /dépassé:booléen
                                                 code:string                                    /tarif:double                               nomCat: string
                                                 titre:string                                                                               nbEmpruntsMax:integer
                                             *   auteur:string
                                                                               *                 0..1
                                                                                                                                            cotisation:double
                                                 année:string                                                            *                  coefTarif:double
                                                 empruntable:booléen=F

                                                                                                             concerner
                                                                                                                                            coefDurée:double
                                                 /emprunté:booléen=F                concerner
                                                 nbEmprunts:integer=0                                                                       codeReductionActif:boolean

                                                                            Vidéo

                                                                                                                                                      appartenir
                              Audio                               duréeFilm:integer                                     Client
                    classification:string                         mentionLégale:string                      nom:string
                    nbEmpruntsTotal:integer=0                     nbEmpruntsTotal:integer=0                 prenom:string
                    DURÉE:integer=4*7                             DURÉE:integer=2*7                         adresse:string
                    TARIF:double=1.0                              TARIF:double=1.5                          dateInscription:Date                 *
                                                                                                            dateRenouvellement:Date
                                                                                                            nbEmpruntsEffectues:integer=0
                                                                                                            /nbEmpruntsDepasses:integer=0
                                                     Livre                                                  /nbEmpruntsEncours:integer=0
                                           nombrePage:integer                                               codeRéduction:integer
                                           nbEmpruntsTotal:integer=0                                        enRetard:booleen
                                           DURÉE:integer=6*7
                                           TARIF:double=0.5

20/37   01/2019                           Denis Conan                                           CSC4102 : Qualité du modèle UML et patrons de conception
3.5 Structure, patron de conception Façade II

    2. Solution :
            Soit une méthode de classe dans la classe catégorie client
                  Cette méthode est un Builder
                  Il faut connaı̂tre les noms des classes (c.-à-d. l’intérieur du système)
                          Il devient alors difficile de faire évoluer le système :
                               • En cas de renommage, tous les clients doivent évoluer
        X Soit un objet dédié à partir duquel on appelle une méthode
                   X Cette nouvelle classe est la Façade

    3. Conséquences :
        •   Façade : tous les appels depuis l’extérieur passent par là

21/37   01/2019                Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
3.5.1 Explications complémentaires

     La façade a pour but de cacher une conception

        • La façade peut être abstraite dans une interface
         − Une mise en œuvre peut être remplacée par une autre
     La façade permet de simplifier cette complexité en fournissant une interface
         simple du sous-système
     Habituellement, la façade est réalisée en réduisant les fonctionnalités
         tout en fournissant toutes les fonctions nécessaires aux utilisateurs
        • Par exemple, une façade peut être utilisée pour :
         − Rendre une bibliothèque plus facile à utiliser, comprendre et tester
         − Rendre une bibliothèque plus lisible
         − Réduire les dépendances entre les clients de la bibliothèque et le
                   fonctionnement interne de celle-ci

22/37    01/2019               Denis Conan          CSC4102 : Qualité du modèle UML et patrons de conception
3.6 Structure, patron de conception Composite I

    1. Problème
        • Comment gérer une arborescence d’objets, tous gérés de manière similaire ?
         − Arborescence d’objets = relations de composition entre certains objets
         − Par exemple, dans un système à base d’événements qui filtre des
                   publications (contenant des informations),
                   comment gérer de manière identique des fitres simples et des filtres
                   composites
                       • Filtres simples Fsi : méthode evaluateFsi → {true, false}
                       • Filtres composites Fci : méthode evaluateFci définie comme une
                          formule logique de filtres simples
                          avec les connecteurs de la logique propositionnelle (¬, ∧, ∨, etc.)

23/37    01/2019               Denis Conan           CSC4102 : Qualité du modèle UML et patrons de conception
3.6 Structure, patron de conception Composite II
    2. Solution :
            Soit des classes d’objets primitifs (atomiques) et des classes d’objets conteneurs
              Problème : gestion différenciée des primitifs et des conteneurs
        X Soit une classe abstraite ou une interface, dont certaines concrétisations
          mettent en œuvre l’agrégation ou la composition d’éléments
          (dans la figure, le connecteur de la composition = ∧)

                                 CompositeFilter                                                  Filter                          Publication

                          −filters:Coll. de Filter                                +evaluate(Publication p):boolean        −message: String

                          +evaluate
                                                                             *
                            (Publication p):boolean

                  for (Filter f : filters) {                  FilterStringEndsWith                FilterStringEquals        FilterStringStartsWith
                     if (!filter.evaluate(publication)) {
                         return false;                      −substring: String                −string: String             −substring: String
                     }
                  }                                         +evaluate                         +evaluate                   +evaluate
                  return true;                                (Publication p):boolean           (Publication p):boolean     (Publication p):boolean

    3. Conséquences :
        •   Adjonction de nouveaux types d’éléments par simple ajout de classes concrètes

        1. Cf. classes du paquetage seance9.patrondeconception.composite
24/37   01/2019                             Denis Conan                            CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie I
    1. Problème
        •   Comment modéliser une famille d’algorithmes ?
            en les rendant interchangeables ?

    2. Solution
            Soit insérer les algorithmes dans les objets qui les utilisent
                  Quid d’un changement de stratégie (d’algorithme) ?
                        Paramètre de configuration
                        avec une structure de contrôle à base de if ou de switch ?
                             • Complexe =⇒ sujet à erreurs (dans la conception et dans les
                                tests)
                        Utilisation d’une généralisation spécialisation avec changement de
                        type pour changer de stratégie ?
                             • Complexe =⇒ sujet à erreurs (dans la conception et dans les
                                tests)
        X Soit encapsuler les algorithmes dans des objets distincts
            X Changement de stratégie = changement d’objet
25/37   01/2019              Denis Conan           CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie II

           java.lang.Comparable                           CubeTriable                                       StratégieDeTri

          +compareTo(Object ob): int               +getStrategieDeTri():                           +algorithmeDeTri(
                                                       StrategieDeTri                               CubeTriable a, CubeTriable b): int
                                                   +setStrategieDeTri(
                                                       StrategieDeTri s)
                                                   +getNom(): String
                                                   +getPoids(): double
                                                                                                                         TriAucun
                                                   +getVolume(): double
                                                                                                             +algorithmeDeTri(
                                                                                                              CubeTriable a, CubeTriable b): int

                                                                                                                        TriParNom

                                                                                                             +algorithmeDeTri(
                                                              Cube                                            CubeTriable a, CubeTriable b): int

                                                 − nom : String
                                                                                                                        TriParPoids
                                                 − poids : double
                                                 − volume : double
                                                                                                             +algorithmeDeTri(
                                                 +constructeur(String nom,                                    CubeTriable a, CubeTriable b): int
                                                     double poids, double volume,
                                                     StratégieDeTri s)
                                                 +toString(): String                                                   TriParVolume

                                                                                                             +algorithmeDeTri(
                                                                                                              CubeTriable a, CubeTriable b): int

26/37   01/2019                    Denis Conan                  CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie III
        Cf. classes du paquetage seance9.patrondeconception.strategie

                                           c:Cube                           t:TriParNom                o:Cube

                          compareTo(obj):int

                                          opt
                                                       [obj != null && obj instanceof CubeTriable ]

                                                      o=(CubeTriable) obj

                                                    r=algorithmeDeTri(c,o):int
                                                       nc=getNom():String
                                                                                    no=getNom():String

    3. Conséquences :
        •   Appel des algorithmes par délégation (c délègue à t)
        •   Possibilité de factoriser des parties d’algorithmes par généralisation spéc.
        •   Possibilité d’ajouter le patron Singleton pour avoir une instance par stratégie

27/37   01/2019             Denis Conan                        CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie IV
     Avec des lambda expressions

         java.lang.Comparable                                                                                        Cube
                                                          CubeTriable
                                                                                                − nom : String
        +compareTo(Object ob): int                 +getStrategieDeTri():                        − poids : double
                                                       StrategieDeTri                           − volume : double
                                                   +setStrategieDeTri(
                                                       StrategieDeTri s)                        − strategie : StrategieDeTri
                                                   +getNom(): String                            − strategieFunction :
                                                   +getPoids(): double                            BiFunction
                                                   +getVolume(): double                         − BiFunction triAucun;
                                                                                                − BiFunction triParNom;
                                                                                                − BiFunction triParPoids;
                                                         
                                                         StrategieDeTri                         − BiFunction triParVolume;
                                                   TRI_AUCUN                                    +constructeur(String nom,
                                                   TRI_PAR_NOM                                     double poids, double volume,
                                                   TRI_PAR_POIDS                                   StratégieDeTri s)
                                                   TRI_PAR_VOLUME

28/37    01/2019                     Denis Conan                     CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie V
        Classe seance9.patrondeconception.strategielambdas

   1    private Str ateg ieDeT ri strategie ;
   2    private BiFunction < CubeTriable , CubeTriable , Integer > s tr ate gi eFu nc tio n ;
   3       // ...
   4    public void s e t S t r a t e g i e D e Tri ( StrategieDeTri s ) {
   5       strategie = s ;
   6       switch ( s ) {
   7          case TRI_AUCUN : s t r a t e gi eFu nc tio n = triAucun ; break ;
   8          case TRI_PAR_NOM : s t r a te gie Fu nct io n = triParNom ; break ;
   9          case TRI_PAR_POIDS : s tr at egi eF unc ti on = triParPoids ; break ;
  10          case TRI _PAR_ VOLU ME : s tra te gie Fu nct io n = triParVolume ; break ;
  11       }
  12    }
  13    // ...
  14    private static BiFunction < CubeTriable , CubeTriable , Integer > triAucun =
  15                          (a , b ) -> 0;
  16    private static BiFunction < CubeTriable , CubeTriable , Integer > triParNom =
  17                          (a , b ) -> a . getNom () . compareTo ( b . getNom () ) ;
  18    private static BiFunction < CubeTriable , CubeTriable , Integer > triParPoids =
  19                          (a , b ) -> Double . compare ( a . getPoids () , b . getPoids () ) ;
  20    private static BiFunction < CubeTriable , CubeTriable , Integer > triParVolume =
  21                          (a , b ) -> Double . compare ( a . getVolume () , b . getVolume () ) ;

29/37     01/2019             Denis Conan             CSC4102 : Qualité du modèle UML et patrons de conception
3.7 Comportement, patron Stratégie VI
        Cf. classes du paquetage seance9.patrondeconception.strategielambdas
                                               c:Cube                                     o:Cube

                               compareTo(obj):int

                                              opt
                                                    [obj != null && obj instanceof CubeTriable ]

                                                          o=(CubeTriable) obj

                                                          r=strategieFunction.apply(c,o):int
                                                               no=getNom():String

     Conséquences :

        •    Appel de la lambda expression correspondante
        •    Un attribut de classe par stratégie =⇒ patron de conception Singleton pour
             les stratégies

30/37    01/2019           Denis Conan                       CSC4102 : Qualité du modèle UML et patrons de conception
3.8 Comportement, Observable—Observateur I

    1. Problème

        • Comment lier des objets sans           •       Par exemple, notification d’acteurs
          fortement les coupler ?
          tout en maintenant la cohérence ?
         − Maintien de la cohérence =                                                    ajouter une audio

                                                                                            ajouter un livre
             modification de Oable
                                                                                          ajouter une vidéo
             =⇒ Oteur averti
        • Comment avoir un objet Oable avec                                          rendre consultable document

                                                                                    rendre empruntable document
          plusieurs objets Oteur i ?
                                                                                           retirer document

                                                                                         emprunter document

                                                                                          restituer document
                                                     Employé
                                                                                    trouver les emprunts en retard

                                                                                        réserver un document

                                                                                        notifier la disponibilité
                                                                                            d’un document

31/37    01/2019         Denis Conan           CSC4102 : Qualité du modèle UML et patrons de conception
3.8 Comportement, Observable—Observateur II

    2. Solution
                                                                                                                      
                      Observable                                                                                                    Observer

                    attach(Observer)                                                                                              update()
                    detach(Observer)
                    notify()

               AbstractObservable
                                                                                                                        *      AbstractObserver
                                                                                 //...
                                                                                 observable.attachObserver(this)
            attachObserver(Observer)                                                                                        register()
            detachObserver(Observer)              notifyObservers()                                                         unregister()
             setState(Object)                                         //...                                     update()
                                                                                  observable.detachObserver(this)
            notifyObservers()                 for all observer in observers do
             Object getState()      observer.update()
                                              done

                                                                                        state = observable.getState()
              ConcreteObservable                                                                                              ConcreteObserver

                                                                                               super.update()
                  Object getState()                                                                                           update()
                                                                                               // ...
                  setState(Object o)         // ...
                                             super.setState(o)

32/37   01/2019                        Denis Conan                           CSC4102 : Qualité du modèle UML et patrons de conception
3.8 Comportement, Observable—Observateur III

                                       oc:Observer                    os:Observable

                       register()
                                              attachObserver(oc)

                       setState(o)

                                                                                       notifyObserver()
                                                                   update()

                                              o=getState()

        Cf. classes du paquetage seance9.patrondeconception.observateurobservable

33/37   01/2019          Denis Conan                 CSC4102 : Qualité du modèle UML et patrons de conception
3.8 Comportement, Observable—Observateur IV

    3. Conséquences :
        • L’objet observateur est un objet référencé par l’objet observable
         − Par exemple, la façade de la médiathèque possède la connaissance
                   (de l’interface graphique) des acteurs
          −        Similairement à l’utilisation de la façade comme unique point d’entrée, la
                   façade peut devenir l’unique point de sortie

34/37    01/2019               Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
3.9 Combinaison de patrons de conception,
                  exemple de MVC

     Le patron Modèle—Vue—Contrôleur (MVC) est souvent mis en œuvre en
        utilisant une combinaison des patrons Observable—Observateur, Stratégie
        et Composite [Krasner and Pope, 1988]
        •   Stratégie : relation entre les contrôleurs et les vues
        •   Composite : relation entre les vues
        •   Observable—Observateur : relation entre le modèle et les vues,
            et entre le modèle et les contrôleurs

35/37   01/2019             Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
4 Mise en pratique en TP (2h) + HP (3h)

     Qualité du modèle UML

        •   Cohérence entre les diagrammes et avec le code
     Développement de la fonctionnalité « choix de la stratégie de validation »

        •   En utilisant le patron de conception Stratégie

     Continuation du développement

     Organisation du TP (2h)

        •   1h : Travail en binôme-projet
        •   2 × 5mn : Évaluation croisée + bilan intermédiaire collectif
        •   Reste de la séance : continuation des travaux

     Rendu de la séance en HP (3h) : PDF + JAVA, avec « seance9 » dans
        « sprint2 »

36/37   01/2019            Denis Conan            CSC4102 : Qualité du modèle UML et patrons de conception
Références I
        Alexander, C., Ishikawa, S., and Silverstein, M. (1977).
        A pattern language : towns, buildings, construction, volume 2.
        Oxford University Press.

        Gamma, E., Helm, R., Johnson, R., and Vlissides, J. (1994).
        Design Patterns : Elements of Reusable Object-Oriented Software.
        Addison-Wesley.

        Krasner, G. and Pope, S. (1988).
        A Cookbook for Using the Model-view Controller User Interface Paradigm in
        Smalltalk-80.
        Journal Object Oriented Programming, 1(3) :26–49.

        Lange, C. and Chaudron, M. (2004).
        An empirical assessment of completeness in UML designs.
        In Proc. of the 8th International Conference on Empirical Assessment in Software
        Engineering, pages 111–121.

        Wikipedia (2016).
        Pattern language.
        http://en.wikipedia.org/wiki/Pattern_language.

37/37   01/2019            Denis Conan           CSC4102 : Qualité du modèle UML et patrons de conception
Vous pouvez aussi lire