Activité : Mise en œuvre de design patterns Dans cette activité, on vous demande de coder ou compléter des applications Qt/C++ qui font usage chacune d’un des design patterns suivants : Adapter Strategy Singleton Fiche d’activité Objectifs À l’issue de cette activité, vous devez être capable de … : mettre en oeuvre le design pattern Adapter mettre en oeuvre le design pattern Strategy mettre en oeuvre le design pattern Singleton Compétences du référentiel abordées Domaine Compétence C3. Concevoir C3.3 définir l’architecture globale d’un prototype ou d’un système C3.7 contribuer à la modélisation de tout ou partie d’un produit C4. Réaliser C4.4: développer un module logiciel C4.5: tester et valider un module logiciel Savoirs du référentiel abordés Savoir Description: S3 Modélisation S3.1. Modélisation orientée objet S3.4. Spécificités UML S4 Développement logiciel S4.1 Principes de base S4.2 Algorithmique S4.6 Programmation orienté objet S4.7 Langages de programmation Conditions Durée : 12h Travail individuel Compte rendu : à remettre en fin de séquence constitué des programmes source commentés Ressources Matériel(s) : PC Windows ou Linux Logiciel(s) : Framework Qt Documentation : Cours Introduction aux design patterns (et plus particulièrement les codes source des exemples fournis). Pré-requis Programmation C++ Relations UML (héritage, composition, agrégation) Design pattern Adapter On désire coder la portion de code d’une application embarquée sensible en charge de l’horodatage d’évènements. L’ordinateur embarqué utilisé ne disposant pas de connexion réseau, on fait appel à 2 composants matériels, appelés RTC pour Real Time Clock, pour récupérer l’heure courante. Ces composants sont différents pour assurer une redondance avec dissemblance (L’ingénierie de la robustesse ). Une librairie statique C++ accompagne chaque composant RTC pour faciliter son exploitation : libfoortc.a : librairie pour le 1er type de composant qui fournit une classe dont la méthode unique, getTimestamp(), retourne l’heure UTC courante — dans le système horaire sur 24 heures — dans une structure de type timestamp_t défini comme suit : typedef struct { int hh; // heures de l'heure courante [0..23] int mm; // minutes de l'heure courante [0..59] int ss; // secondes de l'heure courante [0..59] } timestamp_t; libbarrtc.a : librairie pour le 2ème type de composant qui fournit une classe dont la méthode unique, readTime(string& t), retourne l’heure UTC courante — dans le système horaire sur 12 heures — dans une chaîne C++ passée en paramètre sous forme d’une référence. La chaîne retournée possède le format suivant “<hh>:<mm>:<ss>␣<AM | PM>” (ex. : “04:36:52 PM”) avec : <hh> : les heures de l’heure courante [0..12] <mm> : les minutes de l’heure courante [0..59] <ss> : les secondes de l’heure courante [0..59] ␣ : un espace <AM | PM> : la chaîne “AM” ou “PM” selon que l’on est respectivement le matin ou l’après-midi De façon à lire l’heure sur chacun des type de RTC de manière identique à partir d’une méthode unique getISOTime() qui retourne l’heure courante dans une chaîne de caractères C++ au format ISO8601 (Ex. : “16:36:52Z”, le ‘Z’ indiquant l’heure UTC), on décide de faire appel au design pattern Adapter. On arrive donc au diagramme de classes suivant : 🖮 Travail n° 1 : Codage design pattern Adapter Ouvrir dans Qt Creator le projet TD-Adapter-students fourni. Compléter le code des classes FooRtcAdapter, BarRtcAdapter et MainIHM pour vérifier — comme illustré dans le screenshot ci-dessous — que les heures délivrées par 2 RTCs de type différent sont bien identiques. Les 2 Adapters des RTCs seront instanciés dans un vector comme le spécifie le diagramme de classe Solution : TD-Adapter (chiffré) Design pattern Strategy On désire coder la partie d’une application embarquée responsable de l’affichage du niveau de charge restant de la batterie utilisée pour alimenter le système. Le capteur de batterie n’étant pas disponible, on décide de faire appel au design pattern Strategy de façon à pouvoir tester l’application à partir d’un capteur de batterie simulé. L’utilisation de ce design pattern permettra par la suite d’intégrer le code lié au capteur réel sans avoir à modifier outre mesure l’application principale. 🖮 Travail n° 2 : Codage design pattern Strategy Ouvrir dans Qt Creator le projet QT fourni sous forme d’archive Après étude du code source, dresser le diagramme de classes UML de l’application dans le logiciel qui vous convient le mieux (MagicDraw, BoUML, PlantUML) Coder le fichier fakebatterysensor.cpp en accord avec le contenu de son entête (→ fakebatterysensor.h) Coder le fichier realbatterysensor.cpp poour retourner le niveau de charge réel ainsi que l’état courant de la batterie de votre ordinateur portable. Sous windows, vous pourrez utiliser la fonction GetSystemPowerStatus() Sous Linux, ces informations sont disponibles depuis la commande acpi ou dans l’arborescence /sys/class/power_supply/. Vérifier le bon fonctionnement de l’application Solution : QTDStrategy.zip (chiffré) Design pattern Singleton 🞄 🞄 🞄 SN2IR - Design patterns SN1/2IR/EC - Bases de données