• Aucun résultat trouvé

Approches Objet de la Programmation e Étude de Cas : les Méthodes Binaires E Didier Verna EPITA / LRDE

N/A
N/A
Protected

Academic year: 2022

Partager "Approches Objet de la Programmation e Étude de Cas : les Méthodes Binaires E Didier Verna EPITA / LRDE"

Copied!
32
0
0

Texte intégral

(1)Introduction. Non-Problème. Utilisation. Implémentation. Approches Objet de la Programmation e Étude de Cas : les Méthodes Binaires E Didier Verna EPITA / LRDE. didier@lrde.epita.fr. lrde/~didier. @didierverna. didier.verna. in/didierverna. Conclusion.

(2) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Types, Classes, Héritage Corollaire : Combinaisons de Méthodes Validation du Concept – Niveau Utilisateur Introspection Une Méta-Classe de Fonctions Binaires Validation du Concept – Niveau Programmeur Implémentation Non-Contractuelle Implémentation Manquante Conclusion AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 2/34.

(3) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Validation du Concept – Niveau Utilisateur Validation du Concept – Niveau Programmeur Conclusion. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 3/34.

(4) Introduction. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. I Opération Binaire : 2 arguments de même type Opérations arithmétiques, relations d’ordre (=, +, > etc.) I Programmation OO : 2 objets de même classe Tirer parti du polymorphisme I D’où le terme de « méthode binaire » I [Bruce et al., 1995] :. I Concept problématique dans l’approche objet traditionnelle I Relation classe / type dans un contexte d’héritage. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 4/34.

(5) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Types, Classes, Héritage Corollaire : Combinaisons de Méthodes Validation du Concept – Niveau Utilisateur Validation du Concept – Niveau Programmeur Conclusion. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 5/34.

(6) Introduction. Contexte. Non-Problème. Utilisation. Implémentation. Conclusion. La Hiérarchie Point Point x : int y : int +equal (p : Point) : Bool. ColorPoint color : String +equal (cp : ColorPoint) : Bool. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 6/34.

(7) Introduction. Non-Problème. C++ : Tentative #1. Utilisation. Implémentation. Conclusion. class Point { int x, y;. };. bool equal (Point& p) { return x == p.x && y == p.y; }. class ColorPoint : public Point { std::string color;. };. bool equal (ColorPoint& cp) { return color == cp.color && Point::equal (cp); }. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 7/34.

(8) Introduction. Non-Problème. C++ : Tentative #1. Utilisation. Implémentation. Conclusion. Échec int main (int argc, char *argv[]) { Point& p1 = * new ColorPoint (1, 2, "red"); Point& p2 = * new ColorPoint (1, 2, "green");. }. std::cout << p1.equal (p2) << std::endl; // => True. #### Wrong ! I ColorPoint::equal masque Point::equal (statiquement) I Seule Point::equal est vue depuis la classe de base I On a besoin de la version exacte. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 8/34.

(9) Introduction. Non-Problème. C++ : Tentative #2. Utilisation. Implémentation. Conclusion. class Point { int x, y;. };. virtual bool equal (Point& p) { return x == p.x && y == p.y; }. class ColorPoint : public Point { std::string color;. };. virtual bool equal (ColorPoint& cp) { return color == cp.color && Point::equal (cp); }. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 9/34.

(10) Introduction. Non-Problème. C++ : Tentative #2 Un ColorPoint. Utilisation. Implémentation. Conclusion. Un Point. Échec bool foo (Point& p1, Point& p2) { return p1.equal (p2); }. ColorPoint::equal attends un ColorPoint… AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. …mais n’obtient qu’un Point ! 10/34.

(11) Introduction. Contexte. Non-Problème. Utilisation. Implémentation. Conclusion. La Hiérarchie Point Point x : int y : int +equal (p : Point) : Bool. ColorPoint color : String +equal (cp : ColorPoint) : Bool. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 11/34.

(12) Introduction. Non-Problème. Utilisation. Implémentation. Rappels : Covariance / Contravariance I Règle Théorique :. Conclusion. virtual bool equal (Point& p); virtual bool equal (ColorPoint& cp);. I contravariance sur les arguments I covariance sur les valeurs de retour. I En Pratique :. I invariance sur les arguments I Ambiguïtés dues à la surcharge. I Remarque :. I Eiffel autorise la covariance sur les arguments I Erreurs potentielles à l’exécution. I Analyse : [Castagna, 1995]. I Manque d’expressivité sous-typage (par sous-classage) 6= spécialisation I Défaut du modèle object classique Absence des multi-méthodes. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 12/34.

(13) Introduction. Non-Problème. CLOS : Tentative #1. Utilisation. Implémentation. Conclusion. (defgeneric point= (a b)) (defclass point () ((x :initarg :x :reader point-x) (y :initarg :y :reader point-y))) (defmethod point= ((a point) (b point)) (and (= (point-x a) (point-x b)) (= (point-y a) (point-y b)))) (defclass color-point (point) ((color :initarg :color :reader point-color))) (defmethod point= ((a color-point) (b color-point)) (and (string= (point-color a) (point-color b)) (call-next-method))) AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 13/34.

