Cours-de-la-matière-Génie-logiciel Et UML
Cours-de-la-matière-Génie-logiciel Et UML
Cours-de-la-matière-Génie-logiciel Et UML
1.Introduction
Le génie logiciel (software engineering) représente l'application de principes
d'ingénierie dans le domaine de la création de logiciels. Il consiste à identifier et à
utiliser des méthodes, des pratiques et des outils permettant de maximiser les
chances de réussite d'un projet logiciel.
Il s'agit d'une science récente dont l'origine remonte aux années 1970. A cette époque,
l'augmentation de la puissance matérielle a permis de réaliser des logiciels plus
complexes mais souffrant de nouveaux défauts : délais non respectés, coûts de
production et d'entretien élevés, manque de fiabilité et de performances. Cette
tendance se poursuit encore aujourd'hui.
L'apparition du génie logiciel est une réponse aux défis posés par la complexification
des logiciels et de l'activité qui vise à les produire.
2.Définitions et objectifs
Le génie logiciel est un ensemble des méthodes, des techniques et des outils dédiés à
la conception, au développement (production) et à la maintenance de logiciels de
qualité industrielle.
Comme tout projet, la réalisation d'un logiciel est soumise à des exigences
contradictoires et difficilement conciliables.
Le génie logiciel a pour objectif de maximiser la surface du triangle en tenant compte
des priorités du client.
Exemples :
- Une sous-partie qui s'occupe des affichages à l'écran participe ne devrait pas
comporter de traitements métier, ni de code en rapport avec l'accès aux
données.
- Un composant de traitements métier (calcul scientifique ou financier, etc) ne doit
pas s'intéresser ni à l'affichage des données qu'il manipule, ni à leur stockage.
- Une classe d'accès à une base de données (connexion, exécution de requêtes)
ne devrait faire ni traitements métier, ni affichage des informations.
- Une classe qui aurait deux raisons de changer devrait être scindée en deux
classes distinctes.
2. Réutilisation
Le principe de la réutilisation incite à exploiter les composants logiciels pré-fabriqués
tels que les librairies, pour faire face à la complexité des logiciels, les contraintes de
réalisation dans des délais de plus en plus courts, tout en maintenant le meilleur niveau
de qualité possible.
Exemple :
- Utiliser une librairie d’affichage 2D au lieu de développer une.
3. Encapsulation maximale
Ce principe de conception recommande d'exposer au reste de l'application que le strict
nécessaire pour que la sous-partie joue son rôle.
Exemples :
- Au niveau d'une classe, cela consiste à ne donner le niveau d'accessibilité
publique qu'à un nombre minimal de membres, qui seront le plus souvent des
méthodes.
- Au niveau d'une sous-partie d'application composée de plusieurs classes, cela
consiste à rendre certaines classes privées afin d'interdire leur utilisation par le
reste de l'application.
4. Couplage faible
La définition du couplage est la suivante : "une entité (sous-partie, composant, classe,
méthode) est couplée à une autre si elle dépend d'elle", autrement dit, si elle a besoin
d'elle pour fonctionner.
un couplage fort tisse entre ses éléments des liens puissants qui la rendent plus rigide à
toute modification (on parle de "code spaghetti"). A l'inverse, un couplage faible permet
une grande souplesse de mise à jour. Un élément peut être modifié (exemple :
changement de la signature d'une méthode publique) en limitant ses impacts.
Le couplage peut également désigner une dépendance envers une technologie ou un
élément extérieur spécifique : un SGBD, un composant logiciel, etc.
5. Cohésion forte
Ce principe recommande de rassembler l’ensemble des éléments (composants,
classes, méthodes) ayant des rôles similaires ou dédiés à une même problématique.
Inversement, il déconseille de rassembler des éléments ayant des rôles différents.
Exemple :
- ajouter une méthode de calcul métier au sein d'un composant lié aux données
(ou à la présentation) est contraire au principe de cohésion forte.
L'origine de ce découpage provient du constat que les erreurs ont un coût d'autant plus
élevé qu'elles sont détectées tardivement dans le processus de réalisation. Le cycle de
vie permet de détecter les erreurs au plus tôt et ainsi de maîtriser la qualité du logiciel,
les délais de sa réalisation et les coûts associés.
Productions :
● Cahier des charges (les « exigences »)
● Fonctionnalités attendues
● Contraintes non fonctionnelles
● Qualité, précision, optimalité, ...
● temps de réponse, contraintes de taille, de volume de traitement, …
2. Analyse des besoins / spécification (Quoi?)
Activités : Définir précisément les fonctions que le logiciel doit réaliser ou fournir en
définissant les spécifications générales : Objectifs, contraintes (utilisation de matériels
et outils existants) et généralités à respecter ; les spécifications fonctionnelles :
description détaillé des fonctionnalités du logiciel et les spécifications d'interface :
description des interfaces du logiciel avec le monde extérieure (hommes, autres
logiciels, matériels...).
Productions :
● Dossier d'analyse
● Ébauche du manuel utilisateur
● Première version du glossaire
Productions :
● Modules codés et testés
● Documentation de chaque module
● Résultats des tests unitaires
● Planning mis à jour
4. Vérification et validation
Activités : Les modules doivent être testés et intégrés suivant un plan d'intégration, de
plus le test de l'ensemble (modules intégrés) doit être réalisé conformément au plan de
tests. Il faut intégrer les différents modules avec validation / vérification de l’adéquation
de l’implantation, de la conception et de l’architecture avec le cahier de charge
(acceptation).
Productions :
● Logiciel testé
● Jeu de tests de non-régression
● Manuel d'installation : guide dans les choix d'installation
● Version finale du manuel utilisateur
● Manuel de référence : liste exhaustive de chaque fonctionnalité
5. Maintenance
Productions :
● Logiciel corrigé
● Mises à jour, patch
● Documents corrigés.
3. Le prototypage
Un Prototype est une version d'essai du logiciel. Généralement, un prototype est
développé pour tester les différents concepts et exigences ainsi que pour montrer aux
clients les fonctions que l'on veut mettre en œuvre.
4. Le modele incremental
Le modèle de développement incrémental consiste à concevoir et livrer au client un
sous-ensemble minimal et fonctionnel du système.
5. Le modèle en spirale
C’est modèle itératif ou à chaque itération on reproduit les mêmes étapes du cycle de
vie.
Chapitre 2. Modélisation avec UML
1.Introduction
Comme toutes les étapes du cycle de vie du logiciel, la modélisation est une phase
importante au développement du logiciel. C’est l’étape ou on définit l’architecture du
système logiciel à réaliser. Cette architecture aide à communiquer les besoins du client
d’une partie et symbolise un modèle de solution ou ce qu’on appelle un modèle.
1. Modèle
Un modèle est une simplification de la réalité qui permet de mieux comprendre le
système à développer. Un modèle permet de communiquer une solution acceptable du
système informatique. Cette communication est essentielle pour aboutir à une
compréhension commune aux différentes parties prenantes (les entités concernées par
le développement du logiciel) et précise d’un problème donné.
Un modèle est une abstraction d’objets de la réalité. C’est donc une simplification du
monde réel. La problématique consiste alors à trouver le bon niveau d’abstraction et à
exprimer les concepts du monde réel dans un langage assez abstrait mais aussi précis
qu’un langage de programmation pour que ce langage soit interprétable par un
programme informatique.
2. La modélisation
La modélisation est le processus de création d’un modèle représentatif du système réel
en utilisant des méthodes et des langages spécifiques à l’exemple de l’UML, Réseaux
de pétri, Merise, etc.
Comme nous venons de le dire, un objet est caractérisé par plusieurs notions :
L’identité – L’objet possède une identité, qui permet de le distinguer des autres objets,
indépendamment de son état. On construit généralement cette identité grâce à un
identifiant découlant naturellement du problème (par exemple, un produit pourra être
repéré par un code, une voiture par un numéro de série, etc.)
Les attributs – Il s’agit des données caractérisant l’objet. Ce sont des variables
stockant des informations sur l’état de l’objet.
Les méthodes - Les méthodes d’un objet caractérisent son comportement, c’est-à-dire
l’ensemble des actions (appelées opérations) que l’objet est à même de réaliser. Ces
opérations permettent de faire réagir l’objet aux sollicitations extérieures (ou d’agir sur
les autres objets). De plus, les opérations sont étroitement liées aux attributs, car leurs
actions peuvent dépendre des valeurs des attributs, ou bien les modifier.
4. UML
UML est un langage de modélisation orienté objet, c’est-à-dire que toutes les entités
modélisées sont des objets ou se rapportent à des objets, par exemple : un objet
possède une structure de données (avec ce qui s’appelle des « attributs ») et des
comportements (avec ce qui s’appelle des « opérations »).
UML n’est pas une méthode. UML a été adopté par toutes les méthodes orientées
objet et est devenu le standard de l’industrie.
UML est un langage et possède les attributs d’un langage. Ainsi, étant graphique,
UML permet de visualiser le système réalisé ; le modèle est divisé en vues
sélectionnant les éléments pertinents puis en diagrammes de différents types. L’aspect
graphique d' UML retient le premier l’attention de ses utilisateurs. Comme pour tout
langage, les éléments du langage sont définis de manière précise, complète et sans
ambiguïté.
1. Notion de classe
Tout d’abord, introduisons la notion de classe. Une classe est un type de données
abstrait, caractérisé par des propriétés (attributs et méthodes) communes à toute une
famille d’objets et permettant de créer (instancier) des objets possédant ces propriétés.
Les autres concepts importants qu’il nous faut maintenant introduire sont
l’encapsulation, l’héritage et l’agrégation.
2. Encapsulation
L’encapsulation consiste à masquer les détails d’implémentation d’un objet, en
définissant une interface. L’interface est la vue externe d’un objet, elle définit les
services accessibles (offerts) aux utilisateurs de l’objet.
L’encapsulation facilite l’évolution d’une application car elle stabilise l’utilisation des
objets : on peut modifier l’implémentation des attributs d’un objet sans modifier son
interface, et donc la façon dont l’objet est utilisé.
L’héritage est un mécanisme de transmission des propriétés d’une classe (ses attributs
et méthodes) vers une sous-classe. Une classe peut être spécialisée en d’autres
classes, afin d’y ajouter des caractéristiques spécifiques ou d’en adapter certaines.
Plusieurs classes peuvent être généralisées en une classe qui les factorise, afin de
regrouper les caractéristiques communes d’un ensemble de classes.
Toutefois, étant donné qu'une seule représentation est trop subjective, UML fournit un
moyen astucieux permettant de représenter diverses projections d'une même
représentation grâce aux vues.
Une vue est constituée d'un ou plusieurs diagrammes. On distingue deux types de
vues :
1.Introduction
Bien souvent, la maîtrise d’ouvrage et les utilisateurs ne sont pas des informaticiens. Il
leur faut un moyen simple d’exprimer leurs besoins. C’est précisément le rôle des
diagrammes de cas d’utilisation qui permettent de recueillir, d’analyser et d’organiser
les besoins, et de recenser les grandes fonctionnalités d’un système. Il s’agit donc de la
première étape UML d’analyse d’un système.
1. Acteur
Un acteur est l’idéalisation d’un rôle joué par une personne externe, un processus ou
une chose qui interagit avec un système. Il se représente par un petit bonhomme avec
son nom (i.e. son rôle) inscrit dessous.
2. Cas d’utilisation
Un cas d’utilisation est une unité cohérente représentant une fonctionnalité visible de
l’extérieur. Il réalise un service de bout en bout, avec un déclenchement, un
déroulement et une fin, pour l’acteur qui l’initie. Un cas d’utilisation modélise donc un
service rendu par le système, sans imposer le mode de réalisation de ce service.
Un cas d’utilisation se représente par une ellipse contenant le nom du cas (un verbe à
l’infinitif), et optionnellement, au-dessus du nom, un stéréotype.
- Relation d’association
Une dépendance entre deux cas d’utilisation se représente par une flèche avec un trait
pointillé. Si le cas A inclut ou étend le cas B, la flèche est dirigée de A vers B.
Le symbole utilisé pour la généralisation est un flèche avec un trait plein dont la pointe
est un triangle fermé désignant le cas le plus général. L’exemple suivante illustre les
différents type de relations dans un diagramme de cas d’utilisation :
- Relation d’inclusion
- Relation d’extension
On dit qu’un cas d’utilisation A étend un cas d’utilisation B lorsque le cas d’utilisation A
peut être appelé au cours de l’exécution du cas d’utilisation B. Exécuter B peut
éventuellement entraîner l’exécution de A : contrairement à l’inclusion, l’extension est
optionnelle. Cette dépendance est symbolisée par le stéréotype « extend ».
- Relation de généralisation
Un cas A est une généralisation d’un cas B si B est un cas particulier de A. Dans la
figure 2.7, la consultation d’un compte via Internet est un cas particulier de la
consultation. Cette relation de généralisation/spécialisation est présente dans la plupart
des diagrammes UML et se traduit par le concept d’héritage dans les langages orientés
objet.
La seule relation possible entre deux acteurs est la généralisation : un acteur A est une
généralisation d’un acteur B si l’acteur A peut être substitué par l’acteur B. Dans ce cas,
tous les cas d’utilisation accessibles à A le sont aussi à B, mais l’inverse n’est pas vrai.
Chaque acteur doit être nommé. Ce nom doit refléter son rôle car un acteur représente
un ensemble cohérent de rôles joués vis-à-vis du système. Pour trouver les acteurs
d’un système, il faut identifier quels sont les différents rôles que vont devoir jouer ses
utilisateurs (ex : responsable clientèle, responsable d’agence, administrateur,
approbateur, . . .). Il faut également s’intéresser aux autres systèmes avec lesquels le
système va devoir communiquer comme :
– les périphériques manipulés par le système (imprimantes, hardware d’un distributeur
de billet, . . .) ;
– des logiciels déjà disponibles à intégrer dans le projet ;
– des systèmes informatiques externes au système mais qui interagissent avec lui, etc.
Pour faciliter la recherche des acteurs, on peut imaginer les frontières du système. Tout
ce qui est à l’extérieur et qui interagit avec le système est un acteur, tout ce qui est à
l’intérieur est une fonctionnalité à réaliser.
Vérifiez que les acteurs communiquent bien directement avec le système par émission
ou réception de messages.
Pour identifier les cas d’utilisation, il faut se placer du point de vue de chaque acteur et
déterminer comment et surtout pourquoi il se sert du système. Il faut éviter les
redondances et limiter le nombre de cas en se situant à un bon niveau d’abstraction.
Trouver le bon niveau de détail pour les cas d’utilisation est un problème difficile qui
nécessite de l’expérience.
Nommez les cas d’utilisation avec un verbe à l’infinitif suivi d’un complément. Par
exemple, un distributeur de billets aura probablement un cas d’utilisation retirer de
l’argent et non pas Distribuer de l’argent.
Chapitre 4. Diagrammes UML de
classes et d’objets : vue statique
1.Introduction
Le diagramme de classes est considéré comme le plus important de la modélisation
orientée objet, il est le seul obligatoire lors d’une telle modélisation.
Alors que le diagramme de cas d’utilisation montre un système du point de vue des
acteurs, le diagramme de classes en montre la structure interne. Il permet de fournir
une représentation abstraite des objets du système qui vont interagir ensemble pour
réaliser les cas d’utilisation.
Il s’agit d’une vue statique car on ne tient pas compte du facteur temporel dans le
comportement du système. Les principaux éléments de cette vue statique sont les
classes et leurs relations : association, généralisation et plusieurs types de
dépendances, telles que la réalisation et l’utilisation.
2.Les classes
1. Notions de classe et d’instance de classe
Une instance est une concrétisation d’un concept abstrait.
Exemple :
- Vous êtes une instance du concept abstrait Etudiant ;
Une classe est un concept abstrait représentant des éléments variés comme :
- des éléments concrets (ex : des avions),
- des éléments abstraits ( ex : des commandes de marchandises ou services),
- des composants d’une application (ex : les boutons des boîtes de dialogue),
- des structures informatiques (ex : des tables de hachage),
Une classe est la description formelle d’un ensemble d’objets ayant une sémantique et
des propriétés communes.
Un objet est une instance d’une classe. C’est une entité discrète dotée d’une identité,
d’un état et d’un comportement que l’on peut invoquer. Les objets sont des éléments
individuels d’un système en cours d’exécution.
Exemple:
Si l'on considère que l'Homme (au sens être humain) est un concept abstrait, on peut
dire que la personne Mohamed est une instance de l'Homme. Si l'homme était une
classe, Mohamed en serait une instance : un objet.
2. Notions de propriétés
Une classe définit un jeu d’objets dotés de propriétés. Les propriétés d’un objet
permettent de spécifier son état et son comportement. Les propriétés d’un objet sont
soit des attributs, soit des opérations.
État d’un objet : Ce sont les attributs, réunis sous le terme générique de propriété
structurelle, qui décrivent l’état d’un objet. On utilise les attributs pour des valeurs de
données pures, dépourvues d’identité, telles que les nombres et les chaînes de
caractères.
Les propriétés décrites par les attributs prennent des valeurs lorsque la classe est
instanciée. L’instance d’une association est appelée un lien.
Comportement d’un objet : Les opérations décrivent les éléments individuels d’un
comportement que l’on peut invoquer. Ce sont des fonctions qui peuvent prendre des
valeurs en entrée et modifier les attributs ou produire des résultats.
Les attributs et les méthodes constituent donc les propriétés d’une classe (et de ses
instances).
3. Représentation graphique
Une classe est un classeur. Elle est représentée par un rectangle divisé en trois parties.
Le premier indique le nom de la classe, le deuxième ses attributs, et le troisième ses
opérations. Voir la figure suivante :
Représentation UML d’une classe
Public ou + : tout élément qui peut voir le conteneur peut également voir l’élément
indiqué.
Protected ou # : seul un élément situé dans le conteneur ou un de ses descendants
peut voir l’élément indiqué.
Private ou - : seul un élément situé dans le conteneur peut voir l’élément.
Package ou ou rien : seul un élément déclaré dans le même paquetage peut voir
l’élément.
Généralisation et Héritage:
La généralisation décrit une relation entre une classe générale (classe de base ou
classe parent) et une classe spécialisée (sous-classe). La classe spécialisée est
intégralement cohérente avec la classe de base, mais comporte des informations
supplémentaires (attributs, opérations, associations). Un objet de la classe spécialisée
peut être utilisé partout où un objet de la classe de base est autorisé.
Association:
Une association est une relation entre deux classes (association binaire) ou plus
(association n-aire), qui décrit les connexions structurelles entre leurs instances. Une
association peut être paramétrée par les éléments suivant :
Exemple d’association.
Il faut noter que, pour les habitués du modèle entité/relation, les multiplicités sont en
UML « à l’envers » (par référence à Merise) pour les associations binaires et « à
l’endroit » pour les n-aires avec n > 2.
Classe-association
Parfois, une association doit posséder des propriétés. Par exemple, l’association
Emploie entre une société et une personne possède comme propriétés le salaire et la
date d’embauche. En effet, ces deux propriétés n’appartiennent ni à la société, qui peut
employer plusieurs personnes, ni aux personnes, qui peuvent avoir plusieurs emplois. Il
s’agit donc bien de propriétés de l’association Emploie.
Une classe-association possède les propriétés des associations et des classes : elle se
connecte à deux ou plusieurs classes et possède également des attributs et des
opérations.
Exemple de classe-association
Agrégation et composition
Une agrégation est une association qui représente une relation d’inclusion structurelle
ou comportementale d’un élément dans un ensemble. Graphiquement, on ajoute un
losange vide du côté de l’agrégat.
La signification de cette forme simple d’agrégation est uniquement conceptuelle. Elle ne
contraint pas la navigabilité ou les multiplicités de l’association. Elle n’entraîne pas non
plus de contrainte sur la durée de vie des parties par rapport au tout.
Représentation graphique
Graphiquement, un objet se présente comme une classe. Cependant, le compartiment
des opérations n’est pas utile. De plus, le nom de la classe dont l’objet est une instance
est précédé.
d’un « : » et est souligné. Pour différencier les objets d’une même classe, leur identifiant
peut être ajouté devant le nom de la classe. Enfin les attributs reçoivent des valeurs.
Quand certaines valeurs d’attribut d’un objet ne sont pas renseignées, on dit que l’objet
est partiellement défini.
2. Héritage simple
7. Association 1 vers N
8. Agrégations
9. Composition