Formation animé par Charles Jacquin
charles.jacquin@gmail.com
Spécifications ou conception générale (modelisation)
Code
Tests unitaires
Qualification (ou recette)
verifie ques les specifications ont été réspecté ;
La programmation orienté objet se concentre sur les données alors que la programmation procedurale est avant tout centrée autours des fonctionnalités ( fonctions et procedures ).
Avec l'approche objet, nous allons decouper le probleme en une multitude de composants réutilisable. L'approche objet permet de modeliser un probleme informatique de la même maniére que nous modeliserions un probleme du monde réel.
Avec l'approche procédurale, nous allons reflechir aux differentes étapes qui nous permettrons d'arriver au resultat souhaiter.
Représentation graphique d'une approche fonctionnelle.
Techniquement il nya rien qu'on puisse faire avec un langage objet qu'on ne puisse faire avec un language fonctionnel.
La difference est plus pratique que technique :
Programmation dirigée par les données et non plus par les traitements: on se concentre en premier sur la description des données et non plus sur la façon dont on les manipule.
Permet de mieux séparer les données des fonctions qui les manipulent.
Logiciel formé d'une collection d'objets
indépendants qui incorporent à la fois une
structure de données et un comportement.
Notions caractéristiques :
MAIS ils sont différents: leur identité est différente
Dans un programme, ces objets existent à des adresses différentes de la mémoire.
Un objet est avant tout créé a partir d’un modèle(une modélisation)
Modélise une chose tangible
ex: ville, service hospitalier, scanner, véhicule, étudiant
Modélise une chose conceptuelle
ex: réunion, planning de réservation scanner, date
Elément constitutif d’une application logicielle (collections..)
Pour modéliser et comprendre quelque chose de complexe
Les modèles peuvent être spécifiques à chaque destinataire n’exprimant que ce qu’il lui est nécessaire.
exemple : la modélisation d’un avion pour un constructeur sera plus detaillée, voire différente que pour un acheteur.
Un modele M est un modèle d’un objet O si M permet de répondre à des questions au sujet de O.
Nous construisons M parce qu’il est plus pratique que O.
O n’est pas encore construit.
Des choix restreints à faire (impossible de construire O maintenant).
M est moins cher à construire.
Le modèle ne décrit pas tous les aspects de l’objet modélisé.(on ne peux pas décrire totalement un être humain)
M est plus simple que O.
Modéliser un système avant sa réalisation permet de mieux comprendre le fonctionnement du système. C'est également un bon moyen de maîtriser sa complexité et d'assurer sa cohérence.
La programmation orientée objet consiste en la définition et l’assemblage de briques logicielles appelées objets.
Un objet est une structure de données qui répond à un ensemble de messages. Cette structure définit son état et l’ensemble des messages décrit son comportement.
Terminologie des objets :
Les données internes sont appelées attributs.
La réponse à la réception d’un message par l’interface est appelée méthode.
L’objet est une boîte noire.
Droits d’accès aux attributs et aux méthodes.
Principe d’encapsulation.
Encapsulation (suite)
Visibilité des attributs et méthodes :
Partie privée: connue uniquement de l’objet
Partie publique
Les données membres (attributs) doivent toujours être privées.
Les méthodes doivent être publiques seulement si elles sont utilisées par d’autres objets.
Ici le moule represente la classe (le modèle), et la gauffre représente l'objet.
Exemple d’objet : un compte bancaire
Les données (attributs) :
Type de compte
Solde
Les traitements (méthodes) :
Débiter
Créditer
« Inverse » du constructeur
(Pas de destructeur en java)
Un système objet est composé d’un ensemble d’objets qui ont différents types de relations entre eux.
Les relations entre objets :
L’association ;
La composition ;
Une association exprime une connexion entre deux classes.
Une association est généralement représentable avec un verbe :
La cardinalité c’est le nombre d’instances qui participent à l’association.
Les cardinalités :
N Exactement N éléments (N>0) ;
N..M Entre N et M éléments (N>0 et M>N) ;
* Plusieurs ;
La composition consiste à utiliser une classe comme attribut d’une autre classe.
Par exemple: une classe voiture peut contenir une classe moteur.
On représente une composition par un trait plein terminé par un losange (du côté de la classe qui contient l’autre).
Quand un objet A est un attribut d’un objet B, le constructeur de l’objet A sera appelé avant celui de l’objet B.
Exemple: le constructeur de la classe « moteur » est appelé avant celui de la classe voiture.
La composition est une relation forte, la destruction d’un objet entraîne la destruction des objets qui le composent.
Favorise la réutilisabilité et l’adaptabilité des objets.
Principe proche de l’arbre généalogique :
Une classe fille est une classe qui hérite des caractéristiques de sa mère ;
Une classe fille caractérise / specialise ce que représente la classe mère ;
Lors d’un héritage, une classe hérite de :
Tous les attributs et peut en ajouter ;
Toutes les méthodes et peut en ajouter ou en redéfinir
Graphiquement, on représente l’héritage avec un triangle
L’héritage est une relation de type " est un(e) ".
Exemple : une voiture est un véhicule ;
Nouveau type de portée :
Polymorphisme: peut prendre plusieurs formes.
Polymorphisme d’héritage :
Un jeu d’échec comporte des objets :
La méthode déplacement() peut avec le polymorphisme d’héritage effectuer le mouvement de la pièce sans savoir quelle pièce se cache réellement derrière le type de base.
Une méthode est dite abstraite lorsqu'on connaît son entête, mais pas la manière dont elle peut être réalisée.
Une classe est dite abstraite lorsqu'elle définit au moins une méthode abstraite ou lorsqu'une classe parent contient une méthode abstraite non encore réalisée.
On ne peut instancier une classe abstraite.
Si une classe ne contient que des methodes abstraites, on parle alors d'une interface.
Processus :
Spécification de l’application entre
analystes métier et utilisateurs.
Précise l'objectif du système et non la façondont il sera construit.
Deux modèles :
Architecture du système
Elaboration des objets du domaine et de ceux de l’application avec la même notation.
Choix des structures de données et algorithmes.
Transposition des classes et de leurs relations en concepts propres à un.
langage, une base de données ou une plateforme.
En informatique UML (de l'anglais Unified Modeling Language), ou Langage de modélisation unifié, est un langage de modélisation graphique à base de pictogrammes. Il est utilisé en développement logiciel, et en conception orientée objet. UML est couramment utilisé dans les projets logiciels.
UML est l'accomplissement de la fusion de précédents langages de modélisation objet : Booch, OMT, OOSE. Principalement issu des travaux de Grady Booch, James Rumbaugh et Ivar Jacobson, UML est à présent un standard défini par l'Object Management Group (OMG). La dernière version diffusée par l'OMG est UML 2.5 bêta 2 depuis septembre 20131.
Wikipedia
Nous nous interesserons ici aux diagrammes de classes, de séquences et des cas d'utilisation (use case).
Les diagrammes de cas d'utilisation sont des diagrammes UML utilisés pour donner une vision globale du comportement fonctionnel d'un système logiciel.
Wikipedia
Il permet d'identifier les possibilités d'intéraction entre le système et les acteurs (intervenants extérieurs au système), c'est-à-dire toutes les fonctionnalités que doit fournir le système. Il permet aussi de délimiter le système.
Il représente un élément externe qui intéragit avec le système. Cet élément peut être un utilisateur ou un système tiers (autre ordinateur, autre programme, base de donnée).
Tous les éléments extérieurs qui stimulent le système et tous les éléments extérieurs qui sont utilisés par le système sont représentés par des acteurs.
Il est possible de représenter un acteur sous forme d'un bonhomme comme ci-dessous à gauche ou sous forme d'un classeur comme ci-dessous à droite.
Un cas d'utilisation représente une fonctionnalité du système.
Cette fonctionnalité est définie par une action déclenchante, un ou plusieurs déroulements possibles et éventuellement une fin.
Les différents déroulements, aussi appelés scénarios, seront modéliser par des diagrammes de séquence, d'activité ou d'état.
Le cas d'utilisation se représente par une ellipse contenant un nom décrivant la fonctionnalité et éventuellement un stéréotype.
Le nom du use case doit se composer d'un verbe à l'infinitif qui décrit une action.
Une relation d'association est un chemin de communication entre un acteur et un cas d'utilisation.
Elle est représentée par un trait continu.
Lorsqu'un acteur peut intéragir plusieurs fois avec un cas d'utilisation, il est possible d'ajouter une multiplicité sur l'association du côté du cas d'utilisation.
Le symbole * signifie "plusieurs".
Un acteur est qualifié de principal pour un cas d'utilisation lorsque ce cas rend service à cet acteur.
Les autres acteurs sont alors qualifiés de secondaires.
Un cas d'utilisation a au plus un acteur principal.
Le stéréotype << primary >> vient orner l'association reliant un cas d'utilisation à son acteur principal.
Le stéréotype << secondary >> est utilisé pour les acteurs secondaires.
L'inclusion « include » : Cela implique obligatoirement l'inclusion d'un cas d'utilisation dans un autre
permet de définir la spécialisation d'un cas d'utilisation
Un acteur qui hérite d'un autre acteur hérite de toutes ses associations.
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.
le diagramme de classes permet de modéliser les classes du système et leurs relations indépendamment d'un langage de programmation particulier.
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.
Elle est représentée par un rectangle divisé en trois à cinq compartiments
Protected ou # : la classe ou les enfants
Private ou - : la classe uniquement
Une association n-aire lie plus de deux classes.
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.
Il est possible de specifier un sens pour la relation
Deux modélisations équivalentes.
En bas les diagrammes avec qualificatif
Une classe-association possède les caractéristiques des associations et des classes : elle se connecte à deux ou plusieurs classes et possède également des attributs et des opérations.
Si un cours doit pouvoir exister indépendamment d'un lien entre un enseignant et un groupe, il faut utiliser le modèle de droite.
Les propriétés principales de l'héritage sont :
On parle de dependance lorsqu'une methode de classe, utilise une instance d'une autre classe.
Le diagramme de sequence permet d'établir un lien entre les diagrammes de cas d'utilisation et les diagrammes de classes : ils montrent comment des objets communiquent pour réaliser une certaine fonctionnalité. Ils apportent ainsi un aspect dynamique à la modélisation du système.
Les principales informations contenues dans un diagramme de sequence sont les messages échangés entre les lignes de vie, présentés dans un ordre chronologique.
Une ligne de vie se représente par un rectangle, auquel est accroché une ligne verticale pointillée, contenant une étiquette dont la syntaxe est :
[<nom_du_rôle>] : [<Nom_du_type>]
Au moins un des deux noms doit être spécifié dans l'étiquette, les deux points (:) sont, quant à eux, obligatoires.
Un message définit une communication particulière entre des lignes de vie :
l'envoi d'un signal.
la création ou la destruction d'une instance.
invocation d'une operation
L'invocation peut être asynchrone ou synchrone. Dans la pratique, la plupart des invocations sont synchrones, l'émetteur reste alors bloqué le temps que dure l'invocation de l'opération.
Graphiquement, un message synchrone se représente par une flèche en traits pleins et à l'extrémité pleine partant de la ligne de vie d'un objet expéditeur et allant vers celle de l'objet cible . Ce message peut être suivi d'une réponse qui se représente par une flèche en pointillé (figure ).
Graphiquement, un message asynchrone se représente par une flèche en traits pleins et à l'extrémité ouverte partant de la ligne de vie d'un objet expéditeur et allant vers celle de l'objet cible
Dans la plupart des cas, la réception d'un message est suivie de l'exécution d'une méthode d'une classe
[<attribut> = ] message [ : <valeur_de_retour>]
où message représente le message d'envoi.
Un objet actif (à gauche) et d'une exécution sur un objet passif (à droite).
Un fragment combiné permet de realiser des operations particuliere sur une portion du diagramme, comme par exemple :
Il est représenté dans un rectangle dont le coin supérieur gauche contient un pentagone. Dans le pentagone figure le type de la combinaison, appelé opérateur d'interaction.
Diagramme de sequence du demineur
loop[ '('<minInt> [ ',' <maxInt> ] ')' ]
L'operateur loop permet de repeter une partie du diagramme jusqu'a ce qu'une condition booléene doit remplie.
Les diagrammes d'activités permettent de mettre l'accent sur les traitements. Ils sont donc particulièrement adaptés à la modélisation du cheminement de flots de contrôle et de flots de données.
Durant la phase de conception, les diagrammes d'activités sont particulièrement adaptés à la description des cas d'utilisation.
Les diagrammes d'activités permettent de spécifier des traitements a priori séquentiels et offrent une vision très proche de celle des langages de programmation impératifs comme C++ ou Java.
Un nœud d'activité est un type d'élément abstrait permettant de représenter les étapes le long du flot d'une activité. Il existe trois familles de nœuds d'activités :
Le passage d'une activité vers une autre est matérialisé par une transition. Graphiquement les transitions sont représentées par des flèches en traits pleins qui connectent les activités entre elles.
Elles sont déclenchées dès que l'activité source est terminée et provoquent automatiquement et immédiatement le début de la prochaine activité à déclencher (l'activité cible).
UML n'impose aucune syntaxe pour la description d'une activité.
Il existe plusieurs types de nœuds de contrôle :
Un nœud de contrôle est un nœud d'activité abstrait utilisé pour coordonner les flots entre les nœuds d'une activité.
Exemple de diagramme d'activité illustrant l'utilisation de nœuds de contrôle.
Un noeud objet permet de modeliser le flux de données,
Un flot d'objets permet de passer des données d'une activité à une autre. Un arc reliant un pin de sortie à un pin d'entrée est, par définition même des pins, un flot d'objets
Il existe une autre représentation possible d'un flot d'objets, plus axée sur les données proprement dites, car elle fait intervenir un nœud d'objet détaché d'une activité particulière
Exemple d'utilisation d'un nœud tampon central pour centraliser toutes les commandes prises par différents procédés, avant qu'elles soient traitées.
Un nœud de stockage des données est un nœud tampon central particulier qui assure la persistance des données.
Les partitions n'ont pas de signification bien arrêtée, mais correspondent souvent à des unités d'organisation du modèle.
On peut, par exemple, les utiliser pour spécifier la classe responsable de la mise en œuvre d'un ensemble de tâches.
Illustration de l'utilisation de nœuds d'objets et de partitions dans un diagramme d'activités.
Une exception est générée quand une situation anormale entrave le déroulement nominal d'une tâche.
Les diagrammes d'états-transitions d'UML décrivent le comportement interne d'un objet à l'aide d'un automate à états finis. Ils présentent les séquences possibles d'états et d'actions qu'une instance de classe peut traiter au cours de son cycle de vie en réaction à des événements discrets
La vision globale du système n'apparaît pas sur ce type de diagrammes puisqu'ils ne s'intéressent qu'à un seul élément du système indépendamment de son environnement.
Un automate à états finis est graphiquement représenté par un graphe comportant :
un état simple
état
état initial
état final
en version simplifié
Mémorise le dernier état actif
H
Backup
Un événement est quelque chose qui se produit pendant l'exécution d'un système et qui mérite d'être modélisé.
Un événement d'appel représente la réception de l'appel d'une opération par un objet.
les événements d'appel sont des méthodes déclarées au niveau du diagramme de classes.
Un événement de changement est généré par la satisfaction (i.e. passage de faux à vrai) d'une expression booléenne sur des valeurs d'attributs.
when ( <condition_booléenne> )
Les événements temporels sont générés par le passage du temps. Ils sont spécifiés :
Par défaut, le temps commence à s'écouler dès l'entrée dans l'état courant.
Une transition définit la réponse d'un objet à à un événement. Elle lie, généralement, deux états et indique qu'un objet dans un état E1 peut entrer dans l'état E2 et exécuter certaines activités, si un événement déclencheur se produit et qu'une condition
Les mêmes régles s'appliquent aux transitions internes.
A la difference d'une transition externe, une transition interne ne posséde pas d'état cible, l'état de l'objet ne changent pas à la fin de la transition.
Les transitions internes possèdent des noms d'événement prédéfinis correspondant à des déclencheurs particuliers :
Il est possible de représenter des alternatives pour le franchissement d'une transition :
Les points de jonction permettent de partager des segments de transition, l'objectif étant d'aboutir à une notation plus compacte ou plus lisible des chemins alternatifs.
Un point de jonction peut avoir plusieurs segments de transition entrante et plusieurs segments de transition sortante. Par contre, il ne peut avoir d'activité interne ni des transitions sortantes dotées de déclencheurs d'événements.
Contrairement à un point de jonction, les gardes situées après le point de décision sont évaluées au moment où il est atteint.
Il est possible d'utiliser le mot clef else, sur un des segments en aval d'un point de choix.
c'est même recommandé pour avoir un diagramme bien construit.
Les web app (gratuites ou presque) :
Les clients lourd :
Une feuille de papier et un crayon.
Dans un établissement scolaire, on désire gérer la réservation des salles de cours ainsi que du matériel pédagogique (ordinateur portable ou/et Vidéo projecteur).
Seuls les enseignants sont habilités à effectuer des réservations (sous réserve de disponibilité de la salle ou du matériel).
Le planning des salles peut quant à lui être consulté par tout le monde (enseignants et étudiants). Par contre, le récapitulatif horaire par enseignant (calculé à partir du planning des salles) ne peut être consulté que par les enseignants.
Enfin, il existe pour chaque formation un enseignant responsable qui seul peut éditer le récapitulatif horaire pour l’ensemble de la formation.
Dans un magasin, le processus de vente est le suivant : le client entre, passe dans les rayons, demande éventuellement des renseignements ou procède à des essais, prend des articles (si le stock est suffisant), passe à la caisse où il règle ses achats (avec tout moyen de paiement accepté). Il peut
éventuellement bénéficier d’une réduction.
Dans un magasin, un commerçant dispose d’un système de gestion de son stock d’articles, dont les fonctionnalités sont les suivantes :
On considère le système suivant de gestion d’un DAB (Distributeur automatique de billets) :
Le système de fichier est un ensemble de fichiers contenus dans un répertoire racine. Il y a au plus un répertoire racine par système de fichiers. Les répertoires sont des types particuliers de fichiers.
Sous Linux un fichier est toujours désigné par un nom. Il possède un unique inode. Un fichier possède les fonctionnalités suivantes : ouverture, fermeture, lecture, écriture. Il existe plusieurs sortes de fichiers : les fichiers normaux, les répertoires, les liens symboliques, les pseudo-fichiers. Un répertoire peut contenir plusieurs fichiers. Un lien symbolique fait référence à (« pointe vers ») un autre fichier. Un pseudo-fichier est souvent un fichier servant d'interface pour divers périphériques.
Chaque fichier est associé à un unique inode qui contient différentes informations (qu’il n’est pas important de détailler ici). Un utilisateur peut posséder un ou plusieurs fichiers et possède au plus un répertoire « home ». Un nœud ne peut être possédé que par un seul utilisateur. Un utilisateur appartient à au moins un groupe. Un utilisateur est repéré par identifiant d’utilisateur (UID) et un groupe (GID) par un identifiant de groupe.
Définissez la classe UML représentant un étudiant, caractérisé, entre autres, par un identifiant, un nom, un prénom et une date de naissance.
Définissez la classe UML représentant un enseignant, caractérisé, entre autres, par un identifiant, un nom, un prénom et une date de naissance.
Définissez la classe UML représentant un cours, caractérisé par un identifiant, un nom, le nombre d’heures de cours magistral, le nombre d’heures de travaux dirigés et un nombre d’heures de travaux pratiques que doit suivre un étudiant.
Définissez les associations qui peuvent exister entre un enseignant et un
cours.
Définissez la classe UML représentant un groupe d’étudiants en utilisant les associations.
Définissez l’association possible entre un groupe d’étudiants et un cours.
Pensez-vous qu’il soit possible de définir un lien d’héritage entre les classes UML représentant respectivement les étudiants et les enseignants ?
Pensez-vous qu’il soit possible de définir un lien d’héritage entre les classes UML représentant respectivement les étudiants et les groupes d’étudiants ?
On nomme coursDeLetudiant() l’opération permettant d’obtenir l’ensemble des cours suivis par un étudiant. Positionnez cette opération dans une classe, puis précisez les paramètres de cette opération.
On nomme coursDeLenseignant() l’opération permettant d’obtenir l’ensemble des cours dans lesquels intervient un enseignant. Positionnez cette opération dans une classe, puis précisez les paramètres de cette opération.
Expliquer ce diagramme
Positionnez toutes vos classes ( Etudiant , Enseignant ,
GroupeEtudiant ) dans un package nommé Personnel.
Liez vos classes pour faire en sorte qu’un créneau soit lié à un cours.
Étudiants et enseignants sont des personnes caractérisées par un numéro INSEE, un nom, un prénom et une adresse. Chaque enseignant possède de plus un grade et on souhaite mémoriser pour chaque étudiant son année d’étude et le diplôme préparé.
Les cours sont organisés en modules caractérisés par un code et un intitulé. Plusieurs enseignants peuvent intervenir dans un module, à une date, une heure et dans une salle données. Un enseignant intervient habituellement dans plusieurs modules. Les étudiants s’inscrivent dans les modules à une date et à une heure données, mais seuls les étudiants qui suivent effectivement le module obtiennent une note moyenne en fin d’année.
Des contrôles sont organisés pour chaque module. Ils sont caractérisés par un numéro de contrôle et une date. Les étudiants ayant effectué le contrôle possèdent une note pour ce contrôle.
Le déroulement normal d’utilisation d’un distributeur automatique de billets est le suivant :
Pour passer une commande, le client fournit son numéro de téléphone (qui va permettre de l’identifier) et le contenu de sa commande qu’on représente sous la forme d’une liste de couples (nom d’une pizza, quantité).
Le système commence par vérifier que le client existe dans la base des clients et conserve l’objet client qui lui correspond. Le système vérifie ensuite que la commande est faisable (elle peut être fabriquée dans un
Point Pizza qui fait toutes les pizzas spéciales demandées) puis crée la commande dans le système et en indique le numéro et le prix au client. Pour vérifier que la commande est faisable, le système récupère la liste des Points Pizza pour chaque spécialité de la commande puis vérifie que l’intersection de ces listes n’est pas
vide, c’est-à-dire qu’il existe au moins un Point Pizza qui peut satisfaire la commande. C’est une façon de faire un peu naïve, on peut trouver d’autres méthodes. Le système crée ensuite une commande en créant les objets DétailsCommande correspondant à chaque pizza (avec l’attribut état initialisé à enAttente) et en ajoutant chaque couple (pizza,détails) à l’objet commande créé. Il attribue ensuite le client à la commande puis ajoute la commande aux commandes du client. Il conserve l’objet commande créé (quand on crée un objet, on le renvoie nécessairement à celui qui l’a créé) puis il renvoie le numéro et le prix de la commande au client.
Construire un diagramme d’activité représentant l’utilisation d’une cafetière électrique:
Pour créer une fiche de réparation, le chef d’atelier saisit les critères de recherche de voitures dans le système. Le logiciel de gestion des réparation lui donne la liste des voitures correspondant aux critères entrés. Si la voiture existe, le chef d’atelier va sélectionner la voiture. Le logiciel va, ensuite, fournir les informations sur le véhicule. Si la voiture est sous garantie, le chef devra saisir la date de demande de réparation. Si la voiture n’existe pas, le chef va saisir les informations concernant ce nouveau véhicule. Dans tous les cas, le chef d’atelier devra saisir la date de réception et de restitution. Si le dommage de la voiture est payé par l’assurance, le logiciel va fournir une liste d’assurances au chef d’atelier. Ce dernier sélectionnera l’assurance adéquate. Enfin, le logiciel enregistre la fiche de réparation.
commencer par casser le chocolat en morceaux, puis le faire fondre. En parallèle, casser les œufs en séparant les blancs des jaunes. Quand le chocolat est fondu, ajouter les jaunes d’œuf.
Battre les blancs en neige jusqu’à ce qu’ils soient bien fermes. Les incorporer délicatement à la préparation chocolat sans les briser. Verser dans des ramequins individuels.
Mettre au frais au moins 3 heures au réfrigérateur avant de servir.
Maintenant si ça n'est pas déjà fait rajouter les nœuds objets.
Réaliser le diagramme d’état d'un radio réveil.
Réalisez le diagramme d'état d'un dab.
Modélisez le comportement du vidéoprojecteur lors d’une session de formation.
Commencez par identifier les états et transitions nominaux. Ajoutez les périodes de préchauffage et de refroidissement de la lampe. Représentez ensuite le fait qu’il faut appuyer successivement deux fois en moins de 5 s sur le bouton power pour interrompre la vidéoprojection. Envisagez enfin la panne de la lampe…
Ajoutons le comportement suivant : si l’on éteint le vidéoprojecteur sans le déconnecter de sa source, il repassera directement dans l’état Connecté quand on le rallumera. Les deux états Allumé et Connecté intègrent chacun une activité durable : respectivement la projection d’un écran bleu ou de la source d’entrée.
Ajoutons maintenant les activités continues de préchauffage et de refroidissement de la lampe. Il est donc nécessaire d’introduire deux états supplémentaires autour de l’état Éteint.
Comment sortir de ces états supplémentaires : soit en utilisant un évènement de changement (when) testant la température de la lampe, soit plus simplement une transition automatique. Nous utiliserons cette dernière solution, plus simple et n’obligeant pas à spécifier les températures visées.
Pour éviter de perdre trop de temps lors d’un appui intempestif sur power dans l’état Connecté, les vidéoprojecteurs modernes demandent une confirmation sous la forme d’un deuxième appui sur power en moins de 5 s.
la lampe peut griller dès lors que le projecteur n’est pas éteint. Le plus simple consiste à introduire un nouvel état composite à l’intérieur de Branché mais excluant Éteint
Le jeu est composé d’un plateau rectangulaire, d’un chronomètre et d’un compteur de mines. Le plateau est un quadrillage de cases. Au début du jeu, toutes les cases du plateau sont couvertes, le compteur de mines indiquant le nombre de mines restant à localiser. Le chronomètre compte le nombre de secondes écoulées depuis le début de la partie. La partie commence lorsque la première case est découverte.
Quand une case est découverte, son contenu est affiché. Le contenu d’une case peut être : rien, une mine ou un nombre indiquant le nombre de mines présentes dans les cases voisines. Les scénarios suivants peuvent se produire lorsqu’une case est découverte, en fonction de son contenu :
Si elle est toujours couverte, une case peut être marquée en respectant les règles suivantes :
Développez un diagramme de cas d’utilisation pour le jeu de démineur.
Développez un diagramme de séquence système pour le cas d’utilisation "Jouer une partie de démineur".
Diagramme de sequence globale
Diagramme de classes
Diagramme d'etat d'une case
La solution consite à utiliser un design-pattern etat pour modeliser l'etat de la case.
On pourrait egalement utiliser le pattern singleton pour la classe partie afin de n'avoir qu'une seule instance à la fois.
L'école
Dans ce chapitre, nous allons voir comment (et pourquoi) exploiter l’expérience et les leçons tirées par d’autres développeurs qui ont déjà suivi le même chemin, rencontré les mêmes problèmes de
conception et survécu au voyage.
Ce "gang" est composée de 4 developpeur qui sont les auteurs d'un ouvrage de reference :
"Design Patterns: Elements of Reusable Object-Oriented Software"
Dans cet ouvrage il detaille 22 patrons de conception qui permettent de repondre à des problématique claires.
Les design pattern sont regroupés en trois categorie :
Utilisé pour construire des objets découplés du systéme
Rend le système indépendant de la manière dont les objets
sont créés, composés et représentés.
Permet de préciser QUOI (l’objet), QUI (l’acteur), COMMENT (la manière) et QUAND (le moment) de la création.
Ce pattern est à utiliser dans les situations où existe le besoin
de standardiser le modèle architectural pour un ensemble
d’applications, tout en permettant à des applications
individuelles de définir elles-mêmes leurs propres objets à
créer.
Nous definissons une interface pour la creation d'un objet, mais nous deleguons l'instanciation de cette classe à une autre.
le but de ce pattern est d'avoir une seule instance d’une classe et pouvoir
l’accéder et la manipuler facilement
Pattern singleton
Abstraction de la manière dont les classes et les objets sont composés pour former des structures plus importantes.
Permet de gerer des relations entre objet independament du type d'objet.
Merci de m'avoir suivi