(14) Introduction. Non-Problème. CLOS : Tentative #1. Utilisation. Implémentation. Conclusion. Succès (let ((p1 (make-point :x 1 :y 2)) (p2 (make-point :x 1 :y 2)) (cp1 (make-color-point :x 1 :y 2 :color "red")) (cp2 (make-color-point :x 1 :y 2 :color "green"))) (values (point= p1 p2) (point= cp1 cp2))) ;; => (T NIL). I Sélection de la méthode appropriée sur les 2 arguments Multiple dispatch I Syntaxe d’appel de fonction plus satisfaisant p1.equal(p2) or p2.equal(p1) ? I « Fonction binaire » AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 14/34.

(15) Introduction. Non-Problème. Utilisation. Implémentation. Rappel : Combinaisons de Méthodes. Conclusion. I Éviter la duplication de code :. I C++ : Point::equal() I CLOS : (call-next-method). I Méthodes Applicables :. I Toutes les méthodes compatibles avec les classes des arguments I Classées par spécificité décroissante I call-next-method exécute la méthode suivante dans cet ordre. I Combinaisons de méthodes :. I Appeler plusieurs méthodes applicables Pas seulement la plus spécifique I Combinaisions prédéfinies : and, or, progn etc. I Programmable. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 15/34.

(16) Introduction. La Combinaison and. Non-Problème. Utilisation. Implémentation. Conclusion. (defgeneric point= (a b) (:method-combination and)) (defmethod point= and ((a point) (b point)) (and (= (point-x a) (point-x b)) (= (point-y a) (point-y b)))) (defmethod point= and ((a color-point) (b color-point)) (and (call-next-method) (string= (point-color a) (point-color b)))). I Note : le dispatch de CLOS est programmable. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 18/34.

(17) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Validation du Concept – Niveau Utilisateur Introspection Une Méta-Classe de Fonctions Binaires Validation du Concept – Niveau Programmeur Conclusion. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 19/34.

(18) Introduction. Non-Problème. Utilisation. Utilisation Non Contractuelle. Implémentation. Conclusion. Succès non mérité (let ((p (make-point :x 1 :y 2)) (cp (make-color-point :x 1 :y 2 :color "red"))) (point= p cp)) ;; => T #### Wrong ! I (point= <point> <point>) est applicable Un color-point est un point I Se prémunir contre une telle situation. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 20/34.

(19) Introduction. Non-Problème. Introspection dans CLOS. Utilisation. Implémentation. Conclusion. (assert (eq (class-of a) (class-of b))) I Quand vérifier ? I I I I I. Chaque méthode : duplication Dernière méthode : pas efficace / pas toujours possible :before : pas disponible hors combinaison standard Nouvelle combination : pas le lieu :around : oui mais…. I Où vérifier ? (meilleure question). I Nulle part dans le code de point= I Lié au concept de fonction binaire, pas à point=. I Exprimer le concept de fonction binaire lui-même. I Les fonctions binaires sont des fonctions génériques particulières. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 21/34.

