Académique Documents
Professionnel Documents
Culture Documents
Recueil Et Specification Demarches Itera
Recueil Et Specification Demarches Itera
des besoins
pour le
développement
logiciel
Recueil et spécification,
démarches itératives et agiles
Jacques Lonchamp
Professeur des universités
Toutes les marques citées dans cet ouvrage
sont des marques déposées par leurs propriétaires respectifs.
Illustration de couverture :
Grey abstract communication © iStock.com/nnnnae
© Dunod, 2015
5 rue Laromiguière, 75005 Paris
www.dunod.com
ISBN 978-2-10-072994-4
Table des matières
AVANT-PROPOS VIII
CHAPITRE 1 • INTRODUCTION
1.1 Le logiciel 1
1.2 Le développement logiciel 3
1.3 La qualité du logiciel 4
1.4 La « crise du logiciel » 5
1.5 La maturité des organisations 8
PARTIE 1
LE DÉVELOPPEMENT LOGICIEL
PARTIE 2
LA MODÉLISATION MÉTIER
PARTIE 3
LA MODÉLISATION DES BESOINS
PARTIE 4
LA MODÉLISATION DE L’APPLICATION
PARTIE 5
LES ÉTUDES DE CAS
CONCLUSION 253
BIBLIOGRAPHIE 301
INDEX 305
Avant-propos
LA CONCEPTION DE L’OUVRAGE
Le positionnement dans le cursus
Un cursus de formation à l’informatique ressemble à une fusée à trois étages.
L’étage disciplinaire vise l’acquisition des savoirs conceptuels et techniques de base, grâce à
des enseignements ciblés vers des domaines bien délimités.
L’étage intégratif doit permettre de tisser des liens entre les savoirs disciplinaires, de les
approfondir en conséquence, et de prendre conscience des enjeux réels dans le monde
professionnel.
L’étage professionnalisant, qui s’appuie sur la compréhension globale des grandes
thématiques que procure l’étage précédent, vise l’approfondissement de thèmes techniques
spécialisés permettant de passer de la compréhension à la maîtrise effective de certaines
facettes du métier.
Les deux ouvrages proposés, sur la conception d’une part et sur les processus et l’analyse
d’autre part, relèvent clairement de la phase « intégrative », pour laquelle le manque de
documents pédagogiques est criant.
Sans tomber dans le travers encyclopédique des énormes « bibles » du génie logiciel (comme
[Pre09] ou [Som04]), cet ouvrage cherche à donner une présentation synthétique large des
thèmes abordés, une forme de « culture générale » de l’analyse, tout en approfondissant les
points essentiels des pratiques les plus courantes.
LE PLAN DE L’OUVRAGE
La première partie s’attache à présenter de manière synthétique les différentes facettes du
développement logiciel en insistant plus particulièrement sur les activités de l’ingénierie des
besoins en amont de la conception des applications qui sont au cœur de l’ouvrage.
– Le chapitre 1 définit le logiciel et la problématique de son développement au sein des
organisations.
– Le chapitre 2 est une introduction à l’ensemble des activités du développement logiciel.
– Le chapitre 3 discute de la modélisation, qui est à la base de toute la démarche d’analyse
et de conception, et donne quelques rappels sur la notation UML.
– Le chapitre 4 présente les différentes organisations du développement logiciel, appelées
communément « modèles de cycle de vie ».
– Le chapitre 5 entre dans le détail des « méthodes » de développement objet les plus en
vogue actuellement : (Rational) Unified Process – (R)UP, eXtreme Programming – XP,
Scrum.
XII Avant-propos
Les trois parties suivantes du livre décrivent les principales techniques et notations utilisables
concrètement pendant l’analyse.
La deuxième partie est consacrée aux techniques de la modélisation métier.
– Le chapitre 6 introduit la problématique de la modélisation métier et de l’utilisation du
langage UML à cette fin.
– Le chapitre 7 détaille la modélisation des processus métier.
– Le chapitre 8 décrit la modélisation des entités métier ou modélisation du domaine.
– Le chapitre 9 introduit la spécification formelle d’expressions avec le langage OCL
(Object Constraint Language) qui sert souvent à préciser les modèles de classes du
domaine. Mais ce langage peut bien entendu être utilisé dans d’autres contextes et avec
d’autres modèles UML.
La deuxième étude de cas porte sur l’analyse d’un jeu de plateau (type Monopoly).
– Le chapitre 18 décrit informellement les règles du jeu, puis donne une spécification de
l’application correspondante sous forme de user stories.
– Le chapitre 19 donne une spécification de l’application en termes de cas d’utilisation et
de diagramme de cas.
– Le chapitre 20 décrit le modèle des classes du domaine et illustre les diagrammes d’états
associés aux entités complexes du jeu.
Chapitre 1
Introduction
1.1 LE LOGICIEL
1.1.1. L’importance du logiciel
Beaucoup d’aspects de notre quotidien ne peuvent être imaginés aujourd’hui sans logiciel.
C’est le cas entre autres des domaines du transport, du commerce, des communications, de la
médecine, des finances ou des loisirs. Cette omniprésence du logiciel fait que nos vies et le
fonctionnement de nos sociétés dépendent fortement de sa qualité.
Les erreurs logicielles peuvent causer de vrais désastres, économiques ou sanitaires. Un
exemple emblématique est l’explosion de la première fusée Ariane 5 en 1996, qui a coûté
plus d’un demi-milliard de dollars, à cause du dépassement de capacité d’une variable lors
d’un calcul. Dans un registre différent, tout le monde se souvient de la grande peur du « bug
de l’an 2000 » et de son coût astronomique, estimé entre 300 et 5000 milliards de dollars !
– les logiciels « autonomes » (standalone), comme les traitements de texte, les logiciels de
calcul ou les jeux,
– les logiciels qui gèrent des processus (process support), aussi bien industriels que de
gestion,
– les logiciels « embarqués » dans des systèmes (embedded), comme dans les transports, la
téléphonie ou les satellites.
On comprend que la notion de qualité et les exigences qui s’y attachent peuvent varier
considérablement pour toute cette diversité de logiciels.
Comme cela sera détaillé dans la suite de l’ouvrage, le développement logiciel comprend
en amont une phase centrée sur les besoins (ou exigences). Il s’agit pour toutes les parties
prenantes d’un projet informatique de s’accorder sur l’ensemble des besoins auxquels devra
répondre le système ou logiciel à construire. Le terme d’« ingénierie des besoins » ou
« ingénierie des exigences » (requirements engineering) caractérise toutes les activités liées
4 1 • Introduction
à la gestion des besoins, y compris celles qui se poursuivent tout au long du développement,
comme la gestion des évolutions des besoins et de leur traçabilité.
Le présent ouvrage est plus précisément centré sur les phases en amont du développement, à
savoir le recueil, l’analyse, la spécification, la revue et le classement par priorités des besoins,
qui précèdent la conception du logiciel. Cet ensemble d’activités est désigné dans la suite de
l’ouvrage par l’expression « analyse des besoins » ou encore plus simplement par le terme
« analyse ».
Il est important de ne pas confondre les termes qui caractérisent les différentes formes de
qualité. La signification des plus courants d’entre eux est rappelée dans le tableau suivant.
On résume parfois la variété de ce qui est attendu d’un logiciel par le sigle CQFD, pour
Coûts, Qualité, Fonctionnalités, Délais. Cette vision simplifiée est suffisante pour montrer les
tensions qui peuvent exister entre les principaux critères. Idéalement, il faudrait pouvoir faire
du logiciel « chic et pas cher » (F élevé et C faible), ce qui n’est pas simple, et de le faire
« vite et bien » (D faible et Q élevé), ce qui n’est également pas évident !
Comme cela a déjà été évoqué, tous ces critères sont bien entendu à pondérer en fonction du
type de logiciel à développer : du logiciel critique pour la sécurité (safety critical), dont les
défaillances peuvent avoir des conséquences désastreuses en termes humains, économiques
ou environnementaux, jusqu’au logiciel « jetable », beaucoup moins exigeant.
Une des toutes premières études, réalisée par les militaires du Department of Defense (DoD)
américain dans les années 1980, donnait des résultats absolument catastrophiques : succès
5 % (dont utilisation « tel que » 2 % et avec de faibles modifications 3 %), mitigé 19 %,
échec 76 % (dont jamais utilisé 47 % et non livré 29 %). Depuis, si on se base sur les études
annuelles du Standish Group, connues sous le nom de Chaos Report et résumées dans le
tableau suivant, les progrès semblent à la fois réels et assez lents.
2013. Son développement a été marqué par plusieurs crises, relances et réorientations entre
2001 et 2011, avant l’abandon final en raison de son incapacité à assurer son rôle de manière
fiable avec des dizaines de millions d’euros de moins-perçus et de trop-perçus dans les soldes
des militaires français. . .
Pour donner quelques ordres de grandeur à propos de la complexité des logiciels, on peut
indiquer qu’un compilateur simple correspond à 20 ou 30 KLS (milliers de lignes source), un
logiciel de modélisation 3D correspond à 200 KLS, le logiciel de contrôle d’un sous-marin
nucléaire exige 1 000 KLS et celui de la navette spatiale plus de 2 200 KLS. Soit un facteur
100 entre ces extrêmes.
– Le logiciel ne s’use pas et ne se répare pas. Il n’y a pas de pièces de rechange ! Par contre,
le logiciel peu devenir assez rapidement obsolète par rapport aux concurrents, par rapport
au contexte technique, par rapport aux logiciels qui l’entourent. Il s’agit d’un domaine en
évolution extrêmement rapide.
D’autres causes sont plus spécifiquement liées à la difficulté de comprendre les besoins des
clients et des utilisateurs. Elles sont extrêmement importantes et au cœur de la problématique
abordée dans cet ouvrage :
– La trop faible implication des clients et des utilisateurs dans les projets de développement
logiciel.
– La difficulté pour les clients à décrire leurs besoins de façon claire et exhaustive pour ceux
qui développent les applications.
– L’inévitable évolutivité des besoins, résultant par exemple des évolutions fréquentes dans
l’environnement des applications.
Enfin, d’autres causes plus générales résultent de la difficulté à gérer des projets et des
équipes, en particulier quand ils sont de grande taille, comme par exemple :
– la différence de langage et de culture entre les personnels techniques et non techniques,
– le renouvellement rapide du personnel (turnover),
– la difficulté à motiver les personnes sur le long terme, etc.
énoncé dans le célèbre ouvrage The mythical Man-Month de Frederick Brooks [Bro75]
est analysé en exercice à la fin du chapitre.
– Quantifié : Les projets sont pilotés sur la base d’indicateurs objectifs de qualité des produits
et des processus. Un processus formel de collecte des informations est en place.
– Optimisé : L’amélioration continue des processus devient une préoccupation centrale.
L’organisation se donne les moyens d’identifier et de mesurer les faiblesses de ses
processus. Une cellule de veille identifie puis met en œuvre les technologies innovantes et
les pratiques d’ingénierie logicielle les plus efficaces.
Ces niveaux constituent les étapes conduisant à des processus matures, c’est-à-dire conformes
aux meilleures pratiques observées à travers le monde dans les entreprises réputées bien gérer
leurs processus.
Chaque niveau de maturité, sauf le niveau initial, définit une liste de thèmes majeurs à
considérer.
– Au niveau piloté, on trouve la planification de projet, le suivi et la supervision de projet, la
gestion de la sous-traitance, l’assurance qualité, la gestion de configuration. Au cœur de la
thématique de cet ouvrage, on trouve aussi la gestion des exigences qui implique :
• la compréhension et la prise en compte des exigences par les développeurs,
• la gestion des évolutions des exigences et leur traçabilité,
• la conformité des produits du projet aux exigences.
• l’élucidation des souhaits et des besoins des clients et leur expression en exigences
client,
• la dérivation des exigences techniques sur l’application, ses composants et son interface,
• l’analyse et la validation des exigences.
Chaque thème majeur est décrit par un ensemble de bonnes pratiques qu’il convient d’adopter
si l’on veut satisfaire à ses exigences.
Pour passer d’un niveau de maturité à l’autre, il faut obtenir une certification d’un organisme
habilité par le SEI.
Peu d’entreprises françaises se sont engagées dans ce type de démarche de certification
spécifique au développement logiciel. Ont été citées les sociétés de service Atos Origin,
Axlog, Capgemini, Silogic, Sogeti, Steria et SQLI, en général aux niveaux 2 et 3. Beaucoup
d’entreprises du secteur préfèrent s’engager dans des certifications qualité plus généralistes
et moins lourdes, comme celles de la famille ISO 9000.
Exercices 11
EXERCICES
Avant-propos
1. L’échec
1. Description générale
2. Informations disponibles
3. Récupération des débris
4. Autres anomalies observées sans rapport avec l’accident
2. Analyse de l’échec
1. Séquence des événements techniques
2. Commentaires du scénario de défaillance
3. Procédures d’essai et de qualification
4. Autres faiblesses éventuelles des systèmes incriminés
3. Conclusions
1. Résultats de l’enquête
2. Cause de l’accident
4. Recommandations
(...)
2. ANALYSE DE LÉCHEC
2.1. SEQUENCE DES EVENEMENTS TECHNIQUES
De manière générale la chaîne de pilotage d’Ariane 5 repose sur un concept
standard. L’attitude du lanceur et ses mouvements sont mesurés par un
système de référence inertielle (SRI) dont le calculateur interne calcule
les angles et les vitesses sur la base d’informations provenant d’une
plate-forme inertielle à composants liés, avec gyrolasers et accéléromètres.
Les données du SRI sont transmises via le bus de données, au calculateur
embarqué (OBC) qui exécute le programme de vol et qui commande les tuyères
des étages d’accélération à poudre et du moteur cryotechnique Vulcain, par
l’intermédiaire de servovalves et de vérins hydrauliques.
Cet angle d’attaque avait pour origine le braquage en butée des tuyères
des moteurs à propergols solides et du moteur principal Vulcain; le
braquage des tuyères a été commandé par le logiciel du calculateur de
bord (OBC) agissant sur la base des données transmises par le système de
référence inertielle actif (SRI2). A cet instant, une partie de ces
données ne contenait pas des données du vol proprement dites mais
affichait un profil de bit spécifique de la panne du calculateur du
SRI2 qui a été interprété comme étant des données de vol.
La raison pour laquelle le SRI2 actif n’a pas transmis des données
d’attitude correctes tient au fait que l’unité avait déclaré une panne
due à une exception logicielle.
L’OBC n’a pas pu basculer sur le SRI1 de secours car cette unité avait
déjà cessé de fonctionner durant le précédent cycle de données (période
de 72 millisecondes) pour la même raison que le SRI2.
L’erreur s’est produite dans une partie du logiciel qui n’assure que
l’alignement de la plate-forme inertielle à composants liés. Ce module
Exercices 13
Les événements internes du SRI qui ont conduit à l’accident ont été
reproduits par simulation. En outre, les deux SRI ont été récupérés
pendant l’enquête de la Commission et le contexte de l’accident a été
déterminé avec précision à partir de la lecture des mémoires. De plus,
la Commission a examiné le code logiciel qui s’est avéré correspondre
au scénario de l’échec. Les résultats de ces examens sont exposés dans
le Rapport technique.
Matériel
14 1 • Introduction
Logiciel
Le développement logiciel
Chapitre 2
Quelle que soit la manière de développer du logiciel, un ensemble d’activités sont nécessaires
au cours du processus.
Les caractérisations et dénominations de ces activités ne sont pas normalisées, ou plus
exactement il existe une pléthore de normes produites par des organismes tels que
l’ISO (International Organization for Standardization), l’AFNOR (Association française
de normalisation), l’IEEE (Institute of Electrical and Electronics Engineers), le DoD
(Department of Defense) pour les applications militaires aux USA, ou l’ESA (European
Space Agency), chacune avec ses nuances propres.
Le statut de ces activités dans le processus de développement peut beaucoup varier. Dans
les processus classiques (en cascade ou en V, cf. paragraphe 4.1) certaines de ces activités
s’enchaînent logiquement et constituent des « stades du développement ». D’autres se
retrouvent incluses dans différents stades, comme la vérification, voire dans tous les stades,
comme la documentation. Dans les processus agiles (cf. paragraphe 4.4) certaines activités
sont entremêlées, comme le recueil des besoins et l’analyse et spécification des besoins,
car elles sont pratiquées par des équipes pluridisciplinaires mêlant clients et informaticiens.
Alors que dans les approches classiques, les client (MOA) et les informaticiens (MOE) les
réalisent séparément et successivement en s’échangeant des documents.
Ce chapitre décrit ces différentes activités en restant aussi indépendant que possible des
processus de développement. Celles qui relèvent de l’ingénierie des besoins en amont de
la conception, qui sont au cœur de l’ouvrage, sont présentées plus en détail que celles en aval
du développement.
18 Partie 1. Le développement logiciel
Sortie : Il n’y a de sortie matérialisée par un document que si l’activité de recueil constitue
une phase isolée. C’est le cas dans les processus classiques en cascade ou en V (cf. paragraphe
4.1), où l’activité de recueil des besoins est sous le contrôle de la maîtrise d’ouvrage (MOA),
bien séparée de la maîtrise d’œuvre (MOE). Le document d’expression des besoins (ou cahier
des charges client) assure l’interface entre MOA et MOE. Il constitue le point de départ de la
phase ultérieure d’analyse et spécification des besoins par la MOE.
Dans les approches agiles (cf. paragraphe 4.4), toute la réflexion sur les besoins est effectuée
au sein d’une équipe mixte MOA+MOE. Il n’y a pas nécessité de sortie formalisée à l’activité
de recueil. La compréhension partagée des besoins bruts résultant des discussions entre toutes
les parties prenantes permet d’enchaîner immédiatement la suite du processus.
Difficultés : « The hardest single part of building a software system is deciding precisely
what to build » (« La partie la plus difficile de la construction d’un logiciel consiste à définir
précisément quoi construire ») [Bro87].
Cela résulte entre autres choses :
– De problèmes de compréhension : les développeurs et le client ne parlent pas le même
langage. Les utilisateurs ne connaissent pas vraiment leurs besoins. Les développeurs
connaissent mal le domaine de l’application.
– De problèmes humains : conflits, rétention d’information, etc.
– De problèmes de volatilité des besoins.
20 Partie 1. Le développement logiciel
Les besoins bruts sont répertoriés de manière informelle (en langue naturelle) ou parfois
semi-formelle, sous une forme compréhensible par des non informaticiens. Dans la catégorie
semi-formelle, les arbres de buts décrits au paragraphe suivant, les textes structurés et les
scénarios sont souvent utilisés à ce stade. Le document d’expression des besoins peut inclure
également des ébauches ou maquettes des interfaces homme-machine (IHM) et un glossaire
pour fixer le vocabulaire du projet.
pour l’organisation, avec des fonctionnalités qui concrétisent réellement la satisfaction des
objectifs retenus.
Les buts aident à se focaliser sur l’essentiel et évitent de se perdre dans les détails. Ils
peuvent être exprimés à différents niveaux d’abstraction dans des arbres de décomposition
de buts (souvent des arbres ET/OU). Cette représentation permet de mettre en évidence des
alternatives et d’éventuelles contradictions entre buts.
Les besoins sont dérivés des buts. Contrairement aux buts qui sont des intentions générales,
les besoins sont soit des services qui doivent être offerts, soit des contraintes, soit des
exigences mesurables et testables.
Exemple
« L’application doit être facile à utiliser » est un but qui peut être raffiné en deux exigences
mesurables et vérifiables : « les utilisateurs doivent être capables d’utiliser les fonctions du
système après une formation de 3 heures » et « le nombre moyen d’erreurs faites par les
utilisateurs ne doit pas excéder 2 par jour ».
Une fois raffinés, les besoins doivent être vérifiés par relecture, revue ou inspection
(cf. paragraphe 2.9.4.) pour y détecter erreurs, incohérences et autres défauts, et validés par
la négociation, pour s’assurer que les parties prenantes les comprennent de la même façon et
les acceptent.
Sortie : Il n’y a de sortie matérialisée par un document que si l’activité d’analyse et de
spécification constitue une phase isolée. C’est le cas dans les processus classiques en cascade
ou en V (cf. paragraphe 4.1), où l’activité d’analyse et spécification est sous le contrôle de la
maîtrise d’œuvre (MOE), bien séparée de la maîtrise d’ouvrage (MOA). Dans les approches
objet, l’analyse se concrétise par des modèles de classes, d’états et d’interactions. L’ensemble
des modèles élaborés à ce stade s’intègre dans le dossier de spécification des besoins ou
cahier des charges (détaillé). Ce document permet à la MOA et à la MOE de s’accorder sur
les besoins ainsi documentés.
2 • Les activités du développement 23
Dans les approches agiles (cf. paragraphe 4.4), toute la réflexion sur les besoins est effectuée
au sein d’une équipe mixte MOA+MOE. La formalisation est beaucoup plus légère car le
processus menant à une compréhension partagée ne passe pas prioritairement par l’écrit.
1. Introduction
1.1. But du document
1.2. Portée de l’application : ce qu’elle fait et ne fait pas
1.3. Définitions, acronymes et abréviations (vocabulaire du projet)
1.4. Références (documents utilisés)
1.5. Vue d’ensemble du document
2. Description générale
2.1. Perspective de l’application
Environnement dans lequel s’inscrit le projet (stratégie, enjeux,
domaine, etc.)
Caractéristiques : autonome ou embarqué, avec quels composants,
interfaces matérielles, logicielles, utilisateur, etc.
2.2. Fonctions de l’application
Spécification détaillée des besoins fonctionnels (textuelle et
éventuellement semi formelle)
2.3. Caractéristiques de l’utilisateur
Expérience, expertise technique, niveau de formation, etc.
2.4. Contraintes
Tous les éléments qui risquent de limiter les options offertes
au concepteur (contraintes de développement, structurelles,
de performances, de sécurité, méthodologiques, etc.) .
2.5. Hypothèses et dépendances
Par exemple, système d’exploitation, matériel, etc.
3. Besoins spécifiques
Interfaces externes, modes de fonctionnement, gestion des données,
conformité à des standards, exigences qualitatives, etc.
4. Annexes (par exemple, les modèles construits pour la compréhension
du domaine, des processus et de l’application).
5. Table des matières
6. Index
Dans le document de spécification des besoins, ceux-ci sont souvent classés en catégories
d’importance. Par exemple la technique de hiérarchisation des besoins MoSCoW définit
quatre classes repérées par les lettres M,S,C,W :
– M comme Must : besoin essentiel et incontournable.
– S comme Should : besoin important, mais qui pourrait éventuellement être satisfait
autrement.
– C comme Could : besoin optionnel, à satisfaire seulement si on a le temps.
– W comme Won’t : besoin non nécessaire maintenant mais qui pourrait éventuellement être
considéré plus tard.
Les besoins peuvent aussi être classés selon leur stabilité prévisible dans le temps, comme
« immuable », « plutôt stable », « plutôt volatil ».
b) Semi-formelle
Une première possibilité est le langage naturel structuré, comme les user stories et les cas
d’utilisation qui seront étudiés en détail aux chapitres 10 et 11. La rédaction est guidée par
un modèle de description avec des règles de rédaction précises et documentées.
On peut aussi recourir pour certains aspects à du pseudocode, c’est-à-dire à une description
algorithmique de l’exécution d’une tâche, ce qui donne une vision plus opérationnelle du
système.
Les langages visuels (graphiques) sont aussi très populaires. La spécification utilise différents
diagrammes, accompagnés de texte structuré ou non. C’est l’approche retenue par UML avec
les cas d’utilisation, les diagrammes de cas et les diagrammes complémentaires, structurels et
comportementaux, qui seront présentés dans la suite de cet ouvrage. Les notations visuelles
sont intuitives, faciles à apprendre et à utiliser. Par contre, elles conservent souvent une
certaine dose d’imprécision et se prêtent mal aux analyses automatiques.
c) Formelle
La spécification exploite un formalisme mathématique, comme des langages logiques ou
des modèles formels de comportement. Les descriptions sont analysables automatiquement
et peuvent être utilisées pour automatiser la vérification et le test du logiciel. Par contre,
l’apprentissage et la maîtrise de ces approches sont difficiles.
2 • Les activités du développement 25
En pratique, l’utilisation des langages formels apparaît se limiter aux logiciels critiques (en
avionique, espace, santé, nucléaire, etc.) ou aux parties critiques de certains gros logiciels.
d) Qualités recherchées
Quelle que soit la forme retenue, on cherche toujours à éviter au maximum le bruit (éléments
inutiles qui empêchent de saisir l’essentiel), le silence (absence d’information sur une
caractéristique du problème), la sur-spécification (introduction d’éléments de la solution),
les contradictions, les ambiguïtés, les références avant (utilisation d’une information qui est
définie ultérieurement) et les vœux pieux (souhaits irréalisables) [Mey85].
Plusieurs approches ont été suggérées pour déterminer les classes du domaine :
– identifier les noms et groupes nominaux des descriptions textuelles du domaine,
– réutiliser et adapter des modèles existants ou « patrons d’analyse » (analysis patterns),
– utiliser des listes types de classes d’objets conceptuelles.
Ces approches seront présentées en détail au chapitre 8.
Il est souvent difficile de construire du premier jet un modèle de classes du domaine
« satisfaisant » et « complet ». Une tel modèle se construit le plus souvent en plusieurs
itérations, en approfondissant progressivement la connaissance du domaine en lien avec les
« experts » de ce domaine.
b) Modèle de l’application
Le modèle (conceptuel) d’une application décrit l’organisation générale de cette application
telle qu’elle est perçue par ses utilisateurs.
Il s’exprime par un diagramme de classes qui ajoute aux classes du domaine retenues pour
l’application, les principaux « artefacts » visibles par les utilisateurs et approuvés par eux (à
l’exclusion des artefacts d’implantation). On parle souvent de « classes frontière » (boundary
classes) et de « classes contrôleur ». Dans un tel modèle, les principales opérations de chaque
classe sont spécifiées.
a) Patron de conception
La description d’un patron de conception comporte le plus souvent : son nom, le problème
à résoudre (le contexte), la solution sous la forme d’une certaine configuration de classes et
d’interfaces, les forces (avantages) de cette solution.
Les noms des patrons constituent une sorte de « langage commun » entre les concepteurs et
avec les programmeurs.
Quand l’observé change d’état, les observateurs qui se sont enregistrés auprès de lui via la
méthode ajoute sont notifiés par notifie. Ils se mettent à jour (méthode miseAJour)
en récupérant l’état de l’observé par getEtat.
28 Partie 1. Le développement logiciel
b) Patron d’analyse
Un patron d’analyse est défini par Martin Fowler comme une « idée qui a été utile dans
un certain contexte d’application et qui sera probablement utile dans d’autres » [Fow97]. Il
précise que ces patrons reflètent des structures conceptuelles liées aux aspects fonctionnels
plutôt qu’aux implantations logicielles.
Les patrons d’analyse permettent de répondre à des questions telles que : Comment
représenter une quantité ? Une mesure ? Une organisation ? Une tâche à accomplir ? Une
période ? Etc.
Exemple : Le patron Event analysis montre comment capturer la mémoire de quelque chose
d’intéressant, appelé « événement », qui affecte le domaine considéré.
2.4 L’IMPLANTATION
Le stade de l’implantation de l’application qui fait suite logiquement à sa conception,
comprend d’abord le codage dans le(s) langage(s) cible(s) de l’ensemble des fonctionnalités
qui doivent être incluses dans la livraison (release). La livraison peut correspondre à un
sous-ensemble du système ou au système complet selon le processus de développement
suivi. Le codage est le plus souvent manuel avec quelques éléments qui peuvent être générés
à partir des modèles de conception.
Les différents composants doivent ensuite être testés isolément (tests unitaires). Puis leur
assemblage doit être progressivement testé (tests d’intégration), jusqu’au test de la livraison
complète (tests de validation ou tests système). Enfin, l’application peut être fournie en « bêta
test » à quelques utilisateurs avant son déploiement effectif.
L’équipe de développement doit également produire toutes les informations et documents
utiles au déploiement et à l’exploitation de l’application, comme les manuels utilisateurs, le
« paquet d’installation », les guides d’installation, etc. Tous ces éléments doivent également
être soigneusement vérifiés.
2.5 LE DÉPLOIEMENT
Le stade du déploiement de l’application fait suite logiquement à son implantation. Chaque
déploiement recouvre un ensemble d’activités comme la livraison sur les sites concernés,
l’installation (manuelle ou automatisée), la configuration, la mise en pré-production puis en
production et la formation des utilisateurs.
2 • Les activités du développement 29
Une organisation pour la remontée des questions, problèmes et suggestions doit également
être mise en place.
Il est important que les utilisateurs soient très précisément informés de ce qui est déployé
et des limitations existantes de la livraison, pour éviter des attentes inconsidérées et des
déceptions de leur part. Il est peu recommandé de déployer une livraison insuffisamment
testée qui risque de traumatiser durablement les utilisateurs.
2.6 LA MAINTENANCE
Le stade de la maintenance débute dès que l’application est déployée. Elle prend trois formes
principales :
– La maintenance corrective correspond à l’identification et la correction des erreurs
détectées pendant le fonctionnement de l’application.
– La maintenance perfective correspond à l’amélioration des performances ou de la
maintenabilité et à l’ajout de fonctionnalités.
– La maintenance adaptative correspond à l’adaptation du logiciel aux changements de son
environnement : modifications des règles métier, modifications des formats des données,
modifications de l’environnement d’exécution, etc.
Concrètement, il s’agit avant tout de gérer le flux des remontées d’information en provenance
des utilisateurs. Il peut s’agir :
– de rapports d’anomalie (bug reports),
– de demandes de modification (change requests),
– de demandes d’extension (feature requests).
Ces demandes doivent être analysées et triées, puis planifiées et traitées quand elles le
méritent. De nombreux outils existent pour faciliter cette gestion, comme Bugzilla, Jira,
Trac, etc.
En général, le flux des remontées s’accroît progressivement avec le temps. Finalement, devant
l’importance de l’effort et du budget de maintenance, qui représente couramment 60 à 70 %
du budget alloué au logiciel, la nécessité de refondre (reengineering) ou de renouveler les
applications finit par s’imposer.
Plus globalement, la gestion du parc applicatif peut impliquer l’utilisation de techniques :
– d’inventaire et de cartographie du parc (ou plus ambitieusement « d’urbanisation du
système d’information »),
– de restructuration automatique des codes et des données,
– d’ingénierie de rétro-conception (reverse engineering) qui consiste à analyser les
codes sources pour créer automatiquement des représentations à un plus haut niveau
d’abstraction facilitant leur compréhension,
– d’ingénierie de (re)construction (forward engineering) pour produire une nouvelle
application à partir d’une ancienne.
30 Partie 1. Le développement logiciel
La vérification a des limites pratiques sur lesquelles on reviendra et des limites théoriques,
liées à l’indécidabilité algorithmique. Par exemple, aucun algorithme ne peut prouver :
– qu’un programme est une implantation correcte de sa spécification,
– qu’un programme se termine,
– que deux programmes calculent la même chose.
2.7.2. La validation
La validation vise à montrer que l’application, et en particulier sa spécification, satisfait les
besoins du client. Au contraire de la vérification, c’est un processus « externe », conduit avec
les clients, et plutôt « subjectif » (cf. figure 2.5).
2 • Les activités du développement 31
a) Définition
« Tester, c’est exécuter un programme dans l’intention d’y trouver des anomalies ou des
défauts » [Mye79].
En toute rigueur, les termes « erreur », « défaut » et « anomalie » devraient être distingués.
L’erreur est effectuée par le concepteur ou le programmeur. Elle se matérialise par un défaut
dans le code qui produit une anomalie lors de l’exécution, c’est-à-dire une différence entre le
comportement observé et le comportement attendu.
b) Limites
Le test est une méthode de vérification partielle : « Tester permet seulement de révéler la
présence d’erreurs mais jamais leur absence » [Dij72]. En effet, le test est un processus fini
alors que le nombre d’exécutions possibles d’un programme est potentiellement infini. Il faut
faire face à l’explosion combinatoire des cas à tester. On y parvient grâce à des heuristiques de
choix des données de test, comme l’analyse partitionnelle en classes d’équivalence, les tests
aux limites des différentes classes, les approches combinatoires qui garantissent que chaque
couple de deux valeurs est testé au moins une fois (pairwise testing), les tests aléatoires, etc.
c) Classification
Il existe trois axes principaux de classification des tests, comme le montre la figure suivante.
On peut tout d’abord classer les tests selon leur position dans le cycle de vie : tests
unitaires, tests d’intégration, tests système, tests d’acceptation et tests de non-régression
après modification (cf. paragraphe 4.1.2.).
On peut ensuite classer les tests selon l’objectif de qualité visé : tests de conformité aux
fonctionnalités attendues, tests de robustesse en cas d’utilisations imprévues, tests de sécurité
en cas d’attaques, tests de performance, etc.
On peut enfin distinguer les tests fonctionnels de type « boîte noire » et les tests structurels
de type « boîte blanche ». Les premiers ne nécessitent pas de connaître la structure interne
de l’application. Ils permettent d’assurer la cohérence entre spécification et code, mais
sont aveugles aux défauts fins de programmation. Les seconds se fondent sur la structure
interne de l’application, souvent représentée de manière abstraite sous la forme d’un graphe.
Ils sont adaptés à la recherche des défauts fins de programmation, mais sont aveugle aux
fonctionnalités absentes. Les deux types sont donc tout à fait complémentaires.
2 • Les activités du développement 33
2.8 LA DOCUMENTATION
La documentation est une activité présente à tous les stades qui cible aussi bien les
développeurs que les clients et les utilisateurs.
La documentation technique à destination de l’équipe de développement est le moyen de
créer une base commune de référence qui évite par exemple la perte d’informations lors du
départ d’un développeur et facilite l’intégration de nouveaux développeurs. Elle comprend
les modèles d’analyse et de conception, la documentation du code – algorithmes, interfaces
de programmation (API), maquettes, prototypes –, les jeux de tests, etc.
Il a parfois été préconisé d’aller plus loin en répertoriant tous les choix faits à chaque stade
du développement, avec un objectif de traçabilité. Chaque choix est relié à ceux qui l’ont
précédé et dont il dérive. On parle de « logique de conception » ou design rationale. C’est
une approche ambitieuse et lourde à mettre en œuvre.
La qualité de la documentation technique dépend à sa création des revues qui en sont faites,
puis du système de mise à jour qui doit permettre de la garder en conformité avec les
évolutions du logiciel. À noter que dans les approches agiles, il est souvent affirmé que
le code lui-même, abondamment commenté, et les jeux de tests constituent la meilleure
documentation technique et la seule qui a une chance de rester toujours à jour.
Pour les clients, la documentation permet de donner une certaine compréhension de l’état
d’avancement du projet de développement.
Pour les utilisateurs, la documentation finale doit inclure les manuels d’utilisation et les
aides en ligne. Les utilisateurs, ou le plus souvent certains d’entre eux, peuvent fortement
contribuer à conserver la documentation à jour en remontant tous les problèmes qu’ils y
détectent.
1. Non répétitif.
34 Partie 1. Le développement logiciel
La racine de l’arbre est le projet tout entier et les feuilles sont les tâches considérées comme
élémentaires, c’est-à-dire bien définies et donc faciles à gérer : entrées et résultat (livrable)
clairement identifiés, responsabilité confiée à des acteurs précis, ressources nécessaires
connues, durée et coût évaluables.
La WBS facilite la préparation du graphe PERT pour l’ordonnancement des tâches ainsi que
la préparation du budget et la définition des missions confiées à chaque acteur.
® Le graphe PERT
Le graphe PERT (Program Evaluation and Review Technique) permet d’évaluer la durée
totale d’un projet et de détecter les tâches critiques ne supportant aucun retard.
Le point de départ de sa construction est la liste de toutes les tâches, avec pour chacune sa
durée et la liste des tâches antérieures.
Exemple
Le graphe PERT décrit les contraintes d’antériorité entre tâches. Les tâches constituent les
arcs du graphe et les états d’avancement du projet, les sommets 2 . Les arcs sont orientés de
l’état de début vers l’état de fin de la tâche et étiquetés par les durées des tâches. Les numéros
des sommets sont conformes à l’ordre de succession des états.
Pour concevoir le graphe PERT, on classe les tâches par niveaux :
2. Il existe d’autres méthodes, comme la méthode des potentiels, où les tâches sont les sommets et les arcs sont
les dépendances.
36 Partie 1. Le développement logiciel
On construit le graphe en intégrant les tâches par niveaux croissants et en respectant toutes les
contraintes d’antériorité. Pour exprimer certaines contraintes d’antériorité, il faut introduire
des tâches fictives de durée nulle (figurées en pointillés sur le dessin du graphe ci-dessous).
Il faut essayer d’en limiter le nombre au maximum.
Exemple
Le tableau précédent définit quatre niveaux de tâches : A et B sont au niveau 0, C et D au
niveau 1, E et F au niveau 2 et G au niveau 3. À partir de ces niveaux, on peut construire le
graphe de la figure 2.9 qui respecte toutes les contraintes d’antériorité avec une seule tâche
fictive.
La date au plus tôt de l’étape i (ti ) représente le temps minimum pour l’atteindre. Elle se
détermine de proche en proche, par ordre de sommet croissant, à partir de l’entrée du graphe,
par : t1 = 0 et tj = max(ti + dij ) pour tous les i précédant j, où dij est la durée de la tâche
ij.
Exemple
t1 = 0, t2 = 0 + 6 = 6, t3 = 0 + 5 = 5, t4 = 6 + 4 = 10, t5 = max(6 + 0, 5 + 6) = 11,
t6 = max(11 + 6, 10 + 5) = 17, t7 = 17 + 4 = 21.
2 • Les activités du développement 37
La date au plus tard de l’étape i (Ti ) représente le temps maximum pour l’atteindre sans
augmenter la durée totale du projet. Elle se détermine de proche en proche, à partir de la
sortie (n) du graphe, par : Tn = tn et Ti = min(Tj − dij ) pour tous les j suivant i.
Exemple
T7 = 21, T6 = 21 − 4 = 17, T5 = 17 − 6 = 11, T4 = 17 − 5 = 12, T3 = 11 − 6 = 5,
T2 = min(11 − 0, 12 − 4) = 8, T1 = min(8 − 6, 5 − 5) = 0.
On a toujours t1 = T1 = 0 et t T pour tout sommet. La marge totale d’une tâche (M T )
représente le retard maximal qu’on peut prendre dans sa réalisation sans retarder l’ensemble
du projet. Elle vaut : M Tij = Tj − ti − dij .
Exemple
Calcul des marges totales du graphe précédent :
Les tâches critiques sont celles dont la marge totale est nulle. Il existe toujours un chemin
critique allant de l’entrée à la sortie et composé uniquement de tâches critiques. Il est
représenté en traits épais dans le dessin de la figure 2.9.
® Le diagramme de Gantt
Le diagramme de Gantt est un outil de planification où chaque tâche est représentée par une
ligne. Les colonnes représentent les jours, semaines ou mois du calendrier selon la durée du
projet.
Le temps estimé pour une tâche se modélise par une barre horizontale dont l’extrémité gauche
est positionnée sur la date prévue de démarrage et l’extrémité droite sur la date prévue de fin
de réalisation. Les tâches peuvent s’enchaîner séquentiellement ou bien être exécutées en
parallèle. Il est possible de faire apparaître aussi sur le diagramme de Gantt les ressources,
humaines ou matérielles, afin de faciliter l’estimation des besoins et des coûts.
On note dans cet exemple une identification classique des composants par un numéro
de version (correspondant à une refonte ou extension majeure), un numéro de révision
(correspondant à une amélioration des performances, de la présentation ou un ajout de
fonctionnalité mineure) et un numéro de correction (correspondant à la correction d’une ou
plusieurs erreurs).
c) La (re)construction du système
Une configuration cohérente du système complet est reconstruite à partir des composants
versionnés.
d) La traçabilité et l’information
La traçabilité implique l’historisation des composants et des processus de changement.
L’information inclut statistiques, rapports d’avancement, requêtes, etc.
® Contrôle qualité
Le contrôle qualité est l’ensemble de toutes les actions qui permettent d’assurer que les
artefacts du développement satisfont leurs critères de qualité. Ces actions se pratiquent tout
au long du développement. Pour les codes, on peut pratiquer des contrôles statiques, c’est-
à-dire sans exécution, comme les relectures (revues et inspections), les analyses de code,
les preuves formelles, etc., ainsi que des contrôles dynamiques, c’est-à-dire en exécutant les
codes, comme les tests ou le prototypage. Pour les autres artefacts, on peut pratiquer des
relectures, des vérifications de modèle (model checking), etc.
® Assurance qualité
L’assurance qualité recouvre la mise en place et la gestion de l’infrastructure qui englobe tous
les moyens permettant de produire du logiciel de qualité : méthodes, outils, gestion de projet,
contrôle qualité, etc. Ces moyens sont décrits dans le plan d’assurance qualité.
Les gestionnaires et les techniciens doivent recevoir toutes les informations nécessaires pour
établir leur confiance dans la qualité du logiciel produit.
b) Les relectures
On distingue toute une série de techniques apparentées :
– l’autocorrection ou relecture personnelle, considérée comme de faible efficacité, car il est
toujours difficile de trouver ses propres erreurs,
– la relecture croisée avec un collègue, déjà plus efficace, surtout quand elle est systématisée
comme dans la pratique du développement en binôme des approches agiles,
– la revue informelle (walkthrough) où un lecteur résume paragraphe par paragraphe le
document qui est discuté informellement par le groupe de revue, considérée comme
d’efficacité moyenne,
– la revue structurée autour d’une check-list de défauts et d’un secrétaire qui dirige les
débats, considérée comme plus efficace,
2 • Les activités du développement 41
– l’inspection, plus lourde à mettre en œuvre mais qui présente la meilleure efficacité. Le
travail s’organise selon le processus suivant qui est planifié :
1. Préparation :
- recherche des défauts selon une check-list par des inspecteurs,
- rédaction d’un rapport de défauts basé sur un formulaire type.
2. Réunions avec un modérateur, les inspecteurs, un secrétaire pour noter
les décisions et l’auteur du document pour répondre aux questions :
- examen des défauts,
- prise de décision.
3. Suivi :
- vérification des corrections ou nouvelle inspection.
En termes d’efforts, il faut remarquer que le codage ne représente qu’un pourcentage assez
faible de l’effort total (de l’ordre de 20 %).
En termes d’erreurs et de coûts, on peut souligner que plus de la moitié des erreurs peut être
attribué à des déficiences dans la spécification des besoins. Ces erreurs génèrent plus de 80 %
du coût de maintenance ! L’ingénierie des besoins constitue donc bien un enjeu majeur pour
le développement du logiciel.
42 Exercices
EXERCICES
La modélisation – UML
Un objet regroupe données et fonctions. L’état du système est distribué entre tous les objets.
Cette approche présente des avantages dus à la modularité et la réutilisabilité des objets. Elle
est bien adaptée aux processus de développement itératifs et incrémentaux.
Le paragraphe suivant donne de courtes définitions des principaux concepts de l’orientation
objet. Le lecteur trouvera dans le volume dédié à la conception [Lon14] un chapitre beaucoup
plus étoffé sur ces concepts en lien avec la programmation Java.
qu’une classe conceptuelle (« métier ») et moins de détails qu’une classe qui documente
un code. Par exemple, les classes conceptuelles ne portent pas d’opérations, les classes de
conception précisent les noms des principales opérations, les classes qui documentent le code
donnent les profils détaillés des opérations avec les types de leurs paramètres.
a) « UML as sketch »
Dans les approches agiles qui seront détaillées dans les deux chapitres suivants, c’est
l’aspect découverte qui est mis en avant, avec une utilisation d’UML en mode « esquisse »
(sketch), c’est-à-dire sans trop de détails, centrée sur les seuls aspects difficiles et conduite
en collaboration autour d’un tableau blanc, plutôt qu’avec un environnement de modélisation
sophistiqué.
b) « UML as blueprint »
Dans les approches classiques (prescriptives) qui seront également évoquées au chapitre
suivant, c’est l’aspect modélisation systématique qui est mis en avant. L’analyse produit des
modèles pour mieux comprendre le problème et la conception produit des modèles pour
mieux implanter le système. Ces derniers modèles sont progressivement détaillés jusqu’à
ce que les codeurs n’aient plus que des décisions de détail à prendre. Des squelettes de
programmes peuvent être générés. Les modèles peuvent aussi pour partie être reconstruits
à partir du code (reverse engineering).
Dans ce mode, les environnements de modélisation (CASE tools) sont préconisés.
1. Les diagrammes de l’ouvrage ont été générés avec le logiciel libre PlantUML (plantuml.sourceforge.net).
52 Partie 1. Le développement logiciel
EXERCICES
– début, au démarrage du thread (start en Java, execlv en Unix, etc.). Avant la réception
de début, le thread est non_démarré.
– ressource_attendue, correspond à l’indication qu’une ressource applicative requise
n’est pas disponible.
– ressource_OK, correspond à la libération d’une ressource applicative par un autre
thread et à sa réservation.
– processeur_OK, correspond à la libération du processeur par un autre thread et à son
utilisation.
– fin correspond soit à l’exécution de la dernière instruction du programme exécuté par le
thread soit à la réception d’un événement pour tuer définitivement le thread. Sur réception
de fin, le thread devient terminé.
Comme pour toutes les fabrications, il est important d’avoir un processus bien défini et
documenté. Dans le cas du logiciel, il s’agit d’un type de fabrication un peu particulier, en un
seul exemplaire, car la production en série est triviale par simple recopie.
Ce processus de fabrication du logiciel, dont les principales déclinaisons vont être détaillées
dans les paragraphes qui suivent, est toujours accompagné d’un processus de gestion de projet
(estimation, planification, suivi, etc.) et d’un processus qualité (mesure, contrôle qualité,
documentation, etc.).
Les modèles de développement ou modèles de cycle de vie décrivent à un niveau très abstrait
et idéalisé les différentes manières d’organiser la production du logiciel. Les étapes, leur
ordonnancement, et parfois les critères pour passer d’une étape à une autre sont explicités :
critères de terminaison d’une étape, critères de choix de l’étape suivante, critères de
démarrage d’une étape.
Dans cette approche proposée en 1970 par Winston Royce [Roy70] et héritée des méthodes
classiques d’ingénierie, chaque étape doit être terminée avant que ne commence la suivante.
À chaque étape, il y a production d’un « livrable » (deliverable) qui sert de base pour l’étape
suivante. La découverte d’une erreur entraîne le retour à la phase à l’origine de l’erreur et une
nouvelle cascade avec de nouveaux livrables. Les coûts de correction des erreurs sont donc
importants. Il faut si possible « tout bien faire » dès le début.
Par contre, l’approche est simple à comprendre et à utiliser. Elle facilite l’organisation du
travail et des équipes dans les grands projets, en proposant des moments clés où des revues
peuvent prendre place. Elle simplifie la gestion du projet et l’assurance qualité.
Cette approche est peu adaptée si les besoins du client sont changeants ou difficiles à
déterminer au départ. Elle reste utilisée pour de gros projets, dans des domaines et avec
des technologies bien connus et maîtrisés par les équipes de développement. Elle convient
également pour la construction d’une nouvelle version d’un logiciel existant ou son portage
vers une nouvelle plateforme.
4 • Les modèles de développement 59
4.1.2. Le modèle en V
Il s’agit d’une variante du modèle de la cascade qui met en évidence la complémentarité des
phases menant à la réalisation et des phases de test permettant de la valider. Les tests sont
préparés tout au long des phases menant à la réalisation et exécutés en fin de processus.
Le modèle en V, calqué sur la production industrielle classique, met clairement en évidence
les différents niveaux de test :
– test unitaire : test de chaque composant de l’application pris isolément,
– test d’intégration : test des interactions entre les composants de l’application,
– test de validation (test système) : validation par les développeurs du système complet par
rapport à son cahier des charges,
– test d’acceptation (recette) : validation par le client du système complet par rapport aux
besoins des utilisateurs.
Les inconvénients sont similaires à ceux évoqués pour la cascade. Les avantages reconnus
sont de placer la vérification et la validation au centre des préoccupations dès les premiers
stades du développement et d’imposer l’idée de livrable évaluable. L’approche convient bien
aux projets classiques qui mettent la fiabilité au cœur de leurs préoccupations.
4.1.3. Le modèle en Y
Il s’agit d’une autre variante du modèle de la cascade qui distingue initialement une branche
fonctionnelle et une branche technique afin de paralléliser la résolution des questions
correspondantes [RV04].
Le modèle en Y est adapté aux projets technologiquement innovants car il permet de lever au
plus tôt les incertitudes liées aux technologies à mettre en œuvre.
60 Partie 1. Le développement logiciel
4.1.4. Discussion
Toutes les approches linéaires supposent qu’il est possible de spécifier correctement et
exhaustivement les besoins en début de processus et que ces besoins restent stables tout au
long du processus de développement.
Les erreurs d’analyse, de conception ou de codage sont découvertes tardivement au terme
d’un long processus (« effet tunnel »).
Il existe en outre des risques de « paralysie par l’analyse », car potentiellement une analyse
n’est jamais finie, de démotivation à cause de la durée et d’effet « big bang », c’est-à-dire de
résolution en une fois et très tardivement des principaux risques.
4.3.1. Définition
Dans ces approches le logiciel est développé en plusieurs itérations. Cela revient à répéter des
mini-processus de développement, plus ou moins complets. Chaque itération correspond au
raffinement d’un développement précédent ou à l’ajout d’un incrément supplémentaire (d’où
l’expression « itératif et incrémental »). C’est intéressant pour les projets de grande taille, car
on peut obtenir rapidement un logiciel fonctionnel offrant les fonctionnalités de base.
Dans l’approche la plus classique, le logiciel est spécifié et conçu dans son ensemble. C’est
la conception détaillée et la réalisation (codage, tests unitaires, intégration à ce qui a déjà été
développé, livraison) qui se font par itérations successives (cf. figure 4.5).
Les avantages sont de permettre de développer en premier les fonctions primordiales ou les
plus risquées. Les clients peuvent réagir après chaque itération. On peut aussi obtenir une
meilleure motivation de l’équipe de développement qui voit se concrétiser plus rapidement
ses efforts. Les autres difficultés, comme la nécessité de recueillir dès le départ et de figer les
besoins, demeurent.
Dans d’autres approches, les itérations incluent l’analyse et la spécification des besoins, ce
qui exclut la possibilité d’une conception globale a priori (cf. figure 4.6).
Les avantages principaux sont d’avoir un recueil des besoins continu et évolutif, une détection
précoce des erreurs, une implication continue des clients/utilisateurs. Les inconvénients
majeurs sont liés à la difficulté de gérer les besoins (« explosion des besoins ») et à la
difficulté de définir les incréments. Une direction rigoureuse est nécessaire pour ne pas
retomber dans les errements du code and fix.
62 Partie 1. Le développement logiciel
Chaque itération (ou cycle de la spirale) correspond à une séquence de quatre phases :
(1) La détermination des objectifs et des alternatives possibles pour les atteindre (comme
développer, réutiliser, acheter, sous-traiter, etc.) et des contraintes (temps, coûts). Ces
analyses se fondent sur les résultats des itérations précédentes ou initialement sur
l’analyse préliminaire des besoins.
(2) L’identification des risques et l’évaluation des alternatives pour les résoudre, par
exemple par du prototypage.
(3) Le développement et la vérification de la solution retenue, par un modèle de procédé à
définir (cascade, en V, etc.).
(4) La revue des résultats et la planification du cycle suivant.
Ce type d’approche convient pour de grands projets complexes, plutôt innovants et risqués.
est rationalisé, contractualisé et en conséquence rigidifié, une part importante de l’effort n’est
pas directement dirigée vers le produit logiciel lui-même.
Au contraire, les approches agiles cherchent à alléger le cadre (« trop de méthode tue la
méthode ») et à rester le plus possible focalisées sur le code. Un objectif central est de
répondre rapidement et de manière souple à tous les changements qui peuvent apparaître à
tout instant. Les approches agiles visent la simplicité, la légèreté, l’auto-adaptation et l’auto-
organisation. Contrairement aux approches prescriptives qui définissent des ensembles de
règles, les approches agiles sont plutôt à base de principes.
Plus concrètement, les approches agiles sont des approches itératives à planification
souple et itérations très courtes. Certains les caractérisent également comme une réaction
à la spécification ou à la documentation « à outrance ». En effet, maintenir à jour une
documentation pléthorique consomme énormément de ressources et ne pas la maintenir à
jour la rend inutile, voire dangereuse. Dans les approches agiles, peu de documents sont
élaborés, le code et les tests constituant les sources de documentation primordiales.
Ces approches se sont développées en même temps que les applications web, pour lesquelles
elles sont très bien adaptées. Elles conviennent bien aussi aux applications de gestion de
taille raisonnable. Elles sont moins adaptées pour les systèmes qui nécessitent des analyses
de pré-développement poussées, comme les systèmes critiques, ou les systèmes développés
par plusieurs équipes géographiquement distribuées. Enfin, elles rendent beaucoup plus
difficiles les négociations commerciales client-fournisseur traditionnellement assises sur une
planification globale du processus de développement.
– Le travail partiellement fait : c’est du stock qui ne rapporte rien, qui rend moins réactif
et qui doit donc absolument être réduit.
– Les processus inutiles : chaque processus ou action engagée doit être source de valeur
pour le client.
– L’excès de fonctionnalités : le développement de fonctions non attendues, non utilisées
est le plus gros gaspillage.
– Le passage d’une tâche à une autre : crée une surcharge cognitive et du temps gaspillé.
– Les attentes, comme celles des réponses aux demandes ou les temps d’accès aux
clients.
– Les défauts, qui constituent aussi, dans l’esprit lean, des stocks à éliminer.
(2) Améliorer l’apprentissage : devenir une entreprise apprenante, qui apprend de ses erreurs.
Le feedback est essentiel et doit se pratiquer à tous les niveaux.
(3) Décider aussi tard que possible, pour être toujours en mesure de répondre efficacement
au changement, et pour préserver sa capacité à agir.
(4) Livrer aussi vite que possible : il est préférable de mettre tout de suite sur le marché, une
bonne solution perfectible (une version beta) plutôt que la meilleure solution, un an plus
tard.
(5) Donner le pouvoir à l’équipe : les personnes savent travailler, il faut chercher avant
tout à changer l’environnement qui les contraint. Il faut faire confiance à l’intelligence
collective.
(6) Intégrer la qualité dès la conception : la qualité est le fil rouge, construite et améliorée sans
cesse. Elle pousse à se soucier des utilisateurs et des usages et à rechercher un feedback
permanent.
(7) Optimiser le système dans sa globalité (system thinking).
Il est très difficile de différencier développement lean et développement agile : « You can’t
really talk about them being alternatives, if you are doing agile you are doing lean and vice-
versa » (« On ne peut pas les considérer comme des alternatives, si on fait du lean on fait de
l’agile et réciproquement ») [Fow08]).
Le développement lean n’est pas un processus établi, comme Scrum ou XP, les deux
approches agiles les plus connues, qui seront détaillées au chapitre suivant. C’est un
ensemble de principes compatibles avec toutes les approches agiles.
b) Le concept de kanban
Un kanban est une petite fiche cartonnée qui accompagne les produits dans le système de
production de Toyota.
Ces fiches permettent un contrôle de production décentralisé de type « tirer » (pull). Cela
signifie que le processus de production amont est piloté par le processus de production aval
via les fiches kanban : il n’y a production en amont que s’il y a consommation en aval avec
échange de la fiche kanban quand le produit est consommé. C’est l’aval qui tire l’amont
4 • Les modèles de développement 67
et l’ensemble découle de la demande des clients. On obtient ainsi des flux tendus avec un
minimum de stocks intermédiaires.
En développement agile les « fiches kanban » (des Post-it associés aux tâches) sont affichées
sur les murs de la salle de projet (war room). Le statut des tâches s’exprime par la colonne
dans laquelle la fiche est placée, le plus souvent trois colonnes « à faire », « en cours » et
« terminé ». Ce « tableau kanban » permet à toute l’équipe de développement de partager
visuellement la situation et de limiter au mieux le stock des tâches en cours de production.
On peut dire que le processus est de type « tirer », car tout part des clients et de leurs besoins
déclinés en tâches.
model-checking) peuvent être utilisées pour prouver que ces assertions seront satisfaites par
toute exécution du système.
L’intérêt des approches formelles est :
– d’apporter une sémantique claire et surtout non ambiguë,
– de produire des descriptions concises et précises,
– de proposer des abstractions de haut niveau,
– de permettre des manipulations automatiques.
L’impact des approches formelles reste cependant encore très limité malgré quelques
réalisations notables, comme le développement du logiciel de contrôle de la ligne de métro
14 de la RATP, la seule exploitée de manière complètement automatique, spécifiée avec la
méthode B [Abr96].
Les principales raisons qui expliquent cet état de fait, sont :
– la difficulté d’utilisation,
– la difficulté de compréhension par les non-spécialistes,
– la très grande diversité et spécialisation des formalismes disponibles (Z, B, VDM,
automates, réseaux de Petri, SDL, CSP, CCS, TLA, pi-calcul, spécifications algébriques,
lambda-calcul, LOTOS, COLD, RSL, etc.),
– la rusticité de la plupart des outils de spécification et de preuve.
La seule approche formelle qui sera détaillée dans cet ouvrage est OCL (Object Constraint
Language), au chapitre 9, car elle est complémentaire d’UML et peut être utilisée
ponctuellement pour améliorer la précision de spécifications semi-formelles. C’est une
approche qui privilégie la simplicité d’utilisation et de compréhension sur la puissance
d’expression.
Libre n’équivaut pas à gratuit, même si le mot anglais free possède les deux sens. On trouve
des logiciels non libres gratuits, comme Internet Explorer ou Acrobat Reader et des logiciels
libres non gratuits, comme certaines distributions commerciales de Linux.
4 • Les modèles de développement 69
b) Techniques de développement
L’analyse d’Eric Raymond dans le texte The cathedral and the Bazaar [Ray99] oppose les
processus logiciels classiques, lourds et hiérarchiques (de type cathedral), au développement
des logiciels libres (de type bazaar) avec les caractéristiques suivantes.
– La coexistence d’un petit cœur de développeurs de haut niveau avec une large communauté
d’utilisateurs/contributeurs bénévoles.
– La communauté des utilisateurs/contributeurs réalise du débogage et du développement
parallèle à grande échelle : « given enough eyeballs, all bugs are shallow » [Ray99] (avec
assez d’yeux, les bugs deviennent insignifiants).
– Les revues par des pairs sont essentielles.
– Les livraisons sont rapides et fréquentes.
– L’organisation est une méritocratie, où chacun progresse selon ses mérites, avec un
« dictateur bienveillant » (benevolent dictator) qui a le dernier mot sur tout.
– La conception du produit doit absolument rester modulaire et la plus simple possible.
Dans les phases de type bazaar, les besoins pour les logiciels libres proviennent plus des
développeurs que des utilisateurs, au contraire des contextes traditionnels. Ces besoins
résultent de l’expérience personnelle des développeurs, qui sont très souvent eux-mêmes des
70 Partie 1. Le développement logiciel
utilisateurs, de leur désir d’explorer des idées nouvelles, ou de leur connaissance de ce que
les utilisateurs peuvent désirer [NWM10].
Les utilisateurs non développeurs peuvent aussi contribuer directement en postant sur le site
du projet des rapports d’anomalies ou des demandes de fonctionnalité (feature requests).
Enfin, les besoins répondent souvent à l’apparition ou à l’évolution d’un standard publié ou
du succès d’une nouveauté dans un produit concurrent, vu comme un standard de fait.
Les communautés décrivent et gèrent ces besoins à travers des artefacts web, que Scacchi
qualifie d’informalisms [Sca02]. Cela inclut les outils de communication comme le mail, les
forums, les blogs, les wikis, les news, la messagerie instantanée, ainsi que les pages web,
les how-to, les to do lists, les FAQ (Frequently Asked Questions) et des documentations plus
traditionnelles.
4 • Les modèles de développement 71
EXERCICES
V projet innovant
(R)UP, XP et Scrum
Ce chapitre détaille trois « méthodes » de développement objet qui jouent un rôle majeur
aujourd’hui : (Rational) Unified Process – (R)UP –, eXtreme Programming – XP – et Scrum.
Le mot méthode est placé entre guillemets car ces approches n’ont pas tous les attributs d’une
méthode complète. XP est plutôt un « cadre technique » et Scrum un « cadre organisationnel »
pour le développement agile des applications.
Les phases sont composées d’itérations. Une itération est une séquence d’activités qui
répond à un plan et possède des critères d’évaluation. Une itération se termine par un jalon
d’évaluation et de prise de décision. Toute itération peut être considérée comme un mini
projet (qui parcourt une ou plusieurs fois le cycle recueil et expression des besoins, analyse,
conception, implantation, tests) et qui produit un livrable (cf. figure 5.2).
Le développement se concrétise donc par une série de livrables, par exemple des maquettes
ou des prototypes dans les premières itérations et des versions exécutables du logiciel final
(releases) ultérieurement, comme dans l’exemple de la figure 5.3.
5 • (R)UP, XP et Scrum 75
® Le lancement
Objectifs : C’est une phase très courte, avec souvent une seule itération. Elle explicite la
« vision » associée au projet en termes de faisabilité, de risques et de périmètre du projet.
Livrables : (tout ou partie de la liste suivante)
– Un document de vision présentant les besoins de base, les contraintes et fonctionnalités
principales.
– Une description courte des principaux cas d’utilisation et une analyse plus poussée des
10 % de cas les plus critiques.
– Un glossaire de projet.
– Un document de justification économique incluant le contexte général de réalisation, les
facteurs de succès et la prévision financière.
– Une évaluation des risques.
– Une première planification du projet (phases et itérations).
– Une maquette.
76 Partie 1. Le développement logiciel
® L’élaboration
Objectifs : Cette phase comporte quelques itérations courtes et de durée fixe, pilotées par
les risques et centrée sur l’architecture. Elle comprend l’identification et la stabilisation de
la plupart des besoins, la spécification de la plupart des cas d’utilisation, la conception de
l’architecture de référence, du squelette du système à réaliser, la programmation et le test
des éléments d’architecture les plus importants, la réalisation et le test des cas d’utilisation
critiques (< 10 % des besoins) et une estimation fiable du calendrier et des coûts de
construction de l’application.
Livrables :
– Au moins 80 % des cas d’utilisation sont élaborés à la fin des itérations.
– Les exigences et contraintes non fonctionnelles sont identifiées.
– L’architecture est définie.
– Une version du produit permettant de valider l’architecture du logiciel à travers les
fonctionnalités les plus importantes.
– Un planning de réalisation réaliste (phases, itérations, critères d’évaluation).
® La construction
Objectifs : C’est la phase la plus longue (plus de 50 % du cycle de développement). La
construction se fait par incréments, avec une architecture stable malgré des changements
mineurs. À chaque incrément, le produit doit contenir tout ce qui avait été planifié. Par contre,
il peut éventuellement rester quelques erreurs non encore traitées.
Livrables :
– Les versions exécutables du logiciel correspondant à l’enrichissement itération par
itération des fonctionnalités.
– Les manuels d’utilisation réalisés simultanément à la livraison incrémentale des
exécutables.
– Une description des versions produites.
® La transition
Objectifs : Le produit est livré (en version béta). Il y a correction du reliquat d’erreurs. Le
produit est essayé et amélioré, les utilisateurs sont formés, l’assistance en ligne est élaborée.
Livrables :
– La version finale du logiciel.
– Les manuels d’utilisation.
– L’assistance en ligne.
Une telle approche est très flexible. Lors des premières itérations la gestion des risques est
fondamentale. Il faut également construire et stabiliser le noyau architectural rapidement.
Le feedback régulier des utilisateurs doit permettre une adaptation permanente du système
aux besoins réels. Le feedback des développeurs et des testeurs doit permettre d’affiner la
5 • (R)UP, XP et Scrum 77
conception et les modèles et de mieux gérer la complexité. Des étapes courtes et pas trop
complexes permettent d’éviter la « paralysie par l’analyse ».
Dans le cadre d’un développement itératif, chaque itération est centrée sur un sous-ensemble
de cas. Il faut traiter en premier les cas d’utilisation « pertinents », c’est-à-dire les plus risqués
(critiques), les plus importants pour le client ou les plus représentatifs du système.
L’architecture décrit les aspects les plus significatifs du système en termes de modèles,
selon les 4+1 vues définies par UML [Kru95] : modèle fonctionnel (cas d’utilisation),
modèles statiques (classes, objets, paquets), modèles dynamiques (processus, concurrence,
performance), modèle d’implantation (composants logiciels), modèle de déploiement
(composants logiciels et matériels). Elle est conçue et stabilisée lors des premières itérations
en parallèle avec l’approfondissement des cas d’utilisation.
sur les éléments les plus exposés, comme l’architecture de l’application ou la gestion des
ressources humaines.
5.1.4. Conclusion
En tant que cadre général (R)UP doit être instancié et adapté en fonction des spécificités du
projet, de sa complexité et d’éventuelles règles propres à l’organisation qui l’héberge.
Cette adaptation concerne non seulement la forme des documents utilisés ou la nature des
outils déployés, mais aussi de manière plus fondamentale la manière de mettre en œuvre
le cycle de vie, incluant par exemple l’existence d’itérations parallèles au sein des grandes
équipes de développement ou la manière de coder. Certaines préconisations de XP, présentées
au paragraphe suivant, peuvent parfaitement trouver leur place dans le cadre de (R)UP.
5 • (R)UP, XP et Scrum 79
De ces quatre valeurs dérivent douze pratiques. Les quatre premières sont liées à la gestion
de projet, les quatre suivantes à la communication et les quatre dernières à la programmation.
(1) Client sur site : Le client doit être intégré physiquement à l’équipe de développement
pour répondre aux questions des développeurs et définir les tests fonctionnels.
Une telle implication continue du client n’est évidemment pas toujours facile à mettre en
pratique.
(2) Rythme soutenable : Il faut savoir travailler mais aussi savoir se reposer. L’équipe doit
adopter un rythme de travail raisonnable qui lui permette de fournir un travail de qualité
tout au long du projet.
Par exemple, éviter de dépasser les horaires hebdomadaires prévus. Si les heures
supplémentaires sont nécessaires deux semaines de suite, c’est le symptôme d’un
problème qu’il faut résoudre plutôt que de le masquer par un surplus de travail.
(3) Livraisons fréquentes : La première livraison, minimale, doit arriver le plus tôt possible,
afin de dissiper d’éventuels malentendus et de donner une matérialité au projet.
Les livraisons suivantes doivent être aussi proches que possible (1 à 6 mois), pour
permettre un pilotage précis du projet et montrer son avancement. Chaque livraison
permet un feedback vers le client et vers les développeurs.
(4) Planification itérative : La planification s’effectue à deux niveaux de granularité : les
livraisons, associées à des fonctionnalités, et les itérations, associées à des tâches à
réaliser par les développeurs.
On compte de 4 à 6 itérations en moyenne par livraison, d’une durée de 1 à 4 semaines
chacune.
La réunion de planification des livraisons (release planning meeting) définit un plan des
livraisons (release plan) pour l’ensemble du projet. Ce plan est utilisé pour définir des
plans d’itération (iteration plan) au début de chaque itération.
Ces plans peuvent être revus et remaniés à tout moment pour tenir compte de l’expérience
acquise par le client et l’équipe de développement.
(5) Programmation en binôme : Cette organisation correspond à une forme de revue de code
permanente. Le pilote écrit le code et le co-pilote le relit et fait des propositions.
Les binômes changent fréquemment (plusieurs fois par jour). Les affectations sont libres.
Chaque développeur est responsable de ses tâches. À tout instant, soit il travaille sur une
de ses tâches, soit il aide quelqu’un d’autre à réaliser les siennes.
Cette organisation fonctionne mieux dans un espace de travail ouvert (salle de projet ou
war room).
(6) Appropriation collective du code : Chaque binôme peut intervenir sur n’importe quelle
partie du code et chacun est responsable de l’ensemble. Les spécialistes doivent devenir
polyvalents et agissent comme des consultants internes.
(7) Intégration continue : On peut avoir plusieurs intégrations par jour. Cette pratique permet
de profiter immédiatement des efforts de chacun, sans avoir à attendre une période
d’intégration lointaine.
Les modalités techniques de l’intégration continue sont présentées au paragraphe 5.5.2.
5 • (R)UP, XP et Scrum 81
(8) Développement dirigé par les tests : Les tests unitaires sont automatisés pour être rejoués
à chaque évolution du code (non-régression). Ils sont écrits en premier, avant le code
qu’ils testent. Ils servent à documenter le code (notion de contrat).
Les modalités techniques du développement dirigé par les tests sont présentées au
paragraphe 5.4.
(9) Règles de codage et de nommage : Une homogénéisation est nécessaire pour permettre
l’appropriation collective. Elle permet une prise en main plus rapide du code écrit par
d’autres.
Les règles doivent être définies avant le démarrage du projet. Elles peuvent concerner
la présentation du code (indentation, espaces, etc.), l’organisation des commentaires, les
règles de nommage (classes, méthodes, constantes, etc.), le vocabulaire commun, des
pratiques de codage ou idiomes (parcours de liste, singletons, etc.).
(10) Conception simple : On peut résumer cette philosophie de la façon suivante « il vaut
mieux faire simple aujourd’hui, quitte à changer demain, plutôt que de faire tout de suite
compliqué sans être absolument certain de l’utilité de ce que l’on développe ».
Plutôt que de tenter de trouver dès le début une architecture idéale assez générique pour
accueillir toutes les fonctionnalités et survivre aux évolutions, l’idée est de considérer
chaque fonctionnalité tour à tour et de rechercher une solution simple et fonctionnelle
sans essayer d’aller au-delà, quitte à devoir remanier régulièrement le code déjà
développé.
Cette philosophie correspond aux préceptes « Do the simplest thing that could possibly
work » (« Faire la chose la plus simple qui puisse fonctionner ») et « You Aren’t Gonna
Need It » ou YAGNI (« Tu n’en auras pas besoin »).
La simplicité recherchée n’est pas la facilité. Elle se caractérise entre autres choses par :
– des idées exprimées clairement et ponctuellement,
– un nombre minimal de classes, de méthodes et de lignes de code,
– pas de duplications de code,
– des tests, tous exécutés avec succès à tout moment.
(11) Utilisation de métaphores : La documentation est limitée au maximum. En effet, les tests
fonctionnels documentent les spécifications, les tests unitaires et le code documentent la
conception détaillée.
Il reste essentiellement à définir la vision d’ensemble de l’application. Elle doit éviter
le jargon technique et utiliser plutôt des analogies avec la vie réelle (métaphores) et des
expressions imagées qui parlent à tout le monde.
(12) Remaniement (refactoring) du code : Remanier signifie modifier un logiciel de façon à
améliorer sa structure interne sans changer son comportement externe.
Martin Fowler a répertorié des dizaines de symptômes de problèmes (code smells), décrits
avec précision un peu à la manière des patrons de conception : code dupliqué, code mort,
trop de paramètres, trop grosse méthode, trop grosse classe (God object), etc.
À noter que certaines corrections peuvent être appliquées automatiquement par des
environnements de développement comme Eclipse.
82 Partie 1. Le développement logiciel
5.2.4. Le processus
Un projet XP présente la structure que décrit la figure 5.5.
(1) Une phase d’exploration pendant laquelle les user stories initiales et les éléments
architecturaux initiaux du projet (concepts et composants) sont déterminés avec les
clients.
(2) Une phase de planification pendant laquelle sont sélectionnées avec les clients les stories
à implanter dans la première livraison et les livraisons suivantes (release plan). Les
5 • (R)UP, XP et Scrum 83
stories choisies pour la première livraison sont décomposées en tâches à réaliser dont
les durées sont estimées par les développeurs.
(3) Une phase de construction incrémentale de la livraison. Les itérations d’une durée d’une
à quatre semaines sont planifiées de manière souple (cf. figure 5.6).
Chaque itération permet de recalculer la vélocité. Elle peut éventuellement créer de
nouvelles stories. Quand l’ensemble des tests fonctionnels (d’acceptation) passent, on
entame la mise en production de la livraison.
(4) Une phase de mise en production de la livraison impliquant l’accord du client.
(5) Une phase de maintenance qui répète les phases de planification, construction et mise
en production pour les livraisons suivantes (2 à n). Ce cycle se répète tant que le client
peut sélectionner des stories à livrer.
Généralement, la première livraison est celle qui inclut le volume le plus important de
fonctionnalités et ébauche le squelette du système (the whole system in a skeletal form).
Au niveau microscopique, chaque itération de la phase de construction s’organise autour du
développement dirigé par les tests.
5.2.5. Conclusion
a) Forces et faiblesses
La production de logiciels de bonne qualité bien adaptés aux besoins des clients et l’efficacité
pour les petits projets sont les points le plus souvent portés à l’actif de XP.
A contrario, la limitation des équipes à 20 personnes au maximum, l’investissement très
important demandé au client, et la programmation en binôme pas toujours bien ressentie,
sont fréquemment mis au passif de XP.
84 Partie 1. Le développement logiciel
Enfin XP est plus facile à appliquer en interne qu’avec un prestataire externe. Les contrats
au « forfait » classiques, où le fournisseur s’engage à un résultat donné, dans un délai donné,
pour un prix fixé, sont délicats à mettre en place. Il faut forfaitiser chaque itération ou chaque
livraison avec la possibilité pour le client d’interrompre le contrat. Il faut accepter aussi
le « troc d’exigence », c’est-à-dire l’ajout d’une nouvelle exigence en échange du retrait
d’une autre moins importante et de même coût. Même les « régies », où le fournisseur met à
disposition du personnel, ne sont envisageables qu’avec des personnes très expérimentées et
motivées.
b) XP et (R)UP
Certaines pratiques de XP peuvent être utilisées dans tout projet (R)UP, alors que c’est
beaucoup moins évident pour d’autres.
Parmi les pratiques compatibles on peut citer par exemple le développement dirigé par les
tests et l’intégration continue.
Par contre l’appropriation collective du code est peu crédible dès que la taille du projet devient
importante. Le remaniement permanent du code, acceptable pour les petits projets, s’oppose
à l’idée d’une architecture clairement définie, souvent considérée comme essentielle dans les
gros projets et les projets critiques. De même, des livraisons très rapides peuvent ne pas être
souhaitables pour des gros systèmes où la logistique du déploiement est lourde et coûteuse.
5.3 SCRUM
Scrum est un cadre de gestion d’un projet agile [SB01]. Scrum signifie « mêlée de rugby ».
L’image est qu’on fait progresser le ballon en travaillant ensemble, comme on fait progresser
un projet en travaillant ensemble. Scrum reprend les principes de base des méthodes agiles :
– itérations courtes (appelées sprints), produisant une version potentiellement livrable,
– travail en collaboration étroite entre tous les intervenants, sans « spécialistes » et sans
primes individuelles selon les performances,
– avec un rythme de développement soutenable,
– avec une équipe qui s’auto-organise.
(4) Sinon, le plus pessimiste et le plus optimiste expliquent leur vote, des discussions rapides
ont lieu, puis on recommence en (2).
La figure 5.8 résume toutes les opérations courantes sur le backlog.
Le Product Owner, éventuellement avec le Scrum Master, donne une priorité à chaque item,
en fonction d’un objectif, comme par exemple la maximisation du retour sur investissement.
Une user story est supprimée du backlog quand elle est « finie » (done). Cette notion de
« fini » doit être définie avec précision et être partagée par tous au sein du projet, car elle
5 • (R)UP, XP et Scrum 87
garantit la qualité du logiciel. Elle dépasse la seule notion de test réussi et peut concerner
bien d’autres aspects comme l’ergonomie, la documentation, les performances, etc. Elle doit
être appliquée rigoureusement : « À moitié fini n’est pas fini » (half done is not done) !
Le backlog peut être complété par de nouvelles stories à chaque itération si des besoins
nouveaux apparaissent.
b) Le sprint backlog
Un sprint est une itération courte de deux à quatre semaines, débouchant sur une version
potentiellement livrable, c’est-à-dire testée et documentée.
Elle s’appuie sur un sprint backlog (ou « carnet de sprint ») qui est l’extrait du product
backlog concerné par le sprint. Une fois qu’un sprint est initialisé, il doit se dérouler comme
prévu jusqu’au bout.
Le sprint backlog prend la forme d’un tableau avec un ensemble de Post-it, un par tâche
assignée au sprint, répartis en trois colonnes : « à faire », « en cours », « fait ». Le passage de
« à faire » à « en cours » est fait individuellement par chaque intervenant le matin. Le passage
de « en cours » à « fait » se fait en fin de journée, si tout ce qui a été spécifié comme indiquant
qu’une tâche peut être considérée comme faite, a été réalisé. Si une tâche n’est pas finie, il y
a mise à jour de l’effort restant.
Pendant un sprint :
– le but ne peut être modifié,
– la composition de l’équipe reste a priori inchangée,
– la qualité n’est pas négociable,
– la liste d’items est négociée entre le Product Owner et l’équipe de développement.
L’avancement idéal est représenté par une droite. L’avancement réel est souvent moins
linéaire en fonction des avances ou des retards pris par l’équipe.
Le nombre d’items possibles dépend de la vélocité de l’équipe. Elle se calcule par la somme
des points des stories qui ont été terminées lors du précédent sprint. Elle ne doit pas être
gonflée artificiellement en rognant sur les exigences de qualité.
Dans un deuxième temps, l’équipe et le Product Owner discutent pour mieux appréhender
ce qui est attendu pour chaque item (le COMMENT), c’est-à-dire la conception en termes
d’architecture, de composants, d’interfaces, de données, etc. Les items sont découpés en
tâches, qui sont ajoutées au sprint backlog. Un effort estimé (en heures) est associé à chaque
tâche. Il n’y a pas d’attribution des tâches à un participant, sauf si une compétence unique est
requise.
Remarque : Il est possible également de planifier les livraisons qui seront fournies aux
utilisateurs. Entre deux livraisons effectives, plusieurs sprints sont en général nécessaires.
Pour éviter une dérive vers une approche trop prédictive et rigide, ce type de planification
doit rester souple et modifiable après chaque sprint.
b) Le daily scrum
Chaque jour, le daily scrum ou « mêlée quotidienne » est une réunion de type stand-up
(debout) et de durée très réduite (environ un quart d’heure) où chacun expose :
– ce qu’il a fait la veille,
– ce qu’il compte faire ce jour,
– les embûches éventuelles.
Il n’y a pas de discussion pendant le daily scrum. Si cela semble nécessaire, les discussions
se tiennent après, lors d’un follow-up meeting.
Après ces réunions, le travail de développement est effectué. En fin de journée, le sprint
backlog est mis à jour de même que le sprint burndown chart.
90 Partie 1. Le développement logiciel
Le sprint se termine à la date prévue, que la totalité du sprint soit réalisée ou non, sans
multiplier les heures supplémentaires. Cette terminaison comprend une revue et une
rétrospective de sprint.
c) La revue de sprint
La revue de sprint (quatre heures maximum) consiste à inspecter le produit. Il est présenté par
l’équipe au Product Owner. Les « poulets » participent en général à cette réunion. « Poulets »
et « cochons » sont libres de poser des questions et d’y répondre. Il s’agit de vérifier si les
items sont « bien faits ». Cela passe par une démonstration du produit, mais ne doit pas se
limiter à cela. Le backlog et les plannings sont revus en fonction des tâches ou items non
réalisés.
d) La rétrospective de sprint
La rétrospective de sprint (trois heures maximum) consiste à inspecter le processus. L’équipe
et le Scrum Master y participent. Le Scrum Master doit limiter ses interventions pour garder
au maximum une position neutre. La présence du Product Owner n’est pas indispensable.
Un tableau à trois colonnes sur ce qui « marche bien», ce qui « marche mal » et ce qui pourrait
être fait pour améliorer la situation est élaboré. Chaque intervenant dispose un ou plusieurs
items dans chaque colonne. Les items répétés sont marqués par des barres pour chaque
occurrence supplémentaire. L’équipe discute des modifications à essayer dans le prochain
sprint pour corriger les défauts.
Scrum apporte aussi des réponses pour le développement des exigences au sens du niveau 3
du CMMI, incluant par exemple l’intégration continue du client à l’équipe de développement
ou la systématisation des démonstrations du produit pour valider les exigences.
La limitation des équipes à moins d’une dizaine de personnes est un facteur limitant
important. Selon Jeff Sutherland, co-fondateur de la méthode, il est possible d’utiliser Scrum
dans des projets de plus de 500 personnes. L’idée, appelée « Scrum de Scrums » ou « Méta-
Scrum », consiste à diviser le projet entre n équipes. Un Scrum of Scrums meeting réunit
une personne de chaque équipe pour coordonner le travail. Ces réunions sont similaires à la
mêlée quotidienne mais avec une fréquence moindre (deux par semaine suffisent souvent).
Pour les très gros projets, on peut avoir des Scrum of Scrums meetings à plusieurs niveaux.
c) La complémentarité de Scrum et XP
répéter
le développeur écrit et/ou modifie le code de l’unité
jusqu’à ce que tous les tests unitaires passent
jusqu’à ce que tous les tests d’acceptation passent
jusqu’à qu’il ne reste plus de fonctionnalité à implanter
À noter qu’initialement un test doit toujours échouer car le code correspondant n’est pas
encore écrit ! À noter également que chaque itération de test et codage s’accompagne d’une
activité de remaniement (refactoring) du code :
1. Écrire un petit nombre des tests unitaires automatisés.
2. Vérifier qu’ils échouent (car le code testé n’existe pas encore)
ce qui montre qu’ils sont valides.
3. Écrire le code suffisant pour passer les tests.
4. Lancer les tests jusqu’à ce qu’ils passent tous,
sinon corriger le code.
5. Remanier le code, pour améliorer sa conception ou ses performances
tout en gardant les mêmes fonctionnalités.
L’essentiel des tests peut être exécuté automatiquement. Il existe de nombreux frameworks
pour automatiser le test unitaire, comme JUnit pour Java, où les tests sont écrits dans le même
langage que le code.
Un premier test porte sur la plus petite valeur, 0L. Pour éviter d’avoir à dupliquer plusieurs
fois le code de test, on l’écrit pour qu’il puisse tester n’importe quelle valeur passée en
paramètre.
private void testValeur(long n, int resultatOK) {
System.out.println("compte les chiffres de "+n);
int resultat = compterChiffres(n);
assertEquals("resultat", resultatOK, resultat);
}
@Test
public void test0() {
testValeur(0L, 1);
}
Ce code ne compile pas car le code de la méthode compterChiffres n’est pas écrit. Pour
le faire compiler on peut se contenter dans un premier temps d’écrire :
public static int compterChiffres(long n) {
return 1;
}
Le test passe. On ajoute un deuxième test pour le plus grand nombre qui donne 1, soit 9L.
@Test
public void test9() {
testValeur(9L, 1);
}
Les deux tests passent. On ajoute un troisième test pour le plus petit nombre qui donne 2, soit
10L.
@Test
public void test10() {
testValeur(10L, 2);
}
Bien entendu le test ne passe plus. Il faut coder la méthode compterChiffres de manière
plus réaliste. On la réécrit avec une itération qui compare n aux puissances successives de
10 :
public static int compterChiffres(long n) {
int res = 1;
long p10 = 10L;
while (!(n < p10)) {
p10 *= 10;
res++;
}
return res;
}
Les trois tests passent maintenant. On généralise à une longueur quelconque (par exemple 5),
avec un quatrième test pour la plus grande valeur qui donne 5, soit 99999L.
5 • (R)UP, XP et Scrum 95
@Test
public void test99999() {
testValeur(99999L, 5);
}
Les quatre tests passent. On ajoute un cinquième test pour la plus petite valeur qui donne 6,
soit 100000L.
@Test
public void test100000() {
testValeur(100000L, 6);
}
Les cinq tests passent. On teste maintenant la plus grande valeur possible sur 64 bits,
Long.MAX_VALUE soit 263 − 1 ou 9223372036854775807, de longueur 19.
@Test
public void testmax() {
testValeur(Long.MAX_VALUE, 19);
}
Cette fois-ci tous les tests passent. On est en droit d’avoir une certaine confiance en cette
dernière implantation.
La classe à tester :
public class ClasseATester{
public static int compterChiffres(long n) {
int res = 1;
while (10 <= n) {
n /= 10;
res++;
}
return res;
}
}
96 Partie 1. Le développement logiciel
La classe de test :
import static org.junit.Assert.*;
import org.junit.*;
public class ClasseTest {
private void testValeur(long n, int resultatOK) {
System.out.println("compte les chiffres de "+n);
int resultat = ClasseATester.compterChiffres(n);
assertEquals("resultat", resultatOK, resultat);
}
@Test
public void test0(){
testValeur(0L, 1);
}
@Test
public void test9(){
testValeur(9L, 1);
}
@Test
public void test10(){
testValeur(10L, 2);
}
@Test
public void test99999(){
testValeur(99999L, 5);
}
@Test
public void test100000(){
testValeur(100000L, 6);
}
@Test
public void essaiMax(){
testValeur(Long.MAX_VALUE, 19);
}
}
Le compilation en ligne de commandes sous Windows dans un répertoire qui contient tous
les fichiers et les librairies s’écrit :
javac -cp .;junit-4.11.jar ClasseTest.java
Il existe des cas de figure beaucoup plus complexes, en particulier quand on doit recourir
à des objets factices (mock objects ou mocks) car l’objet réel n’existe pas encore ou car il
est trop coûteux à utiliser dans un test, comme une base de données complexe. Ce mock a la
même interface que l’objet qu’il simule. Il existe des frameworks spécialisés dans la définition
et la manipulation des différentes catégories d’objets factices (mock, stub, spy, etc.), comme
Mockito pour Java. Ces frameworks permettent au minimum de spécifier quelles méthodes
vont être appelées, dans quel ordre, ainsi que les valeurs retournées.
L’intégration continue peut être mise en œuvre à l’aide d’un gestionnaire de versions (comme
CVS, Subversion, Git, etc.), d’un logiciel d’intégration continue (comme Jenkins/Hudson,
Apache Continuum, etc.) et éventuellement d’outils de mesure de la qualité (comme Sonar,
PMD, etc.). La figure 5.17 montre un scénario possible.
EXERCICES
Exercice 5.2. QCM Scrum (une seule réponse possible par question)
Q1. Quel rôle est responsable de la définition des priorités au sein du product backlog ?
a) Product Owner b) Project Manager c) Lead Developer d) Scrum Master
Q2. Quel rôle n’est pas défini dans Scrum ?
a) Product Owner b) Scrum Master c) Product Manager d) Team
Q3. Quel document n’est pas un artefact Scrum ?
a) Product backlog b) User story c) Sprint backlog d) Burndown Chart
Q4. Quel type de réunion ne fait pas partie de Scrum ?
a) Product review meeting b) Sprint review meeting c) Sprint planning meeting
d) Sprint retrospective meeting
Q5. Quel est le nom de la réunion dans laquelle l’équipe démontre au Product owner et aux
autres personnes intéressées ce qui a été accompli durant le sprint ?
a) Sprint retrospective meeting b) Product review meeting c) Sprint review meeting
d) Stakeholder review meeting
Q6. Quand l’exécution d’un sprint est-elle finie ?
a) Cela dépend des événements b) Quand tous les items du product backlog sont « faits »
(done) c) Quand toutes les tâches planifiées sont finies d) À la fin de la durée prévue
(timebox)
Q7. Quelle est la durée normale du Daily Scrum meeting ?
a) 15 minutes b) Aussi longtemps que nécessaire c) 60 minutes d) 5 minutes
Q8. Quelle est la taille recommandée pour une équipe Scrum ?
a) 9 ± 3 b) 10 ± 3 c) 7 ± 2 d) Peu importe
100 Exercices
La modélisation métier
Chapitre 6
6.1 DÉFINITION
La modélisation métier (business modeling) est une des neuf disciplines fondamentales du
développement logiciel définie par (R)UP, au même titre que l’analyse/conception, les tests
ou la gestion de projet. Elle y joue un rôle prépondérant durant la phase d’étude préliminaire
(inception) mais peut continuer à vivre tout au long du développement car les participants
vont approfondir et actualiser leurs connaissances métier tout au long du processus.
La modélisation métier consiste à représenter le contexte, la structure et la dynamique d’un
« système métier » (business system), avec ses composants, ses processus et ses informations.
Elle peut viser différents objectifs dont celui d’aider à préciser les besoins d’une application
par une bonne compréhension du milieu dans laquelle elle doit s’insérer, ce qui est pour cet
ouvrage l’aspect essentiel. Mais elle peut viser aussi la réorganisation et l’optimisation du
fonctionnement global de l’organisation (business reengineering). Dans ce dernier cas, il est
important de distinguer clairement la modélisation du système existant (As-is system) et celle
du système envisagé après réorganisation (To-be system).
Une bonne connaissance du contexte métier est importante pour bien cerner les besoins d’une
application. Il est par exemple difficile d’imaginer créer une application bancaire complexe
sans une bonne connaissance du milieu bancaire. Cette connaissance permet d’avoir :
– une compréhension globale de « l’écosystème » dans lequel se situe l’application, des
problèmes et des potentialités d’amélioration de cet écosystème,
– une meilleure chance de comprendre les besoins réels auxquels doit répondre l’application,
pas toujours parfaitement en accord avec les besoins exprimés,
– un langage commun aux clients, utilisateurs et développeurs,
106 Partie 2. La modélisation métier
La modélisation métier n’est pas indispensable à tous les projets. Elle peut avoir un coût
de réalisation élevé. Elle se justifie principalement dans les organisations complexes, les
organisations en plein développement ou les métiers mal connus.
Les méthodes agiles parlent assez peu de modélisation métier et préfèrent plutôt insister sur la
participation active et continue des clients et utilisateurs à l’équipe de développement tout au
long du projet, ce qui permet d’éclaircir la problématique métier à chaque fois que nécessaire
par la discussion directe entre les parties prenantes.
Remarque
Cet ouvrage utilise le terme « participant métier » quand la différenciation externe/interne au
métier n’est pas importante.
On a coutume de distinguer les processus « cœur de métier » (core processes) qui satisfont des
acteurs métier et créent directement de la valeur et les processus « de support » (supporting
processes) qui satisfont des intervenants métier et contribuent seulement indirectement à créer
de la valeur.
Exemples
Réparer voiture, Laver voiture, Vendre voiture sont des processus
cœur de métier potentiels d’un garage, associés à l’acteur métier Client. Tenir la
comptabilité est un processus de support potentiel d’un garage, associé à l’intervenant
métier Comptable.
– le but métier (business goal) qui est une propriété que le système métier doit satisfaire.
Les buts métier peuvent être associés à des processus particuliers ou au métier en général
sous la forme d’un arbre de buts.
– la règle métier (business rule) qui est une condition qui doit être vérifiée.
Les règles peuvent être exprimées en langage naturel (ex. : « une commande doit toujours
être associée à un client ») ou dans un langage formel comme OCL (cf. chapitre 9).
La démarche commence par l’identification des participants métier et des cas (processus)
métier. Ces éléments et leurs relations peuvent être synthétisés visuellement dans un
diagramme des cas métier.
La description des cas métier, principalement via des diagrammes d’activités, et l’identification
et la description des entités métier, principalement via un diagramme de classes appelé
« modèle des classes du domaine », peuvent se conduire en parallèle.
La démarche se termine par une phase de consolidation réciproque des modèles.
En cas de besoin, il peut être fait appel également aux diagrammes d’états et aux diagrammes
de séquences pour détailler la dynamique de certains aspects complexes du système métier.
D’autres artefacts, comme un glossaire, peuvent être adjoints aux modèles UML.
6 • Introduction à la modélisation métier 111
EXERCICES
On rappelle qu’un méta-modèle est un modèle des concepts qui peuvent apparaître dans un
certain type de modèle. Il précise les concepts utilisables, leurs relations, leurs attributs, etc.
Commenter cet extrait de méta-modèle.
7.1.2. Recherche
La recherche des acteurs métier constitue habituellement la première étape du processus
d’analyse métier.
Il est conseillé de dresser la liste des acteurs potentiels avec une brève description de la nature
de leur interaction avec le système métier considéré. Les noms des acteurs doivent être choisis
avec soin pour refléter précisément leurs rôles dans le métier.
114 Partie 2. La modélisation métier
Remarque
On peut également dessiner un diagramme de contexte qui lie les acteurs métier externes au
système métier vu comme un cas métier unique. Ce diagramme donne une vue synthétique
du système métier au sein de son environnement.
La figure 7.2 de la page suivante donne le diagramme d’activités métier associé au cas
métier Réparer une voiture, décrit au paragraphe 7.3. On peut y noter l’utilisation
des partitions et des flots d’entités.
associations qui les relient restent anonymes, précisées seulement par leurs cardinalités
(multiplicités), comme on peut le voir sur la figure 7.3.
On trouve parfois des diagrammes de classes métier sans les intervenants, avec uniquement
les associations entre entités métier.
Ce modèle ne doit pas être confondu avec le modèle des classes du domaine qui est un
diagramme de classes plus détaillé représentant les entités conceptuelles significatives du
domaine avec leurs relations. Il est présenté en détail au chapitre suivant.
Exemple
Dans le diagramme des classes métier du garage de la figure 7.3, on peut noter l’apparition de
l’entité Voiture, jamais évoquée jusqu’ici. Ce n’est pas surprenant, puisque le but de ces
diagrammes complémentaires est précisément d’enrichir différents aspects de la modélisation
métier.
c) Le diagramme de séquences
Classiquement les diagrammes de séquences détaillent la chronologie des échanges de
messages entre les éléments qui interviennent durant un scénario. En modélisation métier, ils
servent surtout à détailler les échanges entre acteurs externes et intervenants internes.
Exemple
La figure 7.4 donne le diagramme de séquences du scénario nominal de la réparation.
On peut remarquer sur la figure 7.4 que certains échanges sont de nature matérielle, comme
le transfert de la voiture, et non informationnelle. Ce n’est pas un problème dans ce contexte.
d) Le diagramme d’états
Il permet la spécification du cycle de vie des entités métier les plus complexes.
Exemple
La modélisation des états d’une voiture lors d’une réparation.
On note sur la figure 7.5 les actions associées aux états qui peuvent être rapprochées des
activités du diagramme d’activités métier.
– gérer les rendez-vous (pour les activités métier Vérifier rendez-vous et Prendre
rendez-vous),
– gérer les devis (pour l’activité métier Établir devis et la saisie de la décision du
client),
– gérer les factures (pour l’activité métier Établir facture et pour la saisie du
règlement du client).
EXERCICES
Exercice 7.4. Diagramme de séquences d’un cas métier (suite de l’exercice 7.1.)
Décrire le diagramme de séquences du cas nominal du retour d’un véhicule.
Exercice 7.5. Diagramme d’états d’une entité métier (suite de l’exercice 7.1.)
Décrire le diagramme d’états de l’entité métier véhicule.
Chapitre 8
La modélisation du domaine
8.1 DÉFINITION
La modélisation du domaine consiste à représenter visuellement, par un schéma de
classes UML, les concepts remarquables du domaine étudié. On obtient ainsi une sorte de
« dictionnaire visuel » des concepts de la portion du monde réel considérée. Cette description
ne doit pas être confondue avec celle des classes logicielles de la future application ayant
pour but de répondre à certains besoins au sein de ce domaine d’application.
La construction d’un tel modèle permet de se focaliser sur la signification des choses dans
l’espace problème, c’est-à-dire sur le niveau sémantique. C’est une description très stable,
aussi stable que le métier lui-même. Les sources d’information sont les cas métier (s’ils ont
déjà été élaborés), les autres descriptions du métier, les connaissances des experts du domaine
et toutes les connaissances générales que les analystes possèdent.
La modélisation du domaine permet de fixer un langage commun à tous les intervenants d’un
projet et peut servir de point de départ pour la définition des modèles de classes des futures
applications opérant dans ce domaine.
En comparaison, les classes logicielles contiendront beaucoup plus de détails liés aux
traitements et à l’implantation des données, comme des types de données associés aux
attributs et aux méthodes (paramètres et résultat).
Si nécessaire, des règles métier importantes peuvent être spécifiées textuellement ou
formellement (cf. chapitre 9) dans des notes associées aux éléments du modèle.
Exemple : Modélisation du domaine de la location d’outils de bricolage.
Les boutiques de ce genre offrent à leurs clients la location d’outils décrits dans un catalogue,
avec pour chaque type d’outil un tarif par jour de location prévu et un tarif par jour de retard.
Le règlement de la location se fait au retrait de l’outil pour une durée donnée et le règlement
des éventuels frais de retard se fait quand l’outil est rendu.
a) Mesures et observations
Les patrons de cette catégorie s’intéressent à l’enregistrement de différents types de faits.
Exemple
Un grand nombre de mesures peuvent concerner une même personne, dont certaines
peuvent ne pas être numériques. La solution consiste à créer des objets Phénomène et
Observation. De plus, une Observation est soit une Mesure soit une Catégorie
Observée prise parmi un ensemble de Catégories.
b) Responsabilités
Ces patrons décrivent les responsabilités des personnes et des organisations.
Exemple
De nombreuses personnes et unités organisationnelles peuvent être décrites par des propriétés
similaires (adresse, mail, téléphone, etc.). La solution consiste à créer un type Partie en
tant que supertype des types Personne et Unité.
Remarque : Adresse, téléphone et mail peuvent aussi être représentés comme des attributs.
c) Planification
Ces patrons traitent des plans et des ressources.
Exemple
Il faut parfois gérer à la fois des activités prévues et des activités réalisées. La solution
consiste à utiliser des objets distincts pour ces deux types d’activités.
Les patrons d’analyse n’ont pas connu le même succès que les patrons de conception. Il
en existe potentiellement un nombre quasi infini et la probabilité de pouvoir les mettre en
œuvre est assez faible. L’effort à faire pour se les approprier peut sembler disproportionné
par rapport aux avantages que l’on peut espérer en tirer.
8.5 UN EXEMPLE
Il s’agit de décrire la caisse d’un magasin. On analyse tout d’abord le cas métier Passage
en caisse qui propose le scénario nominal suivant. Les noms et groupes nominaux à
analyser sont soulignés.
(1) Le client arrive à la caisse avec les produits qu’il a choisis.
(2) Le caissier commence une nouvelle vente.
(3) Le caissier saisit l’identification du produit et éventuellement une quantité.
(4) La caisse affiche la description du produit, son prix et le montant courant.
(5) Le caissier répète les deux points précédents pour chaque item de la vente.
(6) La caisse affiche le montant total.
(7) Le caissier demande le règlement.
(8) Le client paye le montant demandé et le caissier enregistre le règlement.
(9) La caisse transmet les informations au système comptable et au système de gestion des
stocks.
(10) La caisse imprime le ticket de caisse.
(11) Le client quitte la caisse avec le ticket de caisse et les produits.
Les noms retenus comme reflétant a priori des concepts importants du domaine sont : Client,
Caisse, Produit, Caissier, Vente, Item et Règlement.
Les noms dénotant des valeurs élémentaires, donc des attributs, sont : Identification (du
produit), Quantité (d’un élément de la vente), Description (du produit), Prix (du produit),
Montant (de l’item, de la vente, du règlement).
Les noms écartés car considérés comme moins importants ou liés à l’implantation sont :
Système comptable, Système de gestion des stocks et Ticket de caisse.
Le concept de Vente apparaît au cœur du modèle. Le Client et le Caissier sont liés à la Vente
(association « A est lié à une transaction B »). La Vente utilise la Caisse (association « A
utilise B »). Le Règlement résulte de la Vente (association « A est une transaction liée à une
autre transaction B »). L’Item est un élément de la Vente (association « A est un item d’une
transaction B »). L’Item est décrit par le Produit (association « A est une description de B »).
La figure 8.5 donne la première esquisse du modèle du domaine résultant de cette analyse
linguistique.
132 Partie 2. La modélisation métier
Pour beaucoup de spécialistes, il vaut mieux trop d’éléments que de passer à côté d’un
concept important. On peut chercher à enrichir le modèle en s’aidant de la liste des catégories
de classes conceptuelles. Par exemple :
– la catégorie « description d’objet » peut inciter l’analyste à distinguer la Description
Produit (le type) et les instances (pour lesquelles on conserve le nom Produit) ; ce n’est
envisageable que pour des produits dont les instances sont bien identifiables par une
référence,
– la catégorie « conteneur d’objets » peut inciter l’analyste à introduire le concept de Stock
qui contient toutes les instances de produit (vendues et disponibles),
– la catégorie « enregistrement » peut inciter l’analyste à introduire un Enregistrement des
ventes (par caisse et par caissier).
Il n’existe pas de modèle « complet » ou « idéal ». La description obtenue doit satisfaire
les experts du domaine et répondre aux besoins de compréhension du métier des divers
intervenants à cet instant. La version enrichie de l’exemple est la suivante (cf. figure 8.6).
8 • La modélisation du domaine 133
EXERCICES
À noter qu’OCL a aussi été utilisé pour rendre plus précis le méta modèle UML. On
rappelle qu’un méta modèle est un modèle de modèle, c’est-à-dire un modèle qui décrit
la structure d’un modèle : Quels composants ? Quelles associations entre composants ?
Quelles propriétés des composants et associations ? Par exemple, un diagramme d’états
UML contient des composants État et Transition d’état. Une transition d’état
définit un état suivant. Il existe un état initial, etc. Ce méta modèle peut être ébauché
en UML comme montré par la figure 9.2.
OCL permet d’être beaucoup plus précis sur ce qui est possible ou non dans un diagramme
d’états.
Exemple
Deux états distincts portent nécessairement des noms différents :
context Etat
inv: Etat.allInstances() -> forAll(e1, e2 | e1<>e2 implies e1.nom<>e2.nom)
140 Partie 2. La modélisation métier
9.3.2. Invariant
Un invariant (inv) exprime une contrainte sur un objet ou un groupe d’objets qui doit être
respectée en permanence.
Exemples
context p : Personne
inv : p.nom <> ’’ -- toute personne a un nom non vide (commentaire)
context Personne
inv : nom <> ’’ -- autre syntaxe possible
context Personne
inv : self.nom <> ’’ -- autre syntaxe possible
-- la notation . permet d’accéder à une caractéristique d’un objet,
-- attribut, méthode, extrémité d’association (navigation)
-- self représente l’objet désigné par le contexte
context Personne
inv : (age <= 100) and (age >= 0) -- age est compris entre 0 et 100
9 • Les spécifications formelles avec OCL 141
context p : Personne
inv borneAge : (p.age <= 100) and (p.age >= 0) -- invariant nommé
Exemples
context Compte :: debiter(somme : Real)
pre : somme > 0
post : solde = solde@pre - somme
Exemple
On suppose l’existence dans Personne d’un attribut booléen dérivé majeur et d’un attribut
booléen marié.
context Personne
inv :
if age>=18 then
majeur=vrai
else
majeur=faux
endif
context Personne
inv : marié implies majeur
9.4.2. Variables
On peut définir des variables pour simplifier l’écriture d’une expression avec la syntaxe :
let variable : type = expression1 in expression2
Exemple
Mise en facteur du calcul du montantImposable dans une expression qui le calcule selon
différentes formules correspondants à des tranches d’imposition différentes.
context Personne
inv :
let montantImposable : Real = salaire*0.8 -- 80% du salaire
in
if (montantImposable >= 100000) -- tranche à 45%
then impot = montantImposable*45/100
else if (montantImposable >= 50000)
then impot = montantImposable*30/100 -- tranche à 30%
else impot = montantImposable*10/100 -- tranche à 10%
endif
endif
On peut aussi définir une variable ou opération utilisable dans plusieurs expressions avec la
syntaxe :
def variable : type = expression1
9 • Les spécifications formelles avec OCL 143
Exemples
context Personne
def : montantImposable : Real = salaire*0.8
context Personne
def : ageCorrect(a : Real) : Boolean = (a >= 0) and (a <= 100)
Avec cette opération, on peut réécrire l’invariant sur l’âge :
context Personne
inv : ageCorrect(age) -- l’age est entre 0 et 100 ans
context Personne
inv: genre = Genre::femme
Exemple
Soit la classe Pilote qui dérive de la classe Personne. Dans le contexte de la classe
Pilote self.oclIsKindOf(Pilote) et self.oclIsKindOf(Personne) sont
vraies.
144 Partie 2. La modélisation métier
Exemple
context Vol
inv: self.personne.age <= 60 -- ambigu car deux associations
inv: self.pilote.age <= 60 -- non ambigu
Si on compose plusieurs accès, le type du résultat peut être un Bag ou une Sequence.
Exemples
Dans le contexte de la classe Vol :
appareil est de type Avion ;
passagers est de type Set(Personne)
escales est de type OrderedSet(Aeroport)
escales.localisation est de type Sequence(Pays)
passagers.nationalite est de type Bag(Pays)
Exemples
context Vol
inv : not(self.pilote -> exists(age<18))
-- pas de pilote de moins de 18 ans
context Personne
inv: Personne.allInstances() -> forAll(p1, p2 | p1 <> p2 implies p1.nom <>
p2.nom)
-- deux personnes distinctes ont des noms différents
context Personne
inv: self.comptes.solde->sum() > 0
-- la somme des comptes d’une personne est positive
146 Partie 2. La modélisation métier
EXERCICES
b) Le salaire d’un employé ne peut pas être plus élevé que celui de son chef.
c) La date d’embauche d’un employé doit être plus récente que sa date de naissance.
d) La date de début comme gestionnaire d’un département d’un employé doit être plus récente
que sa date d’embauche.
Remarque : Le nom d’une classe association (avec sa première lettre en minuscule) peut être
utilisé pour la navigation comme tout nom d’association.
e) Le gestionnaire d’un département doit être membre de ce département.
f) Un employé ne peut travailler que dans des projets hébergés par son département.
g) Un employé travaille au moins 30 heures par semaine et au plus 50 heures par semaine
dans tous ses projets.
h) Un employé ne peut pas être son propre chef.
PARTIE 3
DÉFINITION
Comme cela a été montré dans les chapitres qui précèdent, la modélisation métier qui initie
souvent la démarche de développement d’une application est centrée sur le domaine d’activité
considéré, en termes de processus (cas métier) et d’entités (classes du domaine).
La démarche se recentre ensuite sur les besoins de l’application qui doit être développée
au sein de ce domaine d’activité. Dans un premier temps, l’application est considérée de
l’extérieur, comme une boîte noire. Dans un second temps, la boîte noire est ouverte pour
spécifier les artefacts essentiels de l’application visibles par les utilisateurs et approuvés par
eux.
10.1 DÉFINITION
Le formalisme des user stories a été introduit dans la méthode XP et joue un rôle important
dans beaucoup d’approches agiles. Certains traduisent user stories par « scénarios client »,
« histoires utilisateur » ou encore « récits utilisateur ». Dans cet ouvrage, le terme anglais,
très majoritairement utilisé, est conservé. Philosophiquement, les user stories tentent de
combiner les forces de la communication écrite (édition et révision facile, persistance,
partage aisé, termes qui peuvent être soigneusement choisis) et de la communication orale
(feedback immédiat, clarification facile, compréhension plus aisée).
Une user story est une phrase formatée, écrite en langage naturel, qui vise à décrire avec clarté
un besoin, c’est-à-dire une fonctionnalité à développer, une qualité espérée ou une contrainte
à respecter par l’application. Cette phrase peut être considérée comme un élément d’une
conversation (a token for a conversation) qui pourra se tenir ultérieurement (a mechanism for
deferring conversation).
Dans son format le plus courant (matrice « rôle-fonctionnalité-bénéfice »), la phrase doit
contenir trois éléments : le <qui> (rôle), le <quoi> (fonctionnalité) et le <pourquoi>
(bénéfice).
En tant que <qui> je veux <quoi> afin de <pourquoi>
Dans certains cas le <pourquoi> peut être omis.
Exemples
– En tant qu’utilisateur je veux pouvoir rechercher un client par son prénom et nom de
famille afin de le retrouver rapidement lorsque je reçois un appel de sa part.
152 Partie 3. La modélisation des besoins
– Valuable : Une user story doit avoir une valeur pour le client ou l’utilisateur, ce qui
implique au moins qu’elle soit parfaitement compréhensible par lui.
– Estimable : Les développeurs doivent être capables d’estimer une user story pour permettre
de lui affecter une priorité et la planifier. Elle ne doit pas être trop grosse ou trop floue.
– Small : Une bonne user story doit correspondre à un effort limité (pas plus de deux ou trois
semaines/homme). Sinon, sa définition et son estimation deviennent difficiles.
– Testable : Cela correspond au dernier C (confirmation) de la formule des trois C. On ne
développe rien que l’on ne peut pas précisément tester. Sinon, on ne peut pas savoir quand
le développement est terminé. « Le logiciel doit être facile à utiliser » est l’exemple type
de story non testable.
Il peut y avoir plusieurs conditions initiales et plusieurs résultats combinés par des et.
Exemple
Étant donné que je suis un utilisateur premium et que je demande une annulation de
réservation d’hôtel alors je suis remboursé intégralement du montant de la réservation.
10.3 UN EXEMPLE
Il s’agit d’analyser un site web destiné à la vente de livres de recettes de cuisine.
L’approche qui a été retenue s’inspire du story mapping. Quatre rôles ont été retenus :
utilisateur novice, utilisateur expert, acheteur de cadeau et administrateur. Ils ont guidé
la définition d’une collection de stories qui couvre bien les différents types d’utilisation
envisagés. Leur recherche s’est faite en considérant les processus d’interaction des différents
types de client.
10 • Les user stories 155
La seconde story indique la nécessité d’accéder à une description détaillée de l’ouvrage ainsi
trouvé :
– En tant qu’utilisateur je veux pouvoir lire une description détaillée des livres que j’ai
trouvé (par exemple, description, nombre de pages, date de publication, etc.) afin de
conforter mon choix.
Les deux stories suivantes portent sur la gestion du panier d’achat du site :
– En tant qu’utilisateur je veux pouvoir ajouter un livre dans mon panier d’achat afin de
préparer ma commande.
– En tant qu’utilisateur je veux pouvoir retirer un livre de mon panier d’achat afin de
permettre une sélection avant achat.
On retrouve dans ce dernier cas un découpage selon les opérations CRUD (Create-Read-
Update-Delete), classiques dans le domaine des bases de données.
On trouve aussi des stories pour l’administrateur en liaison avec les utilisateurs :
– En tant qu’administrateur je veux pouvoir approuver ou rejeter les commentaires des
utilisateurs avant publication afin d’éviter les dérives.
Des contraintes
Enfin, certaines stories expriment des exigences qualitatives (d’efficacité, de sécurité, de
sûreté, etc.), comme :
– En tant qu’acheteur expérimenté je veux pouvoir trouver et commander un livre en moins
de 90 secondes afin de répondre à ce type de commande urgente.
– En tant qu’administrateur je veux pouvoir offrir un système qui accepte jusqu’à 50
connexions simultanées afin de pouvoir répondre aux pics de charge.
10 • Les user stories 157
EXERCICES
11.1 DÉFINITION
Les cas d’utilisation (use cases) ont été formalisés par Ivar Jacobson [Jac+92], par la suite
contributeur important du langage UML et du processus unifié, dont ils constituent un des
éléments essentiels.
Un cas d’utilisation décrit une interaction avec l’application par un utilisateur dans
une certaine intention. Autrement dit, un service de bout en bout ou une fonctionnalité
significative vu de l’extérieur.
L’ensemble des cas, récapitulés dans le diagramme des cas UML, permet la délimitation de
l’application à travers l’ensemble des services qu’elle offre et la visualisation de ses relations
avec son environnement constitué d’acteurs.
Un acteur est une personne ou un système qui interagit directement avec l’application en
échangeant de l’information. Par exemple les utilisateurs finaux de l’application, bénéficiaires
directs des services qu’elle offre, ou les responsables de son fonctionnement, comme ses
administrateurs. Plus précisément, un acteur représente un rôle. La même personne physique
peut jouer le rôle de plusieurs acteurs et plusieurs personnes physiques peuvent jouer le même
rôle et donc agir comme un même acteur.
Dans le chapitre sur la modélisation des processus métier, on a déjà rencontré la notion de
« cas », sous la dénomination de « cas métier ». Certains cas d’utilisation correspondent à des
cas métier que l’application implante. Les acteurs et les intervenants métier des cas métier
implantés deviennent les acteurs de ces cas d’utilisation. La modélisation des processus
métier peut donc aider à la détermination des cas d’utilisation des applications qui opèrent au
sein du métier considéré.
160 Partie 3. La modélisation des besoins
Exemple
Variantes :
1. Patient inconnu : la demande est transmise au secrétariat avec un numéro de téléphone
pour la réponse.
2. Médecin incorrect : avec l’accord du patient l’application retient le nom du médecin
traitant du patient conservé dans la base des clients. Si le patient n’est pas d’accord, la
demande est transmise au secrétariat.
3. Refus du ou des créneaux proposés : si c’est possible, l’application propose un médecin
de remplacement dans la plage horaire demandée.
4. Refus du remplacement : la demande est transmise au secrétariat.
Contraintes non fonctionnelles :
1. Performance : la recherche dans la base des clients doit démarrer dès la saisie du nom.
2. Sécurité : l’accès au formulaire doit être protégé contre les robots (CAPTCHA).
3. . . .
À noter que le diagramme de cas réduit à un seul cas qui correspond à l’application toute
entière est souvent appelé « diagramme de contexte ». Il explicite simplement l’ensemble des
acteurs en lien avec l’application, c’est-à-dire les éléments notables de son contexte.
Dans un diagramme de cas, les cas peuvent éventuellement être liés par des relations
stéréotypées :
– La relation d’inclusion, notée A <<include>> B (ou A <<inclut>> B), signifie que
le cas A inclut obligatoirement le cas B. Cela permet de décomposer les cas et de factoriser
les parties communes entre cas.
– La relation d’extension, notée A <<extend>> B (ou A <<étend>> B), signifie que
le cas A est une extension optionnelle du cas B à un certain point de son exécution.
Exemple
Exemple
Une troisième erreur fréquente consiste à se polariser sur le diagramme des cas et ses
relations assez subtiles. « Une caractéristique habituelle d’un modélisateur novice (ou
scolaire) est sa focalisation sur les diagrammes de cas et ses relations, plutôt que d’écrire du
texte. (. . . ) Les diagrammes et leurs relations sont des aspects secondaires du travail. Les
cas d’utilisation sont des documents textuels. Le travail avec les cas d’utilisation consiste à
écrire du texte » [Lar95]. Un diagramme de cas qui récapitule simplement la liste des cas
inclus dans l’application avec les acteurs concernés par chaque cas suffit le plus souvent.
Il ne faut pas non plus confondre cas d’utilisation et scénario. Un cas d’utilisation est plutôt
une classe de scénarios. Chaque scénario est un chemin particulier, une instance de la
description abstraite et générale fournie par le cas d’utilisation. Les scénarios correspondent
aux jeux de test fonctionnels de l’application (tests d’acceptation).
Exemple
Un scénario associé au cas de prise de rendez-vous.
1. Pierre saisit ses coordonnées et demande un rendez-vous avec le Docteur Jules.
2. L’application trouve Pierre dans la base.
3. Pierre propose la plage 10h-11h du lendemain.
4. L’application propose les créneaux de 9h20 et de 12h00.
5. Pierre accepte le créneau de 12h00.
6. L’application enregistre le rendez-vous dans le planning du Docteur Jules.
Enfin, il est important que les cas d’utilisation soient compréhensibles par tous. D’après
(R)UP, les cas d’utilisation sont le fil conducteur du projet et sont utilisés aussi bien par
les analystes, les architectes, les gestionnaires, les utilisateurs, les clients, les développeurs et
les testeurs. De multiples conseils ont été formulés pour leur écriture.
Exemples
– Rester concis et pertinent. Éviter les longs documents.
– Pour chaque étape du cas, le sujet doit être clairement localisable, en début de phrase
généralement : « le client fait ceci . . . », « l’application fait cela . . . ».
– Pour chaque étape du cas, éviter les si et placer les comportements alternatifs dans la
section des variantes.
11.6 UN EXEMPLE
Il s’agit du module d’administration d’une application intranet d’entreprise avec des
fonctionnalités de gestion des utilisateurs, des groupes et des modules. Le diagramme de cas
de la figure 11.5 explicite les cas du sous-système de gestion des utilisateurs.
EXERCICES
• expédier une ou plusieurs cartes par mail à un destinataire dont il fournit l’adresse mail,
• se déconnecter.
Un client enregistré peut se loguer. Il peut aussi faire appel à une fonctionnalité de
changement de son mot de passe s’il l’a oublié.
Donner le diagramme de cas d’utilisation avec les cas Se loguer, S’enregistrer,
Confirmer son enregistrement, J’ai oublié mon mot de passe.
Exploiter les relations entre cas.
Remarque : On serait tout à fait en droit de se demander si ces (micro-)fonctionnalités
doivent vraiment être représentées comme des cas d’utilisation.
Chapitre 12
Exemple
Diagramme de séquences « système » du scénario nominal de la prise automatique de rendez-
vous auprès d’un cabinet médical.
EXERCICES
Préconditions :
– le panier du client n’est pas vide,
– le client est authentifié.
Postconditions :
– une commande est enregistrée et transmise au service Commandes,
– une transaction cryptée a été passée avec le système externe de paiement sécurisé et
sauvegardée.
Déroulement normal :
1. Le client saisit l’ensemble des informations nécessaires à la livraison, (adresse de
facturation et adresse de livraison si elle est différente de l’adresse de facturation).
2. L’application affiche un récapitulatif des adresses et du panier.
3. Le client valide sa commande.
4. Le client sélectionne le paiement par carte bancaire.
5. Le client fournit son numéro de carte de crédit, sa date de validité et son numéro de
contrôle.
6. L’application envoie les informations cryptées au système externe de paiement
sécurisé.
7. Le système de paiement sécurisé autorise la transaction.
8. L’application confirme la prise de commande au client.
9. L’application envoie la commande validée au Service commercial.
10. L’application enregistre la commande.
Variantes :
3.1. 1 Le client annule sa commande.
3.2. L’application revient sur l’affichage du panier et le cas d’utilisation se termine en
échec.
4.1. Le client choisit un paiement différé (chèque, virement, etc.).
4.2. L’application confirme la commande au client et lui rappelle la démarche à suivre
pour la terminer.
4.3. L’application enregistre la commande dans l’état « en attente de règlement ».
6.1. L’application détecte que les informations sur la carte sont incomplètes ou erronées.
6.2. L’application demande au client de modifier ou compléter les informations sur la
carte.
6.3. Retour à l’étape 5 du déroulement normal.
7.1. Le système de paiement sécurisé n’autorise pas la transaction ou ne répond pas.
7.2. L’application indique au client que le paiement par carte bancaire a échoué.
7.3. Retour à l’étape 4 du déroulement normal.
Contraintes :
– L’envoi des données est crypté (protocole SSL).
– Sont acceptées les seules cartes Visa, Eurocard-Mastercard et American Express.
La modélisation de l’application
DÉFINITION
Après avoir analysé l’application du point de vue externe, comme une boîte noire, il est
temps de commencer à « ouvrir la boîte », sans toutefois empiéter trop sur la conception de la
solution. On se limite donc aux principaux « artefacts » qui ont un intérêt pour les utilisateurs
de l’application et qui doivent être compris et approuvés par eux. C’est le cas en particulier
des principaux composants de l’interface homme–machine (IHM) et des principales entités
logicielles qui sont manipulées par l’application.
approche convient mal pour quelques types particuliers d’application, comme celles relevant
par exemple du modèle de conception « tubes et filtres », tels les compilateurs. Pour plus de
détails, le lecteur pourra se référer au volume compagnon sur la conception des applications
[Lon14].
Le modèle de navigation
Le modèle de navigation représente de manière formelle, à l’aide des diagrammes UML
qui permettent de modéliser les aspects dynamiques (transitions d’états ou flots d’activités),
l’ensemble des cheminements possibles entre les principaux composants (écrans, panneaux,
menus, etc.) proposés aux utilisateurs par l’interface utilisateur de l’application. En général,
cette modélisation fait suite à l’élaboration d’une maquette de l’interface homme-machine.
Chapitre 13
13.1 DÉFINITION
Le modèle des classes d’analyse distingue trois types de classes : les classes de dialogue (ou
classes « frontière »), les classes de contrôle et les classes entité.
13.3 UN EXEMPLE
On reprend le cas d’utilisation de l’ajout d’un compte utilisateur par l’administrateur d’une
application.
EXERCICES
Exemple
On suppose qu’un compte client peut non seulement être créé et supprimé mais aussi être
désactivé puis réactivé, soit par une intervention de l’administrateur, soit au bout d’un délai
d’inactivation prévu lors de la désactivation. À sa création le compte est activé. Il peut être
supprimé à tout instant.
Le diagramme d’états correspondant est donné par la figure 14.2. On rappelle qu’un
événement en UML peut comprendre des paramètres, une condition (garde) et un effet (autre
que le changement d’état, comme un affichage par exemple) :
événement(paramètres) [condition] / effet
EXERCICES
Exercice 14.2. Diagramme d’états du panier d’achat d’un site de commerce électronique
Dessiner le diagramme d’états du panier d’achat d’un site de commerce électronique. On peut
ajouter ou supprimer des articles, incrémenter ou décrémenter les quantités des articles, vider
le panier et passer commande de tout ce qui se trouve dans le panier.
Le modèle de navigation
15.1 DÉFINITION
Très tôt dans le processus de développement, l’analyste a déjà pu créer des maquettes
statiques des principaux écrans de l’interface homme-machine (IHM) de l’application (cf.
paragraphe 2.1.5.) Par le biais du modèle des classes d’analyse il a pu également spécifier des
classes de dialogue qui sont les classes « en périphérie de l’application », en lien d’un côté
avec les acteurs et de l’autre côté avec les contrôleurs qui implantent la logique métier. Ces
classes de dialogue sont des abstractions des écrans de l’application et des objets logiques
essentiels que ces écrans hébergent, comme les cadres ou panneaux (frame), les menus, etc.
(cf. paragraphe 13.1.1.)
Le modèle de navigation complète ces représentations en systématisant la description de la
navigation au sein des composants de l’interface utilisateur. Il ne s’agit pas d’entrer dans tous
les détails de conception, et encore moins d’implantation de l’interface. Il s’agit seulement
de définir la stratégie générale d’utilisation de l’application.
C’est une pratique bien établie pour les applications web, pour lesquelles différentes
extensions d’UML ont été proposées. À noter que certaines propositions s’appuient sur
les diagrammes d’états UML [Roq06], ce qui est assez logique en raison du caractère
« événementiel » de l’évolution des interfaces utilisateur, alors que d’autres s’appuient sur
les diagrammes d’activités UML, s’inscrivant dans la tradition de l’analyse des flots de
tâches que peuvent effectuer les utilisateurs.
La suite de ce chapitre décrit une extension minimum du diagramme d’activités UML pour
modéliser la navigation.
188 Partie 4. La modélisation de l’application
On peut en ajouter d’autres au besoin, comme « dialogue » pour modéliser à un niveau abstrait
une interaction entre acteur et application [Lie04].
À noter que plusieurs transitions qui partent d’une même activité modélisent un choix indéfini
qui est à la discrétion de l’utilisateur. Un choix conditionnel est modélisé avec le symbole
de choix en forme de losange et des gardes précisant les conditions. Enfin, une barre de
synchronisation modélise le lancement simultané de plusieurs activités parallèles.
À noter également que seules les transitions ayant une signification au regard du processus
métier sont explicitées dans le modèle. D’autres transitions, comme des annulations ou
des retours arrière, pourront parfaitement être établies à la conception et ajoutées dans
l’implantation.
15.3 UN EXEMPLE
On reprend le processus de recherche d’ouvrages correspondant au modèle des classes
d’analyse de la page 182.
Depuis l’écran d’Accueil, l’utilisateur peut soit passer à l’écran Recherche avancée,
soit utiliser le panneau Recherche rapide. Dans les deux cas une action de Recherche
est lancée. Si des ouvrages sont trouvés ils sont affichés sur l’écran Résultat de
recherche sinon une exception Pas d’ouvrage apparaît.
15 • Le modèle de navigation 189
Depuis l’écran d’accueil il est possible également de poursuivre vers d’autres écrans non
détaillés dans ce modèle mais désignés par des connecteurs (Meilleures ventes et
Nouveautés).
EXERCICES
On rappelle également qu’on peut associer à une transition entre états, par l’intermédiaire de
la notation événement[garde]/action :
– un événement (signal, opération, condition when ou condition after)
– une garde (condition),
– une action.
Quand l’événement se produit si la condition est vérifiée alors l’action est effectuée et la
transition d’état s’opère.
PARTIE 5
Le chapitre 19 reprend la même analyse, avec cette fois une spécification en termes de cas
d’utilisation.
Enfin, le chapitre 20 donne une description du modèle du domaine et illustre les diagrammes
d’états associés aux entités les plus complexes du jeu.
Chapitre 16
La phase d’initialisation (inception) est centrée sur l’identification des besoins fonctionnels
et non fonctionnels. La description des acteurs et des cas d’utilisation, sous une forme
synthétique, constitue l’outil essentiel d’expression initiale des besoins fonctionnels. Les
principales exigences non fonctionnelles sont également listées. Une première ébauche
d’analyse en termes d’architecture fonctionnelle et de classes importantes pour le domaine
visé est aussi conduite. Enfin, des maquettes des principaux écrans sont élaborées.
Les trois premiers rôles relèvent du front office, les trois derniers du back office. Il existe aussi
un acteur logiciel, le Système de paiement sécurisé d’un prestataire externe.
Seuls les ouvrages disponibles en stock doivent apparaître dans les listes de résultat.
– Consulter un ouvrage : l’ouvrage trouvé par l’internaute est présenté en détail
avec la photo de sa couverture, ses caractéristiques, sa description, l’avis des clients, un
accès aux commentaires.
16.3.2. Efficacité
– Pas de durée de recherche supérieure à 5 secondes avant l’affichage des premiers résultats.
– Pic de charge absorbable jusqu’à 100 connexions simultanées.
16.3.3. Sécurité
– Paiement sécurisé.
– Pas de conservation des coordonnées bancaires après achat.
– Durée de vie du panier limitée à la session.
Cette architecture est explicitée par les deux diagrammes de cas d’utilisation suivants (cf.
figures 16.2 et 16.3).
Chaque diagramme est simplement esquissé dans un premier temps comme une liste de cas
par acteur.
16 • Étude de cas 1 – La phase d’initialisation 199
l’enregistrement des clients et leur connexion ainsi que la gestion du catalogue, des stocks et
le suivi des ventes. La troisième version incluera la gestion des catégories et des descriptions,
la consultation des commandes et les fonctions d’administration. Viendront ensuite dans les
versions ultérieures, les avis, les commentaires et les listes de cadeaux.
Les classes et attributs sont obtenus en reprenant chaque cas d’utilisation et en listant les
concepts qui y apparaissent. Le schéma de classes est donné tel que, avec juste l’introduction
d’une classe Personne dont héritent les différents types d’intervenants (cf. figure 16.4).
– Rechercher des ouvrages : Ouvrage (classe), titre (attribut d’Ouvrage),
auteur (attribut d’Ouvrage), ISBN (attribut d’Ouvrage), description (attribut
d’Ouvrage), niveauExpertise (attribut d’Ouvrage), prix (attribut d’Ouvrage),
ventes (attribut d’Ouvrage), avisMoyen (attribut d’Ouvrage), qtéStock (attribut
d’Ouvrage), Catégorie (classe), nom (attribut de Catégorie).
– Consulter un ouvrage.
– S’enregistrer : Client (classe), nom (attribut de Client), prénom (attribut de
Client), adresse (attribut de Client), mail (attribut de Client), login (attribut de
Client), motPasse (attribut crypté de Client), âge (attribut de Client), téléphone
(attribut de Client).
– Se connecter : état (attribut de Client – ex. : déconnecté, connecté).
202 Partie 5. Les études de cas
– Page de recherche avancée : avec saisie des informations et lancement de la recherche (cf.
figure 16.6).
– Page de résultat d’une recherche : liste d’images avec titres et prix (cf. figure 16.7).
– Page d’enregistrement sur le site : saisie des données personnelles, du login et du mot de
passe (cf. figure 16.9).
Les maquettes des autres pages, dont les principales sont listées ici, seront élaborées
ultérieurement dans le processus :
– page de mot de passe oublié,
– page de visualisation des commentaires,
– page externe de saisie des données bancaires,
– page de confirmation d’achat,
– page de création d’une liste de cadeaux, par vidage du panier et saisie des amis,
– page d’accès à une liste de cadeaux, avec saisie du code personnel,
– page de visualisation de la liste de cadeaux disponibles, avec possibilité de mise au panier.
208 Exercices
EXERCICES
La phase d’élaboration est centrée sur l’analyse approfondie des besoins. Les cas d’utilisation
sont détaillés et leur réalisation est analysée en exploitant toutes les formes de diagrammes
UML, selon les besoins.
La phase d’élaboration est réalisée en plusieurs itérations. Ce chapitre décrit en détail la
première itération qui analyse les cas les plus prioritaires : recherche et consultation des
ouvrages, sélection des ouvrages à commander et passation de la commande.
Acteurs secondaires :
Préconditions :
– Être connecté comme Client.
– Se trouver sur la page de description détaillée d’un ouvrage.
Postconditions :
– L’ouvrage est ajouté au panier du client.
– Le nombre d’articles et le montant courant en euros du panier sont affichés.
Déroulement normal :
1. Le client peut ajuster la quantité voulue (par défaut à 1).
2. Le client clique sur le bouton « Ajouter au panier ».
3. L’application affiche le nouveau nombre d’articles et le prix total courant.
Variantes :
Autres cas liés :
Autres remarques :
17.7 LE PROTOTYPAGE
On peut imaginer que cette première itération se termine et se concrétise par le développement
d’un prototype exploratoire de l’aspect le plus critique de l’application.
Il s’agit certainement du processus de règlement faisant appel aux services d’un prestataire
externe. Un prototype programmé en utilisant l’API de ce service peut permettre de lever au
plus tôt les risques que font peser cet aspect sur l’application.
216 Exercices
EXERCICES
Le loyer des compagnies de service public dépend du jet de dés : il faut lancer les dés et
multiplier le résultat par 4 ou 10 si on possède les deux compagnies.
Quand un joueur arrive sur une case « Impôts sur le revenu » ou « Taxe de luxe », il doit payer
le montant indiqué : 10 % de sa trésorerie plafonné à 200 e pour « Impôts sur le revenu » et
75 e pour « Taxe de luxe ».
Quand un joueur arrive sur la case « Allez en prison » il doit aller en prison sans passer par
la case départ. Les dés passent au joueur suivant. On peut être envoyé en prison également
quand on tire une carte qui indique d’aller en prison ou quand on fait trois doubles d’affilée
aux dés.
Il y a trois moyens pour sortir de prison :
– payer une amende de 50 e au début du tour suivant.
– utiliser une carte « Vous êtes libéré de prison » si le joueur en possède une ou s’il l’achète à
un autre joueur. Après utilisation, la carte est remise en dessous du paquet correspondant.
– attendre la fin des trois tours en essayant de se libérer à chaque tour en faisant un double.
Avec un double le joueur est libéré et il repart en relançant les dés. Si à la fin des trois tours
le joueur n’a pas fait de double il doit payer l’amende de 50 e avant de pouvoir repartir.
Quand un joueur arrive sur la case « Prison » lors d’un déplacement normal il est en « simple
visite ». Il n’y a aucune pénalité.
Quand un joueur arrive sur la case « Parc gratuit » il ne se passe rien.
Le paiement d’une enchère se fait en argent. L’enchère commence à n’importe quel prix
offert avec un minimum de 1 e. Tout le monde peut y participer. Le plus offrant emporte
l’enchère.
220 Partie 5. Les études de cas
– Construire un bâtiment : pour acheter des maisons il faut obligatoirement posséder tous les
terrains d’un même groupe de couleur (monopole). Le prix est plus ou moins élevé selon
la rue sur laquelle la maison est construite. Il faut construire uniformément. C’est-à-dire
qu’on ne peut pas construire une deuxième maison sur un terrain si on n’a pas construit
une maison sur chaque terrain d’une même couleur auparavant. On peut construire quatre
maisons au maximum par terrain. On peut échanger quatre maisons contre un hôtel en
payant le prix indiqué. Un seul hôtel par terrain est possible. Il est impossible de construire
quand un terrain du même groupe de couleur est hypothéqué.
– Vendre un bâtiment : ils sont vendus à la moitié de leur valeur d’achat. Ils doivent être
vendus uniformément comme ils ont été achetés.
– Hypothéquer une propriété : quand un joueur n’a plus d’argent pour régler une dette il est
obligé d’hypothéquer une de ses propriétés. Il faut d’abord vendre tous les bâtiments situés
dessus. Le joueur reçoit le montant indiqué de l’hypothèque.
– Lever une hypothèque : il faut payer le montant de l’hypothèque plus 10% d’intérêts.
Le gagnant est le seul joueur qui n’a pas fait faillite. Un joueur qui fait faillite est éliminé du
jeu :
– Il doit rembourser ce qu’il peut avec l’argent restant.
– S’il est mis en faillite par un autre joueur, il doit lui donner toutes les propriétés et les
cartes « Vous êtes libéré de prison ». Le bénéficiaire doit immédiatement payer 10 % des
hypothèques.
– S’il est mis en faillite par la banque, tous les titres de propriété sont mis aux enchères
non hypothéqués. Les cartes « Vous êtes libéré de prison » sont remises dans la pile
correspondante.
Initialement, le logiciel permet d’inscrire les joueurs en leur demandant un nom et une couleur
(parmi celles encore disponibles). Le logiciel propose ensuite de commencer le jeu. Lorsque
cette option est validée, l’argent est distribué, le plateau est créé, les pions de couleurs sont
placés sur la case de départ. On passe ensuite à la détermination du joueur qui commence.
À chaque tour de jeu le logiciel propose au joueur qui a la main de lancer les dés. Il déplace
la position de ce joueur en conséquence et gère les actions obligatoires en fonction de la
18 • Étude de cas 2 – Les user stories 221
case d’arrivée. Le logiciel affiche aussi les options facultatives qui sont possibles selon l’état
courant : achat de propriété, achat/vente de maison ou d’hôtel, hypothèque, etc.
– Demander un loyer
En tant que joueur je veux pouvoir demander un loyer quand un joueur tombe sur une
propriété que je possède. Il faut le faire avant qu’un autre joueur joue.
Priorité : 3 Nombre de points : 1
– Payer un loyer
En tant que joueur je veux payer un loyer quand je tombe sur une propriété possédée par
un autre joueur qui le demande. Le prix dépend de la propriété, de la situation de monopole
ou non et de ses constructions.
Priorité : 3 Nombre de points : 2
– Hypothéquer une propriété
En tant que joueur je veux pouvoir hypothéquer une propriété pendant mon tour. C’est la
seule manière d’obtenir des fonds, les prêts entre joueurs étant interdits.
Priorité : 3 Nombre de points : 1
– Rembourser une hypothèque
En tant que joueur je veux pouvoir rembourser une hypothèque d’une propriété.
Priorité : 3 Nombre de points : 1
– Construire un bâtiment
En tant que joueur je veux pouvoir construire un bâtiment sur une propriété s’il en reste
de disponible et si les conditions sont remplies.
Priorité : 4 Nombre de points : 2
– Organiser une enchère en cas de crise du bâtiment
En tant que jeu je veux pouvoir organiser une enchère si un bâtiment devient disponible en
période de crise du bâtiment. La mise à prix est 1 e. Sans nouvel enchérissement pendant
30 secondes, l’enchère est close et emportée par le mieux disant.
Priorité : 4 Nombre de points : 2
– Vendre un bâtiment
En tant que joueur je veux pouvoir vendre un bâtiment si les conditions sont remplies.
Priorité : 4 Nombre de points : 2
– Offrir les options
En tant que jeu je veux offrir toutes les options admissibles selon la situation aux joueurs
au début et à la fin de leur tour de jeu.
Priorité : 4 Nombre de points : 3
– Arriver sur la case « Allez en prison »
En tant que joueur je veux aller directement en prison sans passer par la case départ quand
je tombe sur la case « Allez en prison ».
Priorité : 5 Nombre de points : 1
– Obtenir un double trois fois de suite
En tant que joueur je veux aller directement en prison sans passer par la case départ quand
j’obtiens trois doubles de suite dans le même tour de jeu.
Priorité : 5 Nombre de points : 1
224 Partie 5. Les études de cas
– Sortir de prison
En tant que joueur je veux pouvoir sortir de prison : en obtenant un double dans un des
trois tours de jeu suivants, ou en utilisant la carte « Vous êtes libéré de prison » si je la
possède, ou en achetant la carte « Vous êtes libéré de prison » à un joueur qui la possède,
ou en payant 50 e lors d’un des trois tours suivants.
Priorité : 5 Nombre de points : 3
– Faillite
En tant que joueur je veux être mis en faillite si je dois plus que je ne peux payer. Je
dois suivre les règles de faillite avec la banque ou le joueur concerné par mon défaut de
paiement.
Priorité : 5 Nombre de points : 3
– Organiser une enchère après une faillite
En tant que jeu je veux pouvoir organiser une enchère pour la vente d’une propriété après
une faillite. La mise à prix est 1 e. Sans nouvel enchérissement pendant 30 secondes,
l’enchère est close et emportée par le mieux disant.
Priorité : 5 Nombre de points : 3
– Fin du jeu
En tant que jeu je veux terminer quand il ne reste plus qu’un joueur qui n’est pas en
faillite.
Priorité : 5 Nombre de points : 1
18.3.1. Itération 1
La première livraison produite par cette itération implante la mise en place des joueurs et du
jeu ainsi que le déplacement des pions autour du plateau de jeu.
a) Tests d’acceptation
Les tests d’acceptation des stories de l’itération sont les suivants.
– Les joueurs
En tant que jeu je veux avoir une liste ordonnée de deux à huit joueurs, caractérisés par
un nom et une couleur.
18 • Étude de cas 2 – Les user stories 225
– Le plateau
En tant que jeu je veux avoir un plateau de jeu basé sur le plateau standard du Monopoly
et tous les éléments complémentaires (états des joueurs, états des cases, etc.).
• Créer un jeu avec 3 joueurs (rouge, bleu, vert). Les 3 pions doivent être sur la case
départ, les 3 joueurs doivent être dotés de 1 500 e et les propriétés doivent toutes être
disponibles.
– Donner la main
En tant que jeu je veux pouvoir donner la main pendant chaque tour de jeu à chaque joueur
dans l’ordre défini ci-dessus.
• Vérifier que l’ordre des joueurs reste le même pour tous les tours de jeu.
Les cases du plateau sont disposées en bordure d’écran. Dans les livraisons ultérieures
chaque case indiquera en outre l’éventuel propriétaire, les éventuels bâtiments construits,
une éventuelle hypothèque et le loyer tenant compte de tous ces éléments.
18 • Étude de cas 2 – Les user stories 227
Les pions de couleur indiquent la position des joueurs sur les cases (au maximum 8). Au
centre du plateau on trouve les caractéristiques des joueurs (nom, couleur) et leur état courant
(trésorerie, patrimoine, etc.) avec une indication du joueur qui a la main actuellement.
Au bas du plateau se situe la zone contextuelle des actions disponibles pour cet utilisateur
ainsi que les affichages correspondants. Dans la première livraison on trouve uniquement
l’action de lancer les dés et l’animation correspondante.
L’analyse des règles du jeu conduit à retenir pour le moment comme classes d’entités :
– Case avec de nombreuses sous-classes (Départ, Prison, AllezEnPrison,
ParcGratuit, Taxe, Impôts, Chance, CaisseDeCommunauté, Propriété,
Gare, CompagnieServicePublic),
– Carte avec deux sous-classes (CarteChance et CarteCaisseDeCommunauté),
– Joueur,
– Dés qui pourra accueillir les deux valeurs tirées et des méthodes comme lancer() et
estDouble().
La première version du schéma comprend aussi une classe de dialogue Plateau et une
classe contrôleur Jeu.
La figure 18.4 décrit cette première version du modèle des classes d’analyse qui inclut aussi
une association situant chaque joueur sur une case.
18.3.2. Itération 2
La deuxième livraison produite par cette itération implante les conséquences du passage par
les cases spéciales du plateau : gain d’argent, perte d’argent ou déplacement du pion.
a) Tests d’acceptation
Les tests d’acceptation des stories de l’itération sont les suivants.
– Arriver sur la case départ
En tant que joueur je veux gagner 200 e quand j’arrive sur la case départ.
• Un joueur arrive sur la case départ. Sa trésorerie augmente de 200 e.
• Un joueur arrive sur une case normale. Sa trésorerie reste inchangée.
EXERCICES
Dans ce chapitre, le jeu tel qu’il est défini au chapitre précédent est repris et le résultat de
l’analyse des besoins est exprimé en termes de cas d’utilisation et de diagramme de cas.
Nom : S’enregistrer
Description : Dès son lancement, le jeu affiche une grille de saisie du nom et de la couleur
que chaque joueur doit remplir.
Acteur principal : Joueur
Acteurs secondaires : Jeu
Préconditions : Moins de 8 joueurs déjà inscrits
Postconditions : Le joueur est enregistré.
Déroulement normal :
1. Saisie du nom.
2. Choix d’une couleur parmi celles qui restent.
3. Ajout du joueur.
4. Passage au joueur suivant ou terminaison de la saisie.
234 Partie 5. Les études de cas
Variantes :
1. Message d’erreur si plus de 8 joueurs.
2. Message d’erreur si le nom est vide.
Autres cas liés :
Autres remarques : Prévoir un bouton d’annulation.
1. Le pion est déplacé vers la case prison sans passer sur la case départ.
Variantes :
Autres cas liés : Déplacer un pion
Autres remarques :
Déroulement normal :
1. Le joueur demande à acheter.
2. Sa trésorerie diminue du montant de l’achat.
Variante :
1. Le joueur renonce à acheter. Une enchère est démarrée.
Autres cas liés : Afficher le plateau
Autres remarques :
EXERCICES
20.1.1. Le texte
Le jeu utilise le plateau de jeu visible à la figure 18.1, 8 pions indiquant la position des
joueurs, 16 cartes « Caisse de communauté », 16 cartes « Chance », 28 cartes de propriété,
de l’argent, 32 maisons, 12 hôtels, 2 dés.
Il existe trois types de propriété : les terrains nus (par groupes de couleur), les gares (4) et les
compagnies de service public (compagnie d’eau et d’électricité).
Quand un joueur s’arrête sur une case n’appartenant à personne il peut l’acheter en payant le
prix indiqué. Si le joueur n’achète pas le terrain, celui-ci est mis aux enchères. L’objectif est
d’acheter tous les terrains d’une même couleur car les revenus sont augmentés. En outre, il
devient possible de construire des maisons et hôtels qui accroissent encore plus les revenus.
Quand un joueur s’arrête sur une propriété qui appartient à quelqu’un d’autre, il doit payer un
loyer. Le loyer pour un terrain nu, c’est-à-dire non construit, est doublé quand on possède tous
les terrains (non hypothéqués) d’un même groupe de couleur (monopole). Le loyer augmente
aussi selon le nombre de bâtiments construits sur le terrain : terrain nu, une maison, deux
maisons, un hôtel, etc. Si la propriété est hypothéquée il n’y a aucun loyer à payer.
Quand un joueur s’arrête sur une propriété qui lui appartient il ne se passe rien. Le loyer
des gares dépend du nombre de gares possédées. Le loyer est doublé à chaque gare en plus.
248 Partie 5. Les études de cas
Le loyer des compagnies de service public dépend du jet de dés : il faut lancer les dés et
multiplier le résultat par 4 ou 10 si on possède les 2 compagnies.
Quand un joueur arrive sur une case « Chance » ou « Caisse de communauté » il doit prendre
la carte au sommet du tas de cartes correspondant. Il doit ensuite suivre les instructions de
la carte. Il peut recevoir de l’argent ou au contraire payer une taxe. La carte est remise sous
le tas de carte. Si le joueur pioche une carte « Vous êtes libéré de prison » il peut la garder
jusqu’à ce qu’elle lui serve. Il est aussi possible de la vendre à un autre joueur.
Quand un joueur arrive sur une case « Impôts sur le revenu » ou une case « Taxe de luxe », il
doit payer le montant indiqué : 10 % de sa trésorerie plafonné à 200 e pour « Impôts sur le
revenu » et 75 e pour « Taxe de luxe »).
Quand un joueur arrive sur la case « Allez en prison » il doit aller en prison sans passer par
la case départ. Les dés passent au joueur suivant. On peut être envoyé en prison également
quand on tire une carte qui indique d’aller en prison ou quand on fait trois doubles d’affilée
aux dés. Il y a trois moyens pour sortir de prison :
– payer une amende de 50 e au début du tour suivant.
– utiliser une carte « Vous êtes libéré de prison » si le joueur en possède une ou s’il l’achète à
un autre joueur. Après utilisation, la carte est remise en dessous du paquet correspondant.
– attendre la fin des trois tours en essayant de se libérer à chaque tour par un double. Avec
un double le joueur est libéré et repart en relançant les dés. Si à la fin des trois tours le
joueur n’a pas fait de double il doit payer l’amende de 50 e avant de pouvoir repartir.
Quand un joueur arrive sur la case « Prison » lors d’un déplacement normal il est en « simple
visite ». Il n’y a aucune pénalité. Quand un joueur arrive sur la case « Parc gratuit » il ne se
passe rien.
Sur la base de l’analyse textuelle, on peut aller plus loin dans la modélisation avec les choix
suivants (cf. le modèle complété de la figure 20.2).
– Pour chaque Joueur on peut conserver son dernier tirage de Dés comme un attribut
valeur de l’association a_tiré.
– Les pions ne sont pas obligatoirement représentés comme des objets. La notion peut se
traduire par une association positionné_sur entre Joueur et Case.
– Par contre, la représentation des cartes peut être utile, avec les classes Carte Caisse
de communauté et Carte Chance. Leurs objets sont ordonnés, tirés par les joueurs
et parfois possédés par eux (comme les cartes « Vous êtes libéré de prison »).
Deux associations mémorisent la dernière carte tirée de chaque paquet et qui possède quoi
(dernière_tirée et possédée_par).
La notion de carte de propriété est représentée par l’association (propriétaire_de)
entre Joueur et les cases de type Propriété.
– La classe Case est spécialisée en Propriété, Départ, Parking, Prison simple
visite, Allez en prison, Impôts sur le revenu, Taxe de luxe,
Chance, Caisse de communauté. La classe Propriété est spécialisée en
Terrain, Gare et Compagnie.
Parmi les attributs de Propriété on retient la couleur, le prix, les niveaux de loyer, la
valeur hypothécaire, etc.
– Les maisons et hôtels ne sont pas représentés comme des objets. Pour les connaître il
suffit de compter les maisons et hôtels disponibles au niveau des attributs de la classe Jeu
(maisons_dispo et hôtels_dispo) et de compter les maisons et hôtels construits
sur les cases Propriété (maisons_bâties, hôtels_bâtis).
Les études de cas
Partie 5.
250
F IGURE 20.2 Le modèle complété
20 • Étude de cas 2 – Les classes du domaine 251
EXERCICES
(5) Mettre en œuvre au maximum les bonnes pratiques pour la qualité, telles les revues et
inspections ou le développement dirigé par les tests.
(6) Favoriser le travail en équipe.
LES APPORTS
Pour répondre à la complexité du domaine du développement logiciel et de sa phase
initiale d’analyse des besoins, cet ouvrage apporte dans sa première moitié des éléments de
compréhension et de culture générale.
Dans sa seconde moitié, l’ouvrage détaille les techniques essentielles pour la compréhension
du contexte métier, le recueil des besoins et leur approfondissement par la modélisation. Le
tableau qui suit donne une indication de leur fréquence d’utilisation dans les deux principales
approches de développement.
LE MOT DE CONCLUSION
Avec le volume compagnon dédié à la conception des applications [Lon14], l’ensemble offre
un panorama du développement logiciel dans sa globalité assez complet pour être réaliste et
assez synthétique pour rester compréhensible.
Corrigés des exercices
Exercice 1.1.
L’erreur de base réside dans la réutilisation abusive d’une partie du logiciel des Ariane 4,
avec une insuffisance des tests et simulations avec la trajectoire d’Ariane 5 à la place de
la trajectoire d’Ariane 4. Les deux trajectoires n’étant pas semblables cela a conduit à une
conversion impossible à faire. Autrement dit, un module qui avait une « contrainte cachée »
(BH < 32768), valide pour Ariane 4 mais pas pour Ariane 5, a été abusivement réutilisé et
intégré. Les conditions d’utilisation auraient dû faire partie de la spécification du module.
Le fait que le programme ne contienne pas de protection en cas d’erreur d’opérande, c’est-à-
dire d’exception Ada pour cette conversion alors que d’autres étaient protégées, n’est pas
réellement une erreur de programmation mais une décision de conception prise en 1980
et justifiée pour Ariane 4 en raison des marges de sécurité constatées. Cependant, cette
« optimisation » aurait dû être mieux documentée puisqu’elle générait une contrainte de
validité du module.
On peut enfin souligner l’absence de redondance logicielle (programmes ayant les mêmes
spécifications développés par des équipes différentes). La redondance matérielle, avec des
calculateurs exécutant le même programme, ne protège que contre les pannes matérielles.
Exercice 1.2.
Le matériel, après correction des défauts initiaux, connaît une phase de fonctionnement
optimum avant une dégradation assez rapide en fin de vie pour des problèmes d’usure
(courbe en forme de « baignoire »).
Le logiciel devrait en théorie atteindre un fonctionnement optimum après correction des
bugs initiaux, sans phénomène d’usure. En réalité, tout logiciel subit des évolutions. Chaque
évolution génère de nouveaux bugs qui sont corrigés rapidement. Mais globalement toutes
ces évolutions conduisent à une lente détérioration due à l’augmentation de la complexité et
256 Corrigés des exercices
aux remises en cause plus ou moins maîtrisées de la conception initiale. D’où la croissance
en dents de scie de la courbe de défaillance réelle.
Exercice 1.3.
a) Sécurité, intégrité des données, disponibilité des données, performance des transactions,
convivialité. Autrement dit un site agréable à utiliser dans lequel on peut avoir confiance.
b) Correction, fiabilité, robustesse. Autrement dit un système qui fait tout pour amener la
fusée à sa bonne destination.
c) Correction, fiabilité, réutilisation, interopérabilité. Autrement dit un système efficient et
facile à industrialiser.
Exercice 1.4.
Dans une tâche non partitionnable l’augmentation du nombre d’hommes reste sans effet.
Dans une tâche partitionnable ne nécessitant pas de communication, l’augmentation du
nombre d’hommes diminue la durée, qui tend asymptotiquement vers 0.
Dans une tâche partitionnable nécessitant des communications, l’effort de communication
doit être ajouté à la quantité de travail à faire. Dans le cas d’interrelations complexes cet
effort de communication peut compenser complètement ou même dépasser le gain réalisé en
partageant la tâche.
Si chaque participant doit se coordonner avec chaque autre participant l’effort de commu-
nication ec croit comme n(n − 1)/2 où n est le nombre de participants (n = 2, ec = 1 ;
n = 3, ec = 3 ; n = 4, ec = 6 ; n = 5, ec = 10 ; n = 6, ec = 15 ; n = 7, ec = 21, etc.)
Exercice 2.1.
Les négociations sont utiles en cas de divergence de points de vue (ex. : marketing contre
techniciens, clients contre informaticiens) ou de divergence sur les priorités. L’analyse des
risques associés aux besoins est souvent une technique utile.
Exercice 2.2.
a) Exemples de besoins fonctionnels (certains sont structurés avec des sous-besoins plus
spécifiques et moins abstraits) :
F1 : Le programme doit prendre en compte tout appel externe.
F2 : Le programme doit prendre en compte tout appel interne (sélection d’un étage depuis
l’intérieur de la cabine).
F3 : Le programme doit planifier les activités de l’ascenseur de façon raisonnable.
F3.1 : Si l’ascenseur ne contient pas de passager, il doit demeurer au rez-de-chaussée en
attendant la prochaine requête.
F3.2 : L’ascenseur ne doit pas modifier le sens de son déplacement s’il contient des
passagers qui n’ont pas encore atteint leur destination.
F4 : Le programme doit prendre en compte tout dysfonctionnement.
F4.1 : Il doit détecter et signaler tout dysfonctionnement.
Corrigés des exercices 257
F4.2 : Il doit prendre la décision qui s’impose (arrêter l’ascenseur, bloquer l’ouverture
ou la fermeture des portes, etc.).
F5 : Le programme doit être apte à gérer plusieurs ascenseurs.
Exercice 2.3.
a) Non.
Dupont : 10-5/3 Résultats possibles : 8,33 ou 8 ou 8,5 ou 8,333333
Dutif : 4-16/3 Résultats possibles : -1,33 ou 0 ou -1,5 ou -1,333333
Duduche : 10-3/3+ ? Résultats possibles : 12 ou 8 ou 9
selon les arrondis et la manière de compter les doubles réponses comme justes, fausses ou
pas prises en compte.
b) Une rédaction possible : « l’examen est un ensemble de 20 questions à réponses multiples.
Chaque bonne réponse à une question rapporte 1 point. Chaque mauvaise réponse fait perdre
1/3 de point. Chaque question sans réponse ou avec des réponses multiples donne 0 point. La
note est arrondie au demi-point le plus proche ou au demi-point supérieur en cas d’égalité.
La note minimum est 0 ».
Avec cette spécification non ambiguë, Dupont obtient 8,5, Dutif 0 et Duduche 9.
Exercice 2.4.
La solution de Myers [Mye79] est la suivante. Chaque oui à une question donne un point. À
noter que les programmeurs professionnels obtiennent en moyenne entre 7 et 8.
(1) Présence d’un cas de test pour un triangle équilatéral ?
(2) Présence d’un cas de test pour un triangle isocèle (un vrai, pas (2, 2, 4) qui n’est pas un
triangle) ?
(3) Présence d’un cas de test pour un triangle scalène (un vrai) ?
(4) Présence de cas de test pour les permutations possibles d’un triangle isocèle (ex. : (3, 3,
4), (3, 4, 3), (4, 3, 3)) ?
(5) Présence d’un cas de test avec un côté à 0 ?
(6) Présence du cas de test (0, 0, 0) ?
(7) Présence d’un cas de test avec une valeur négative ?
(8) Présence d’un cas de test avec un côté égal à la somme des deux autres (ex. : (1, 2, 3)) ?
(9) Présence de cas de test pour les permutations possibles du cas précédent (ex. : (1, 2, 3),
(1, 3, 2), (3, 1, 2) . . . ) ?
(10) Présence d’un cas de test où la somme des deux plus petits côtés est inférieure au
troisième (ex. : (2, 3, 6)) ?
258 Corrigés des exercices
(11) Présence de cas de test pour les permutations possibles du cas précédent (ex. : (2, 3, 6),
(2, 6, 3), (3, 2, 6) . . . ) ?
(12) Présence d’un cas de test avec des valeurs non entières ?
(13) Présence d’un cas de test avec une valeur entière trop grande (> maxint) ?
(14) Présence d’un cas de test avec un nombre incorrect de données (ex. : 2 ou 4) ?
(15) Présence de la réponse attendue pour tous les cas de test ?
Exercice 2.5.
Les buts Autoriser les emprunts de longue durée et Assurer une
disponibilité suffisante sont en conflit.
Exercice 2.6.
a) 1. Variable f non initialisée.
2. Tour de boucle en trop.
3. Opération sur un mauvais indice (décrémentation mal placée).
4. Retour d’une mauvaise variable.
Version corrigée :
int factorielle(int n) {
int f = 1;
while (n > 0) {
f = f*n;
n = n-1;
}
return f;
}
Exercice 2.7.
a) A et H sont au niveau 0, B, C, I et J au niveau 1, D, E et K au niveau 2, L et F au niveau 3
et G au niveau 4.
Après optimisation des tâches fictives on parvient au graphe PERT suivant :
Exercice 3.1.
(1) Agrégation (6) Association
(2) Association (7) Généralisation/spécialisation
(3) Généralisation/spécialisation (8) Agrégation
(4) Agrégation (9) Association
(5) Agrégation (10) Association
260 Corrigés des exercices
Exercice 3.2.
a) Graphe non orienté
b) Graphe orienté
Exercice 3.3.
Corrigés des exercices 261
Exercice 3.4.
Le diagramme d’activités de la réparation d’un véhicule est donné par l’image de gauche
ci-après. À noter que les acteurs sont représentés par des paquets (packages) alors que la
représentation habituelle utilise plutôt des couloirs (swimlanes).
Exercice 3.5.
Le diagramme des séquences du carnet d’adresses est donné par l’image de droite ci-après.
Exercice 4.1.
a) Le prototypage qui permet de se rendre compte concrètement et rapidement des services
envisagés et des limites de la future application est à privilégier dans ce cas.
b) La cascade ou sa variante en V sont à privilégier car les risques sont faibles grâce à la bonne
connaissance du domaine et à l’expérience de l’équipe de développement. Une planification
du processus est importante pour ce genre de gros projet et ces approches permettent cette
planification.
262 Corrigés des exercices
Exercice 4.2.
– Cascade et V : projet classique, de grande taille.
– Incrémental : projet classique, de petite ou moyenne taille.
– Spirale : projet critique (gestion des risques), de grande taille.
– Prototypage : projet mal défini.
– Agile : projet innovant, de petite ou moyenne taille.
Exercice 4.3.
La communication avec les clients et utilisateurs est fondamentale au niveau du recueil des
besoins. La communication au sein de l’équipe de développement est fondamentale tout au
long du processus.
La planification du déroulement du projet est indispensable. Elle peut être réalisée a priori
comme dans les approches prescriptives (dès que les besoins sont connus) ou de manière
souple et progressive comme dans les approches agiles (avant chaque itération).
La modélisation est une composante essentielle pour comprendre le problème (analyse des
besoins) et produire une solution qui satisfasse ces besoins (conception).
La construction recouvre la génération du code et le test, lors de la phase d’implantation.
Le déploiement de toute l’application ou d’une livraison partielle permet aux clients et
utilisateurs de retourner leur feedback après validation.
Exercice 5.1.
Exercice 5.2.
Q1. Quel rôle est responsable de la définition des priorités au sein du product backlog ?
a) Product Owner
Q2. Quel rôle n’est pas défini dans Scrum ?
c) Product Manager
Corrigés des exercices 263
Exercice 5.3.
Un cas conforme au déroulement normal.
Un cas conforme à la variante 1 (règlement immédiat).
Un cas conforme à la variante 2 (réservation avec prestation optionnelle).
Un cas conforme à la variante 3 (voyageur sur la liste noire).
Quatre cas conformes à des combinaisons de variantes (1 et 2, 1 et 3, 2 et 3, 1 et 2 et 3).
Un cas qui viole la précondition 1 (une étape de vol erronée).
Un cas qui viole la précondition 2 (pas de place dans la classe souhaitée sur une étape de vol).
Un cas qui viole la précondition 3 (une contrainte de réservation ou de séjour non satisfaite).
Exercice 5.4.
Un tableau d’entiers non redondant : [4, 7, 2, 8] donne [2, 4, 7, 8].
Un tableau vide : [] donne [].
Un tableau avec une valeur redondante dans différentes positions :
[4, 7, 2, 7] donne [2, 4, 7] (pas en premier)
[7, 4, 7, 2] donne [2, 4, 7] (en premier)
[4, 2, 7, 7] donne [2, 4, 7] (groupées en fin)
[7, 7, 4, 2] donne [2, 4, 7] (groupées en début).
Un tableau avec uniquement des valeurs redondantes : [4, 4, 4] donne [4].
Un tableau avec une seule valeur : [5] donne [5].
Un tableau avec des valeurs nulles : [2, 0, 4, 0] donne [0, 2, 4].
Un tableau avec des valeurs négatives : [−2, 7, −1, 6] donne [−2, −1, 6, 7].
264 Corrigés des exercices
Un tableau avec plusieurs groupes de valeurs redondantes : [2, 3, 2, 3, 4] donne [2, 3, 4].
Un tableau déjà trié : [5, 6, 8] donne [5, 6, 8].
Exercice 5.5.
Le premier test correspond à n = 1. On rappelle que 0 et 1 ne sont pas premiers.
@Test
public void test0() {
System.out.println("est premier de 0");
boolean resultat = Premier.estPremier(0);
assertEquals("resultat", false, resultat);
}
Ce code ne compile pas car le code de la méthode estPremier n’est pas écrit.
Pour le faire compiler on peut se contenter dans un premier temps d’écrire :
public static boolean estPremier(int n) {
if (n == 0) return false;
else return true;
}
Le test passe.
On ajoute un deuxième test pour 1.
@Test
public void test1() {
System.out.println("est premier de 1");
boolean resultat = Premier.estPremier(1);
assertEquals("resultat", false, resultat);
}
Le deuxième test ne passe pas. On peut modifier la méthode estPremier a minima par :
public static boolean estPremier(int n) {
if (n <= 1) return false;
else return true;
}
Les deux tests passent.
On ajoute un troisième test pour n = 2.
@Test
public void test2() {
System.out.println("est premier de 2");
boolean resultat = Premier.estPremier(2);
assertEquals("resultat", true, resultat);
}
Les trois tests passent.
On ajoute un quatrième test pour n = 3.
@Test
public void test3() {
System.out.println("est premier de 3");
boolean resultat = Premier.estPremier(3);
assertEquals("resultat", true, resultat);
}
Corrigés des exercices 265
Les sept tests passent toujours. On se rend compte aussi qu’il est inutile d’incrémenter
candidat jusqu’à n. Il suffit d’atteindre la racine carrée de n autrement dit que
candidat*candidat <= n :
public static boolean estPremier(int n) {
if (n <= 1) return false;
if (n % 2 == 0) return (n == 2);
for (int candidat = 3; candidat*candidat <= n; candidat=candidat+2) {
if (n % candidat == 0) return false;
}
return true;
}
Les sept tests passent toujours.
On ajoute pour terminer deux tests pour n = 13 et n = 15.
@Test
public void test13() {
System.out.println("est premier de 13");
boolean resultat = Premier.estPremier(13);
assertEquals("resultat", true, resultat);
}
@Test
public void test15() {
System.out.println("est premier de 15");
boolean resultat = Premier.estPremier(15);
assertEquals("resultat", false, resultat);
}
Tous les tests passent. On peut être raisonnablement confiant dans cette solution.
Exercice 6.1.
Un Business Use Case (cas métier) est un stéréotype de cas d’utilisation UML (une notation
spécialisée).
Chaque cas métier est caractérisé par une catégorie dont les valeurs sont prises dans une
énumération Process Category avec trois valeurs possibles : core (processus cœur de métier),
support (processus annexe de support technique), management (processus annexe de gestion).
Les autres caractéristiques sont : une description du workflow (du processus métier), une
description des risques (liés à son implantation et/ou son exécution), une description des
possibilités offertes (de l’intérêt du cas), une description des special requirements (autres
exigences ou caractéristiques).
Corrigés des exercices 267
Exercice 6.2.
a) On utilise fréquemment un arbre de décomposition indiquant que tel but assez général
dépend de la satisfaction de tels sous-buts plus précis.
Exercice 6.3.
Un cas métier correspond à un service significatif pour un ensemble de participants. Un cas
d’utilisation correspond à une interaction d’un acteur principal avec le système.
En général, un service significatif met en jeu plusieurs acteurs internes et externes et chacun
d’eux est susceptible d’être l’acteur principal d’une ou plusieurs interactions et donc d’un ou
plusieurs cas d’utilisation.
On peut dire que les cas métiers définissent le contexte dans lequel un ensemble de cas
d’utilisation s’inscrivent pour rendre un service significatif aux utilisateurs.
Exercice 7.1.
a) Le diagramme des cas métier est donné page suivante.
Remarque
On pourrait aussi définir deux cas métier Ramener véhicule et Réglement immédiat
avec une relation « extend » du deuxième vers le premier.
b) Spécification du cas métier Ramener et régler.
Exercice 7.2.
270 Corrigés des exercices
Exercice 7.3.
Exercice 7.4.
Corrigés des exercices 271
Exercice 7.5.
Exercice 8.1.
Les noms considérés comme les plus significatifs sont soulignés à leur première apparition.
Les autres noms sont écartés car trop généraux ou redondants.
La société LocAuto loue des voitures et des camionnettes. Le prix de la location est composé
d’un forfait journalier et d’un supplément kilométrique au-delà de 200 km parcourus par jour
de location. La location se fait par journée (nb) sur une ou plusieurs journées consécutives
avec départ et retour à l’agence. Le forfait journalier tient compte de la catégorie (véhicule
léger économique ou véhicule léger luxe ou camionnette) du véhicule et de la période
(semaine, week-end, vacances été). Le supplément kilométrique est fonction de la catégorie
du véhicule. L’âge du conducteur et le nombre d’années depuis l’obtention du permis
influent aussi sur le calcul du prix de la location. Ce prix inclut l’assurance du véhicule et du
conducteur tous deux fonction de la catégorie du véhicule. C’est en fonction de son type
(marque et modèle) qu’un véhicule est affecté à une catégorie.
Lors de la réservation (par téléphone, mail ou visite à l’agence), le client précise à l’employé
d’agence les caractéristiques de sa demande : son nom, adresse et âge, la date d’obtention
de son permis, la date et la durée de la location, la catégorie de véhicule demandée. Il reçoit
une réponse positive ou négative selon les disponibilités à la date indiquée. Un véhicule est
immédiatement réservé. L’employé prépare le contrat de location avant la date prévue pour
l’emprunt du véhicule.
Lors de l’emprunt du véhicule à l’agence le client doit montrer son permis de conduire à
l’employé, signer le contrat de location et déposer une caution (montant) qui dépend de la
catégorie du véhicule. Une fiche indiquant l’état du véhicule lui est soumise. Le client indique
les défauts supplémentaires qu’il constate (ou leur absence) afin de mettre à jour la fiche d’état
qui reste stockée à l’agence. Le kilométrage au départ est relevé.
Lorsque le client ramène le véhicule à l’agence, l’employé compare son état en sa
présence avec la fiche d’état. Les éventuels défauts supplémentaires sont ajoutés sur la
fiche d’état et des frais de remise en état sont évalués. Le kilométrage à l’arrivée est relevé
par l’employé d’agence. La facture incluant la location et les frais de remise en état est
rédigée. Normalement le client la règle immédiatement et la caution lui est rendue. En cas
272 Corrigés des exercices
Exercice 8.2.
Les noms considérés comme les plus significatifs sont soulignés à leur première apparition.
Les autres noms sont écartés car trop généraux ou redondants.
Sont retenus comme classes, en tant que concepts significatifs porteurs d’informations :
Captage, Mois, Réservoir, Analyse, Substance, Technicien. Les autres
éléments constituent des attributs à ventiler sur ces classes.
L’eau provient de captages par forage dans les nappes souterraines. Chaque captage est
caractérisé par un nom, un débit maximum exprimé en m3 d’eau par heure, une profondeur et
un diamètre du forage. Pour chaque captage, on conserve le débit moyen calculé pour chaque
mois de l’année, ce qui permet de prévoir les éventuels problèmes d’alimentation en eau.
Chaque captage alimente grâce à des pompes automatiques un ou des réservoirs (châteaux
d’eau) dont la fonction est le stockage de l’eau à distribuer. Chaque réservoir a un nom et
une capacité maximale. Pour garantir la continuité du service de distribution d’eau potable,
chaque réservoir est relié, en plus de son captage principal, à un ou plusieurs captages de
secours pour le cas où le captage principal soit interrompu. La mise en service de la connexion
d’un réservoir à l’un de ses captages de secours est sous la responsabilité d’un technicien, dont
il faut connaître le nom et le numéro de téléphone portable.
La production d’eau est soumise à des normes de qualité exigeantes. Le syndicat de
communes effectue fréquemment des analyses de l’eau en collaboration avec un laboratoire
indépendant. Ces analyses sont réalisées soit au niveau des captages, soit au niveau des
réservoirs. Deux critères de qualité biologiques sont impératifs : on ne tolère la présence
274 Corrigés des exercices
d’aucune bactérie de type Escherichia Coli ni d’aucun entérocoque dans l’eau. En ce qui
concerne les substances chimiques et les métaux (arsenic, cadmium, cyanure, mercure,
plomb, etc.), la réglementation fixe pour chacun d’entre eux une concentration maximale à
ne pas dépasser exprimée en microgramme par litre. Il est imposé de conserver les résultats
obtenus à chaque analyse.
Exercice 8.3.
Exercice 9.1.
a) context : Emprunt
inv : bien.personne = personne
b) context : Emprunt
inv : dateDébut < dateFin
c) context : Personne
inv : Personne.allInstances->forAll(p1, p2 | p1 <> p2
implies p1.id <> p2.id)
Corrigés des exercices 275
Exercice 9.2.
a) context Employé
inv: self.chef->notEmpty() implies self.age() < self.chef.age()
b) context Employé
inv: self.chef->notEmpty() implies self.salaire < self.chef.salaire
c) context Employé
inv: self.dateEmbauche > self.dateNaissance
d) context Employé
inv: self.gère->notEmpty() implies self.gère.dateDébut >
self.dateEmbauche
e) context Department
inv: self.travaille_dans->includes(self.gère)
f) context Employé
inv: self.travaille_pour.héberge->includesAll(self.travaille_dans)
g) context Employee
inv: let totalHeures : Integer =
self.travaille_dans->collect(heures)->sum() in totalHeures >= 30
and totalHeures <=50
h) context Employé
inv: self.subordonnés->excludes(self)
Exercice 10.1.
a) En tant qu’utilisateur je veux pouvoir maîtriser rapidement l’application.
Non testable sous cette forme (signification de rapidement ?).
b) En tant qu’utilisateur je veux pouvoir éditer mon adresse sur mon CV.
Granularité trop faible (revient à écrire une story par champ modifiable !).
c) En tant qu’administrateur je veux pouvoir accéder au log de toutes les erreurs à l’exécution
afin de pouvoir déboguer l’application.
Correct.
d) En tant qu’utilisateur je veux pouvoir annuler jusqu’à 50 actions.
Correct.
e) En tant que développeur je veux utiliser Log4J afin de gérer les logs.
Ni un besoin ni une contrainte, plutôt un choix technique.
f) En tant qu’utilisateur je veux pouvoir exporter mes données en XML.
Correct.
Exercice 10.2.
a) En tant que client je veux pouvoir ajouter des produits dans mon panier.
En tant que client je veux pouvoir supprimer des produits dans mon panier.
276 Corrigés des exercices
En tant que client je veux pouvoir modifier les quantités dans mon panier.
En tant que client je veux pouvoir valider la commande des articles dans mon panier.
En tant que client je veux pouvoir spécifier les modalités de livraison de ma commande.
En tant que client je veux pouvoir régler ma commande ce qui déclenche sa livraison.
b) En tant qu’internaute je veux pouvoir créer un compte client afin de pouvoir me loguer.
En tant que client je veux pouvoir me loguer afin d’accéder aux pages sécurisées.
En tant que client je veux pouvoir modifier mon compte client.
En tant que client je veux pouvoir supprimer mon compte client.
En tant que client je veux pouvoir changer de mot de passe si je l’ai oublié.
c) En tant que gérant de boutique en ligne je veux pouvoir ajouter des produits au catalogue.
En tant que gérant de boutique en ligne je veux pouvoir supprimer des produits du catalogue.
En tant que gérant de boutique en ligne je veux pouvoir mettre à jour les produits du
catalogue en particulier les prix et les descriptions.
Nom : S’inscrire
Description : Création et enregistrement d’un compte client.
Acteur principal : Internaute
Préconditions : Se trouver sur la page d’accueil.
Postconditions : Le compte client est créé, non validé et donc pas encore utilisable.
Déroulement normal :
1. Remplir le formulaire.
2. Valider le formulaire.
Variantes :
2.1. Saisie refusée.
Contraintes : Sécurisation de la transmission et du stockage des données personnelles.
Nom : Se connecter
Description : Authentification d’un client.
Acteur principal : Client
Préconditions :
– Posséder un compte validé.
– Se trouver sur la page d’accueil.
Postconditions : Les actions réservées aux clients sont disponibles.
Déroulement normal :
1. Remplir le formulaire.
2. Valider le formulaire.
Variante :
2.1. Saisie refusée.
Contraintes : Sécurisation de la transmission des données personnelles.
Nom : Se déconnecter
Description : Retour au rôle de simple internaute visiteur.
278 Corrigés des exercices
2.1. Annulation.
3.1. Erreur de saisie.
Contraintes : –
Exercice 13.3
L’IHM de la recherche d’ouvrages inclut une page pour la recherche simple par mots clés et
une pour la recherche avancée par critères. Après validation des paramètres par l’internaute,
rechercher() appelle chercherLivres() de ContrôleurRecherche. Grâce
à getLivres() de Catalogue une liste de livres est retournée et affichée par le
Corrigés des exercices 285
Exercice 15.1.
Navigation dans une application de gestion de contacts.
288 Corrigés des exercices
Exercice 15.2.
Modèle de navigation sous la forme d’un diagramme d’états.
Exercice 16.1.
On peut discerner deux risques principaux pour ce cas :
– sa complexité, grossièrement évaluable par le nombre élevé de pages à développer,
– le fait d’intégrer l’utilisation d’un service externe pour le règlement. La recherche d’un tel
service, son évaluation, et son intégration au sein de l’application via l’API offerte, peut
être source de difficultés particulières.
Exercice 16.2.
On peut esquisser cette page de la manière suivante :
Corrigés des exercices 289
Exercice 17.1.
Nom : Se connecter
Description : Un internaute peut se connecter afin de prendre le rôle de Client qui
permet de passer des commandes, créer des listes de cadeaux et donner des avis et
commentaires.
Acteur principal : Internaute
Acteurs secondaires :
Préconditions :
– Être positionné sur la page d’accueil.
– Ne pas être déjà connecté.
Postconditions :
– L’internaute prend le rôle de Client.
– Les fonctionnalités réservées aux clients apparaissent sur la page d’accueil.
Déroulement normal :
1. L’internaute saisit login et mot de passe et appuie sur le bouton « Connexion ».
2. L’application met à jour la page d’accueil avec les fonctionnalités supplémentaires
offertes aux clients.
290 Corrigés des exercices
Variantes :
1. Si la connexion échoue un message apparaît. Les informations doivent être ressaisies.
Autres cas liés :
Autres remarques :
– En cas d’oubli du mot de passe, en appuyant sur le bouton « Mot de passe oublié »,
une page apparaît avec une question secrète dont il faut donner la bonne réponse pour
pouvoir saisir un nouveau mot de passe.
Nom : S’enregistrer
Description : Un internaute (ou un client qui a oublié une précédente inscription sur le
site) peut s’enregistrer comme Client qui peut passer des commandes, créer des listes
de cadeaux et donner des avis et commentaires.
Acteur principal : Internaute ou Client
Acteurs secondaires :
Préconditions :
– Être positionné sur la page d’accueil.
– Ne pas être déjà connecté.
Postconditions :
– Un nouveau Client est enregistré.
– Les fonctionnalités réservées aux clients apparaissent sur la page d’accueil.
Déroulement normal :
1. L’internaute appuie sur le bouton « s’enregistrer ».
2. L’application affiche une page demandant de manière obligatoire nom, prénom, mail,
login, mot de passe, réponse à la question secrète et de manière facultative adresse, âge
et numéro de téléphone.
3. L’internaute saisit les données et appuie sur le bouton « Enregistrer ».
4. L’application réaffiche la page d’accueil avec un message demandant de se connecter.
Variantes :
1. Message d’erreur et retour à la page d’enregistrement si des erreurs ou oublis sont
détectés après enregistrement.
Autres cas liés : Maintenir le site (nettoyer le fichier clients).
Autres remarques :
Variantes :
1. Si le panier est vide la création de la liste échoue.
2. Si la liste des amis est vide la création de la liste échoue.
Autres cas liés :
Autres remarques :
– Les adresses mail des amis doivent être correctes.
Postconditions :
– Le commentaire est stocké dans la base, avec un date et un état « à vérifier ». Un
Éditeur devra la valider avant parution sur le site à l’état « vérifié ».
Déroulement normal :
1. Le client appuie sur le bouton « Votre commentaire » sur la page d’un ouvrage.
2. Le client saisit un texte dans la zone de saisie qui apparaît et appuie sur le bouton
« Soumettre pour validation ».
3. L’application stocke le commentaire en attente de validation par un Éditeur.
Variantes :
1. L’opération échoue si le texte est vide.
Autres cas liés :
Examiner les commentaires en attente de validation
Autres remarques :
Exercice 17.2.
Diagramme de cas du front office : cf. page suivante.
Exercice 17.3.
L’analyse a mis en évidence des manques à la première version, comme les absences :
– de la classe Commentaire avec les attributs texte, date et état (à valider, validé, invalidé)
et son association aux ouvrages,
– de l’historique des avis donnés par les clients sur les ouvrages,
– de la réponse à la question secrète des clients,
– de la description de l’événement fêté par la liste de cadeaux.
Corrigés des exercices 295
296 Corrigés des exercices
Corrigés des exercices 297
Exercice 17.4.
Exercice 17.5.
Exercice 18.1.
Tests d’acceptations de :
Acheter une propriété
(1) Un joueur arrive sur une propriété qui n’appartient à personne. S’il accepte de l’acheter,
il en devient propriétaire et sa trésorerie diminue du prix d’achat.
(2) Un joueur arrive sur une propriété qui n’appartient à personne. S’il refuse de l’acheter,
une enchère est organisée pour déterminer le joueur qui l’achète et le prix auquel il
l’achète.
(3) Un joueur arrive sur une propriété qui lui appartient déjà. Rien ne se passe.
(4) Un joueur passe au-dessus d’une propriété qui n’appartient à personne. Rien ne se passe.
298 Corrigés des exercices
Exercice 18.2.
Maquette de l’écran de participation à une enchère : un chronomètre permet de suivre
l’écoulement du temps depuis la dernière offre dont la valeur est rappelée. Le bouton
enchérir arrête le chronomètre et permet la saisie d’une offre.
Exercice 19.1.
Variantes :
Autres cas liés : Afficher le plateau
Autres remarques :
Exercice 19.2.
Exercice 20.1.
a) Au début du jeu pour procéder au choix du joueur qui jouera en premier. En cours de jeu
pour détecter les doubles et les successions de doubles.
b) Par exemple, avec un attribut booléen a_la_main dans la classe Joueur.
c) Un attribut entier pour compter les doubles.
Un attribut entier qui indique le nombre de tours à rester en prison.
Exercice 20.2.
Le plus simple est d’ajouter {ordered} à l’agrégation Plateau vers Case. Cela signifie
l’existence d’une liste ordonnée d’objets Case au niveau de l’objet Plateau.
On pourrait aussi introduire une association réflexive suivant au niveau de la classe Case.
Cela signifie gérer une liste chaînée d’objets Case.
Exercice 20.3.
[Gro09] Jean-Claude G ROSJEAN. User Story vs Use case : soyez Agile ! 2009. URL :
www.qualitystreet.fr/2009/02/16/user- story- vs- use-
case-soyez-agile/.
[Jac+92] Ivar JACOBSON et al. Object-Oriented software engineering: A use case driven
approach. Addison-Wesley, 1992.
[JBR99] Ivar JACOBSON, Grady B OOCH et James RUMBAUGH. The Unified Software
Development Process. Addison-Wesley, 1999.
[Jef01] Ron J EFFRIES. Essential XP: Card, Conversation, Confirmation. 2001. URL :
xprogramming.com/xpmag/expCardConversationConfirmation.
[Joh04] Simon J OHNSTON. Rational UML Profile for Business Modeling. 2004. URL :
www . ibm . com / developerworks / rational / library / 5167 .
html.
[Kru04] Philippe K RUCHTEN. The Rational Unified Process: An Introduction. Addison-
Wesley, 2004.
[Kru95] Philippe K RUCHTEN. « Architectural Blueprints – The « 4+1 » View Model of
Software Architecture. » IEEE Software 12.6 (1995), p. 42–50.
[Lar95] Craig L ARMAN. Applying UML and Patterns. Prentice Hall, 1995.
[Lie04] Benjamin L IEBERMAN. UML Activity Diagrams: Detailing User Interface Na-
vigation. 2004. URL : www . ibm . com / developerworks / rational /
library/4697.html.
[Lon14] Jacques L ONCHAMP. Conception d’applications en Java/JEE. Principes,
patterns et architectures. Dunod, 2014.
[Mey85] Bertrand M EYER. « On formalism in specifications ». IEEE Software 2.1 (1985),
p. 6–26.
[Min65] Marvin M INSKY. « Matter, mind and models ». In Proceedings of IFIP
Congress (1965), p. 45–49.
[Mye79] Glenford J. M YERS. The art of software testing. Wiley, 1979.
[Ng02] Pan-Weig N G. « Effective Business Modeling with UML: Describing Business
Use Cases and Realizations ». The Rational Edge (nov. 2002).
[Nor06] Dan N ORTH. Introducing BDD (Behaviour-Driven Development). 2006. URL :
dannorth.net/introducing-bdd/.
[NWM10] John N OLL et Liu W EI -M ING. « Requirements elicitation in open source
software development: a case study ». In Proceedings of the 3rd International
Workshop on Emerging Trends in Free/Libre/Open Source Software Research
and Development (2010), p. 35–40.
[OMG14] OMG. Object Constraint Language. 2014. URL : www . omg . org / spec /
OCL/2.4/PDF.
[OMG97] OMG. UML Extension for Business Modeling. 1997. URL : www.omg.org/
cgi-bin/doc?ad/97-08-07.
[PP03] Mary P OPPENDIECK et Tom P OPPENDIECK. Lean Software Development: An
Agile Toolkit. Addison-Wesley, 2003.
[Pre09] Roger S. P RESSMAN. Software Engineering. A Practitioner’s Approach (7e
édition). McGraw-Hill, 2009.
[Ray99] Eric S. R AYMOND. The Cathedral and the Bazaar: Musings on Linux and Open
Source by an Accidental Revolutionary. O’Reilly Media, 1999.
[Roq06] Pascal ROQUES. UML 2, modéliser une application web. Eyrolles, 2006.
BIBLIOGRAPHIE 303