Programmation OO en Scheme Comment encapsuler la pile avec les procédures empiler! et depiler!? La variable PILE ne peut pas être une variable locale dans la fermeture d aucune procédure. Solution : messages avec une fonction de «dispatch» qui décide comment modifier les données locales. Université de Montréal Programmation modulaire notes de cours 1 OO en Scheme II (define pile (lambda () (let ((PILE ())) (lambda msg (case (car msg) ((depiler!) (let ((resultat (car PILE))) (set! PILE (cdr PILE)) resultat)) ((empiler!) (set! PILE (cons (cadr msg) PILE))) (else (error "Methode inconnue"))))))) (define p1 (pile)) (p1 empiler! 2) (p1 empiler! 4) (p1 depiler!) => 4 Université de Montréal Programmation modulaire notes de cours 2
OO en Scheme III Encapsulation de données et méthodes : L objet boîte : méthodes placer!, montrer : messages placer! valeur et montrer (define boite (lambda (valeur-initiale) (let ((valeur valeur-initiale)) (lambda message ; (case (car message) ; message montrer retourne la valeur stockee ((montrer) valeur) ; message placer! val pour changer la valeur stockee ((placer!) (set! valeur (cadr message))) ; message reset! ((reset!) (set! valeur valeur-initiale)) (else (deleguer objet-base message))))))) ; [heritage] Université de Montréal Programmation modulaire notes de cours 3 OO en Scheme IV Délégation : héritage de méthodes (define deleguer (lambda (objet msg) (apply objet msg))) ; objet de base: aucune méthode (define objet-base (lambda message indicateur-methode-indefinie)) (define indicateur-methode-indefinie "Methode inconnue.") Université de Montréal Programmation modulaire notes de cours 4
OO en Scheme V héritage avec sous-classe (define accumulateur (lambda () (let ((super (boite 0))) (lambda message (case (car message) ((placer!) indicateur-message-indefinie) ; n est pas héritée ((add!) ; message add! valeur (envoyer super placer! (add (envoyer super montrer) (cadr message)))) (else (deleguer super message))))))) Université de Montréal Programmation modulaire notes de cours 5 OO en Scheme VI Procédure pour envoyer des messagesaux objets : envoyer (define envoyer (lambda args ; (objet. message) ; A FAIRE: appliquer message à objet: erreur si résultat ; est indicateur-methode-indefinie )) (notez que la forme des messages est différente en TP3 : ici, il n y a pas de self) Université de Montréal Programmation modulaire notes de cours 6
Modules def : module = regroupement syntaxique de données et procédures But : organisation logique du programme unité de compilation Université de Montréal Programmation modulaire notes de cours 7 Modules II utilité de modules : introduire des types abstraits représentation n est pas visible à d autres modules : règles de visibilité pour «information hiding» Type abstrait : 1. définition+opérations en une unité syntaxique 2. d autres unités peuvent déclarés des variables de ce type 3. visibilité de représentation bien contrôlée (encapsulation) Université de Montréal Programmation modulaire notes de cours 8
Modules en Simula SIMULA 67 : 1ère langage de oo pour simulation de grands systèmes avec beaucoup d objets qui s interagissent class Mouse; begin -- variables -- -- procédures -- -- code -- end Mouse; en une unité syntaxique, d autres unités peuvent déclarer des variables de ce type mais la visibilité n est pas contrôlée : les variables locales de la classe sont accessibles à tous Ada, C++, Java : possibilité d avoir des types abstraits Université de Montréal Programmation modulaire notes de cours 9 Modules en Ada Ada : interface (package) et implémentation (package body) package PILEPACK is type PILETYPE is limited private; TAILLE_MAX: constant := 100; function VIDE(PILE: in PILETYPE) return BOOLEAN; procedure EMPILER(PILE: in out PILETYPE; EMT: in INTEGER); function DEPILER(PILE: in out PILETYPE) return INTEGER; -- private type LISTETYPE is ARRAY (1..TAILLE_MAX) of INTEGER; type PILETYPE is record LISTE: LISTETYPE; POS: INTEGER range 0..TAILLE_MAX := 0; end record; end PILETYPE; Université de Montréal Programmation modulaire notes de cours 10
Modules en Ada II 1. limited private déclare un type abstrait qui est visible à d autres unités mais sa représentation est visible seulement au compilateur (nécessaire en Ada pour compilation séparée) 2. la signature des procédures publiques est donnée (nécessaire pour compilation séparée) le nom des paramètres est spécifié car appel par paramètres nommés est possible en Ada : EMPILER(EMT => 8, PILE => MA_PILE); 3. notez les paramètres passés par valeur (in) et par valeurrésultat (in out) 4. private introduit la partie invisible à d autres modules (mais visible au compilateur lors de leur compilation) (un type abstrait peut être déclaré limited private ou private, si private, alors affectation et égalité sont prédéfinis ; si limited private, alors aucune opération n est prédéfinie.) Université de Montréal Programmation modulaire notes de cours 11 Modules en Ada III Implémentation : package body package body PILEPACK is function VIDE(PILE: in PILETYPE) return BOOLEAN is begin return STK.POS = 0; end VIDE; -- implementation d autres procedures: EMPILER et DEPILER end PILEPACK; usage with PILEPACK, TEXT_IO; -- pour importer le package use PILEPACK, TEXT_IO; -- pour ecrire DEPILER au lieu de PILEPACK.DEPILER procedure EXEMPLE is MA_PILE: PILETYPE; begin EMPILER(MA_PILE, 6);... end EXEMPLE; Université de Montréal Programmation modulaire notes de cours 12
Modules paramétrés Ada : generic TAILLE_MAX: POSITIVE; type EMT_TYPE is private; package PILEPACK is type PILETYPE is limited private; procedure EMPILER(PILE: in out PILETYPE; EMT: in EMT_TYPE); -- etc. end PILE_PACK;... package PILE_D_ENTIERS is new PILEPACK(100, INTEGER); package PILE_D_FLOTTANTS is new PILEPACK(999, FLOAT); Université de Montréal Programmation modulaire notes de cours 13 Classes En Ada, rien n empêche de mettre un ou plusieurs types abstraits en un module, un module d Ada n est pas un type. Classes (C++, Java, SIMULA) : types en un module ATTRIBUTS (données) + OPÉRATIONS (méthodes, fonctions, messages) sur ces données. Une classe est un type d objets ayant la même structure et le même comportement. Instance (de classe) : il s agit d un objet du type défini par la classe. Université de Montréal Programmation modulaire notes de cours 14
Classes II Différence entre classe et module : une classe est comme un module mais elle définit aussi un nouveau type. Ainsi on pourra instancier plusieurs objets de ce type (alors que dans le cas du module, il n existe qu une seule instance des variables du module). C++ : constructeurs et destructeurs Java : constructeur (pas de destructeur car ramasse-miette méthode finalize appellée par le «garbage collector» quand l objet est libéré mais à un temps indéfini qui dépend de l implémentation de gc) Université de Montréal Programmation modulaire notes de cours 15