(20) Introduction. Non-Problème. Utilisation. Implémentation. Une Méta-Classe de Fonctions Binaires. Conclusion. I Fonctions génériques : standard-generic-function I Objets-fonctions : funcallable-standard-class (defclass binary-function (standard-generic-function) () (:metaclass funcallable-standard-class)) (defmacro defbinary (function-name lambda-list &rest options) `(defgeneric ,function-name ,lambda-list (:generic-function-class binary-function) ,@options)). I Remarque : le concept impose une lambda-list particulière…. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 22/34.

(21) Introduction. Appels Génériques. Non-Problème. I compute-discriminating-function : calcul, classement et exécution des méthodes applicables I compute-applicable-methods-using-classes : calcul et classement des méthodes applicables I compute-effective-method : Application des méthodes (combinées) aux arguments I Note : fonctions génériques spécialisables. Utilisation. Implémentation. Conclusion. Protocole generic call. comp-dscr-func. comp-app-meth-usg-cls. comp-eff-meth. Couche Utilisateur Couche 3 AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 23/34.

(22) Introduction. Non-Problème. Utilisation. Implémentation. Application aux Fonctions Binaires. Conclusion. (defmethod compute-applicable-methods-using-classes :before ((binary-function binary-function) classes) (assert (= (length classes) 2)) (assert (apply #'eq classes))). AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 24/34.

(23) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Validation du Concept – Niveau Utilisateur Validation du Concept – Niveau Programmeur Implémentation Non-Contractuelle Implémentation Manquante Conclusion. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 25/34.

(24) Introduction. Non-Problème. Utilisation. Implémentation. Implémentation Non-Contractuelle. Conclusion. ;; #### WRONG SPEC!! (defmethod point= ((p1 point-3d) (p2 point-2d)) #| ... |#) I Précédemment : protection contre les appels illégaux I Question : protection contre les implémentations illégales ?. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 26/34.

(25) Introduction. Non-Problème. Définition de Méthodes. Utilisation. Implémentation. Conclusion. I ensure-method : Protocole création et ajout de la nouvelle defmethod méthode I make-method : ensure-method création du méta-objet I add-method : mise à jour de la fonction générique I Note : fonctions génériques spécialisables. make-method. add-method Couche 1 Couche 2 Couche 3. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 27/34.

(26) Introduction. Non-Problème. Utilisation. Implémentation. Application aux Fonctions Binaires. Conclusion. (defmethod add-method :before ((bf binary-function) method) (let ((method-specializers (method-specializers method))) (assert (= (length method-specializers) 2)) (assert (apply #'eq method-specializers)))). I method : méta-objet (Cf. standard-method) I method-specializers : accesseur. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 28/34.

(27) Introduction. Non-Problème. Implémentation Manquante. Utilisation. Implémentation. Conclusion. I Chaque sous-classe de point doit spécialiser point= I Vérification tardive : lors d’un appel générique préserver la haute dynamicité I « Binaire-complétude » : il existe une méthode primaire applicable pour chaque classe de la hiérarchie (defmethod compute-applicable-methods-using-classes :around ((bf binary-function) classes) (multiple-value-bind (methods ok) (call-next-method) ;; 1. Check for binary completeness on METHODS ;; 2. If everything goes well, simply return ;; what we got from CALL-NEXT-METHOD (values methods ok))). AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 29/34.

(28) Introduction. Mise en oeuvre. Non-Problème. Utilisation. Implémentation. Conclusion. (loop :for class :in (class-precedence-list (car classes)) :until (eq class (find-class 'standard-object)) :do (assert (find-if (lambda (method) (let ((qualifiers (method-qualifiers method))) (and (equal (method-specializers method) (list class class)) (not (member :around qualifiers)) (not (member :before qualifiers)) (not (member :after qualifiers))))) methods))). I class-precedence-list : accesseur I method-qualifiers : accesseur AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 30/34.

(29) Plan. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. Introduction Un Non-Problème Validation du Concept – Niveau Utilisateur Validation du Concept – Niveau Programmeur Conclusion. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 31/34.

(30) Conclusion. Introduction. Non-Problème. Utilisation. Implémentation. Conclusion. I Méthodes binaires : un concept très simple. I Difficile à implémenter dans un système OO classique I Trivial avec des multi-méthodes. I Grâce à CLOS :. I Validation de l’utilisation I Validation de l’implémentation. I Grâce au MOP :. I Concept explicite I Extension du système OO de base. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 32/34.

(31) Plan. Bibliographie. Bibliographie. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 33/34.

(32) Bibliographie. Bibliographie. Bruce, K. B., Cardelli, L., Castagna, G., Eifrig, J., Smith, S. F., Trifonov, V., Leavens, G. T., and Pierce, B. C. (1995) On Binary Methods Theory and Practice of Object Systems, 1(3):221–242 Castagna, G. (1995) Covariance and Contravariance : Conflict Without a Cause ACM Transactions on Programming Languages and Systems, 17(3):431–447 Verna, D. (2008) Binary Methods Programming : the CLOS Perspective Journal of Universal Computer Science, Vol. 14.20. AOP / Étude de Cas : les Méthodes Binaires – Didier Verna. 34/34.

(33)

Références

Documents relatifs

ACANTHE DEVELOPPEMENT Société Anonyme au capital de 41 721 439 euros Siège social : 2 rue de Bassano 75116 - PARIS 735 620 205 RCS PARIS __________________________ RAPPORT DE GESTION

Seuls seront admis à assister à l’assemblée, à voter par correspondance ou à s’y faire représenter, les actionnaires qui auront justifié de cette qualité par

Neuvième résolution Délégation de compétence à donner au conseil d’administration pour décider i l’augmentation du capital social par émission - avec suppression du

Remarque importante Il n’est pas toujours possible d’exprimer explicitement les primitives à l’aide de fonctions usuelles... Introduction au

Ce préambule est ainsi conçu : « NOUS, PEUPLES DES NATIONS UNIES, RÉSOLUS à préserver les générations futures du fléau de la guerre qui, deux fois en l‟espace d‟une vie

Partie A : question de cours On suppose connus les résultats suivants : 1 deux suites un et vn sont adjacentes lorsque : l’une est croissante, l’autre est décroissante et un −

En 5, la figure de diffraction ne ressemble plus à la fente, nous sommes dans la situation de Fraunhofer... I.4 – Problématique Pratiquement, le problème de la diffraction est

L’usage des herbicides en milieux aquatiques étant interdit par la réglementation, seules des méthodes de lutte mécaniques et manuelles sont utilisées pour supprimer les