Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Modules et masquage dinformation
2 Hiver 2010JGA Beaulieu Revue Quelles sont les trois concepts utilisés par les humains pour résoudre les problèmes complexes? Quelle est lerreur avec ce qui suit? 1.float Add (int* anInt, float* aFloat); 2.void main (void) 3.{ 4.int a; 5.float b; 6.myFunction (a, b); 7.} //main 8.void Add(int* param1, float* param2) 9.{ 10.return ((float)*param1 + *param2); 11.}//Add
3 Hiver 2010JGA Beaulieu Synopsis Décomposition modulaire - (un niveau plus haut) Masquage dinformation Encapsulation Quoi cacher Séparation des préoccupations Le module C Le module C – prototypes de fonction Un petit exemple Construction avec des composantes
4 Hiver 2010JGA 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 à lintérieur dun seul fichier: une unité de compilation Nous avons aussi appris comment déclarer un prototype de fonction dans nos programmes.
5 Hiver 2010JGA Beaulieu Décomposition modulaire Les programmes dordinateur qui sont très larges napparaissent pas par magie Le logiciel bien conçu, comme tout autre produit dingénierie doit être conçu avec une philosophie de planification et dimplémentation prudente Tout comme un édifice, un programme logiciel doit avoir une structure bien dessinée; une architecture
6 Hiver 2010JGA Beaulieu Décomposition modulaire Pour les gros programmes, il ne suffit pas seulement de décomposer un programme en fonctions Larchitecture dun 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
7 Hiver 2010JGA Beaulieu Masquage dinformation Information hiding Le concept de masquage dinformation provient dun article séminale de David Parnas (1972) Masquage dinformation: « Chaque module a un secret quil cache des autres modules. »
8 Hiver 2010JGA Beaulieu Masquage dinformation - Encapsulation Le concept de masquage dinformation est clef pour les concepts de décomposition et dabstraction On cache linformation qui peut changer et on expose une interface stable qui ne changera PAS Ceci est connue comme lencapsulation Linformation est obtenue ou changée SEULEMENT en utilisant linterface – Linformation est cachée
9 Hiver 2010JGA Beaulieu Masquage dinformation - Encapsulation Pourquoi est-ce que le masquage dinformation est important? Si nous encapsulons linformation qui peut changer dans limplémentation du module et que nous offrons le service du module au travers dune interface stable, lutilisateur du module na pas besoin de connaître ce quil y a dans limplémentation Je peux changer limplé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
10 Hiver 2010JGA Beaulieu Masquage dinformation – Quoi cacher Quel est ce secret que je veux cacher? Il y a trois types de module pour le masquage dinformation: 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
11 Hiver 2010JGA Beaulieu Masquage dinformation – Quoi cacher Quand nous appliquons le concept de masquage dinformation, 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
12 Hiver 2010JGA 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 lentête du module et autres fonctions internes ou de soutient. Connue comme implémentation du module
13 Hiver 2010JGA Beaulieu Le module C Quand vous faite linclusion de lentête dun module dans votre programme, seulement les fonctions qui sont déclaré dans lentête sont disponibles Ce nest JAMAIS une bonne idée de donner un accès directe à vos variables dans vos modules
14 Hiver 2010JGA Beaulieu Le module C - Prototypes Un module doit avoir deux fichiers du même nom un avec lextension.c et lautre 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 lentête. Nous allons en voir la semaine prochaine.
15 Hiver 2010JGA Beaulieu Exemple – grandpetit.c #include #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
16 Hiver 2010JGA 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);
17 Hiver 2010JGA 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
18 Hiver 2010JGA 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 dinformation et le concept dabstraction rendent possible la construction de systèmes à partir de composantes dont on ne connaît pas limplémentation La suite de MS-Office TM est dessiné avec ce concept
19 Hiver 2010JGA Beaulieu Quiz Time Quest-ce que le masquage dinformation? 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
20 Hiver 2010JGA Beaulieu Références S. Ambler, The Object Primer, 2 nd Ed. H. van Vliet, Software Engineering, 3rd Ed. *Vous navez pas ces références, cest pour vous donner linformation