200 likes | 308 Views
GEF 243B Programmation informatique appliquée. Modules et masquage d’information. Revue. Quelles sont les trois concepts utilisés par les humains pour résoudre les problèmes complexes? Quelle est l’erreur avec ce qui suit? float Add (int* anInt, float* aFloat); void main (void) { int a;
E N D
GEF 243BProgrammation informatique appliquée Modules et masquage d’information JGA Beaulieu
Revue • Quelles sont les trois concepts utilisés par les humains pour résoudre les problèmes complexes? • Quelle est l’erreur avec ce qui suit? • float Add (int* anInt, float* aFloat); • void main (void) • { • int a; • float b; • myFunction (a, b); • } //main • void Add(int* param1, float* param2) • { • return ((float)*param1 + *param2); • }//Add JGA Beaulieu
Synopsis • Décomposition modulaire - (un niveau plus haut) • Masquage d’information • Encapsulation • Quoi cacher • Séparation des préoccupations • Le module C • Le module C – prototypes de fonction • Un petit exemple • Construction avec des composantes JGA Beaulieu
Décomposition modulaire • Jusqu’à présent nous avons vue que nous pouvons décomposer une grosse fonction monolithique (main) en de plus petites fonctions cohésives • Toutes nos fonctions que nous avons définies dans le cours ont étés misent à l’intérieur d’un seul fichier: une unité de compilation • Nous avons aussi appris comment déclarer un prototype de fonction dans nos programmes. JGA Beaulieu
Décomposition modulaire • Les programmes d’ordinateur qui sont très larges n’apparaissent pas par magie • Le logiciel bien conçu, comme tout autre produit d’ingénierie doit être conçu avec une philosophie de planification et d’implémentation prudente • Tout comme un édifice, un programme logiciel doit avoir une structure bien dessinée; une architecture JGA Beaulieu
Décomposition modulaire • Pour les gros programmes, il ne suffit pas seulement de décomposer un programme en fonctions • L’architecture d’un gros programme doit être exprimée en unités de compilation séparées • En C, ces unités de compilation sont des modules • Vous avez déjà utilisés des bibliothèques de modules tel que stdio, conio, dsound,… • Vous avez aussi utilisé un module développé localement, le squelette 243_lib JGA Beaulieu
Masquage d’information • Information hiding • Le concept de masquage d’information provient d’un article séminale de David Parnas (1972) • Masquage d’information: « Chaque module a un secret qu’il cache des autres modules. » JGA Beaulieu
Masquage d’information - Encapsulation • Le concept de masquage d’information est clef pour les concepts de décomposition et d’abstraction • On cache l’information qui peut changer et on expose une interfacestable qui ne changera PAS • Ceci est connue comme l’encapsulation • L’information est obtenue ou changée SEULEMENT en utilisant l’interface – L’information est cachée JGA Beaulieu
Masquage d’information - Encapsulation • Pourquoi est-ce que le masquage d’information est important? • Si nous encapsulons l’information qui peut changer dans l’implémentation du module et que nous offrons le service du module au travers d’une interface stable, l’utilisateur du module n’a pas besoin de connaître ce qu’il y a dans l’implémentation • Je peux changer l’implémentation pour améliorer la performance, due au changements de matériel, changement de plateforme … • Donc je réduis le couplage entre les modules. Le programme est plus facile àentretenir JGA Beaulieu
Masquage d’information – Quoi cacher • Quel est ce secret que je veux cacher? Il y a trois types de module pour le masquage d’information: • Masquage de comportement: Cache les choses comme les formats d’écran, impression, les menus, la communication, le changement d’états etc… • Ex: conio.h – Cache le formats d’écran et clavier • Masquage des décisions de design: Cache les structures de données et les algorithmes • Ex: tm.h – Cache les algorithmes et structures pour la gestion des tâches • Masquage de la machine: Cache les interfaces machine • Ex: 243_lib.h – Cache certaines fonctions de brickOS et types • Ex: dsound.h – Cache la façon de jouer les sons sur le matériel JGA Beaulieu
Masquage d’information – Quoi cacher • Quand nous appliquons le concept de masquage d’information, nous pouvons séparer nos préoccupations et décomposer nos problèmes en unités de compilation cohésives • Tout les concepts de génie logiciel que nous avons vue jusqu’à ce point sont des concepts de design • La limite où nous pouvons implémenter ces concepts dans le code dépend du support fournit par le langage de programmation JGA Beaulieu
Le module C • C nous fournit deux types de fichiers pour que nous puissions définir nos modules • Le fichier .h – ou entête de module: Contient la déclaration des fonctions et les attributs que nous voulons que les autre modules voient. Aussi connue comme interface du module • Le fichier .c – ou corps du module: Contient la définition des fonctions qui sont déclarées dans l’entête du module et autres fonctions internes ou de soutient. Connue comme implémentation du module JGA Beaulieu
Le module C • Quand vous faite l’inclusion de l’entête d’un module dans votre programme, seulement les fonctions qui sont déclaré dans l’entête sont disponibles • Ce n’est JAMAIS une bonne idée de donner un accès directe à vos variables dans vos modules JGA Beaulieu
Le module C - Prototypes • Un module doit avoir deux fichiers du même nom un avec l’extension .c et l’autre avec .h • (243_lib.c, 243_lib.h) • Vous devez déclarer un prototype de fonction dans le fichier entête pour chaque fonction que vous voulez que les autres modules utilisent • Vous pouvez aussi inclure des types dérivés dans l’entête. Nous allons en voir la semaine prochaine. JGA Beaulieu
Exemple – grandpetit.c #include <stddef.h> #include <unistd.h> #include "compare.h" int main(void) { int firstInt = 5; int secondInt = 10; int* pIntG = NULL; int* pIntS = NULL; pIntG = Greater(&firstInt,&secondInt); pIntS = Smaller(&firstInt,&secondInt); printf("Greater: %d Smaller: %d\n", *pIntG, *pIntS); system("PAUSE"); exit(0); } //main JGA Beaulieu
Exemple – compare.h //compare.h interface de compare blablabla //retourne un pointeur de type int qui pointe //au plus grand de deux ints int* Greater(int* px, int* py); //retourne un pointeur de type int qui pointe //au plus petit de deux ints int *Smaller(int* px, int* py); JGA Beaulieu
Exemple – compare.c //compare.c le corps du module compare blablabla //retourne un pointeur de type int qui pointe //au plus grand de deux ints int* Greater(int* px, int* py) { return (*px > *py ? px : py); }//Greater //retourne un pointeur de type int qui pointe //au plus grand de deux ints int *Smaller(int* px, int* py) { return (*px < *py ? px : py); }//Smaller JGA Beaulieu
Construction avec composantes • Avec le développement de modules partout dans le monde, les bibliothèques de fonctions et les composantes émergent à tout les jours • Ces composantes peuvent être des solutions entières ou des pièces qui peuvent être assemblées en systèmes • Le masquage d’information et le concept d’abstraction rendent possible la construction de systèmes à partir de composantes dont on ne connaît pas l’implémentation • La suite de MS-OfficeTM est dessiné avec ce concept JGA Beaulieu
Quiz Time • Qu’est-ce que le masquage d’information? • Pourquoi ce concept est important? • Que veut-on dire par encapsulation? • Un fichier entête pour un module est aussi appelé _____________ du module • Le fichier corps est aussi connue comme _____________ du module JGA Beaulieu
Références *Vous n’avez pas ces références, c’est pour vous donner l’information S. Ambler, The Object Primer, 2nd Ed. H. van Vliet, Software Engineering, 3rd Ed. JGA Beaulieu