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 :

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 link).

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 link (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 :

td adapter solution

🖮 Travail n° 1 : Codage design pattern Adapter

  1. Ouvrir dans Qt Creator le projet TD-Adapter-students zip fourni.

  2. 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.

    ihm td adapter

    Les 2 Adapters des RTCs seront instanciés dans un vector comme le spécifie le diagramme de classe

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.

ihm td strategy

🖮 Travail n° 2 : Codage design pattern Strategy

  1. Ouvrir dans Qt Creator le projet QT fourni sous forme d’archive zip

  2. 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)

  3. Coder le fichier fakebatterysensor.cpp en accord avec le contenu de son entête (→ fakebatterysensor.h)

  4. 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() link

    • Sous Linux, ces informations sont disponibles depuis la commande acpi ou dans l’arborescence /sys/class/power_supply/.

  5. Vérifier le bon fonctionnement de l’application

Design pattern Singleton

en chantier

🞄  🞄  🞄