--- title: ING1 - MOB1 tags: EPITA --- # Approche Objet de la Programmation - MOB 1 ## Programmation Procédurale / Impérative * Modèle de **Von Neumann** : - Manipulation registre - Echange avec la mémoire * Programmation Impérative "pure" (FORTRAN, Assembleur) * Origine * Fonctionnement du matériel * Architecture de Von Neumann - Execution d'instruction (ordonnée) - Effet de bord (modification de context) Modication de l'état général du programme suite à l'exécution d'une instruction * Programmation Procédurale "extension" (C, Python) - Factorisation (ajout des boucles for/while,...) - Evite la duplication de code Approche **Bottom-Up** ### Limite prog procédurale - Notion de paradigme - Expressivité - Manière de penser **=> Peut-on exprimer X facilement ?** - Turing-Complétude : Même puissance d'expression tous langages confondus. - POO (Programmation Orientée Objet): - Convergence d'état (relation plusieurs à un) - Divergence de comportement (relation un à plusieurs) ![](https://i.imgur.com/wG5tRf0.png) ## Principe de substitution de Liskov Principe de substituabilité appliqué aux objets : un objet de type T est attendu, on doit pouvoir passer un objet de type Y sans que le comportement dudit objet soit changé. C'est-à-dire que tout invariant inhérent à la classe T être respecté dans ses classes filles. ## Programmation Orienté Objet /!\ Programmation Orientée Objet => 'Message Oriented Programming' (Alan Kay) Langage statiquement typé : opération éventuellement autorisées : introspection + instanciation - Classe : Défini un objet - Se comporte comme un type de données - Nom : Type de l'objet (Human, string) - Attribut de classe : attribut ayant la même valeur dans tous les objets d'une classe - Méthodes de classe : méthode n'accédant qu'à des attributs de classe - Méthode virtuelle : méthode sujette à la ré-écriture - Méthodes qui rend l'instance dynamique (créée, modifiée, détruite) - Instanciation : Création d'un objet (avec paramètre) Pas de valeurs de retour Cohérence interne (agrégats) Si pas de constructeur fournit : langage fournit un constructeur par défaut - Destruction (~Nom pour le C++) : Nom de la procédure prédéfinie Destructeur = procédure de suppression d'un objet Nettoyage mémoire Pas de valeur de retour Finaliseur (ramasse-miette (recyclage) : Java : Convention : .die(), .close()...) - Relations (type static, contenu dynamique) - Agrégation : forme d'inclusion - Relation de **type "a un"** Maintient de références (aka pointeurs) vers des objets *agrégés* ![](https://i.imgur.com/umZd0VJ.png) *agréga : Human | agrégé : Employee* Agrégé survit si l'agréga est détruit (il faut le détruire manuellement) -> Agrégation composite : L'agrégé est détruit si son unique agréga est détruit Relation "ensemble/parties" (transitive) - Héritage : dérivation - Inclusion stricte - Relation de **type "est un"** - Dérivation : héritage d'implémentation + interface * Opération d'instanciation * Contenu agrégé intégré dans la classe (Employee c Human) * Pas d'agrégat (intermediaire) => Forme de sous-typage (principe de **substitution de Liskov**) * Pas de duplication (système auto) * Employee hérite/dérive de human ![](https://i.imgur.com/TFCpcLJ.png) *Suite après la description de l'objet* - Composition : Agrégation plus forte - Objet => Instance d'une unique classe (dynamique) - On peut générer autant d'objet que l'on veut depuis une classe - Nom (statique) : fournit par défaut pour la création et la destruction - Attributs (statique) - 1 déclaration par classe (statique) Commun à tous les objets de la classe - Champs publique : Accès libre - Interface : Ensemble des infos publiques ![](https://i.imgur.com/S3OWIL2.png) - 1 valeur par objet (dynamique) - Champs privés : Nécessite l'instanciation d'un objet + méthode déclarée dans la classe - Accesseurs (getter/setter) : Consultation / Modification des attributs privés ![](https://i.imgur.com/NWSrsV8.png) - Possibilité d'accès par concept d'amitié entre les classes (cas par cas): Cas par défaut définit - Relation (dynamique) - Methodes (statique) - 1 définition par classe (statique) - contenu spécifique à chaque objet - Méthodes privées : accessible uniquement depuis l'intérieur de la classe La classe qui défini l'objet est statique : fixé et connu à la compilation API introspection (Java) Pas d'intercession (auto-modification) Héritage : - - Hiérarchie de classe : - Relation transitive : si une classe A hérite d'une classe B qui hérite d'une classe C, alors la classe A hérite de la classe C. - Héritage multiple : plusieurs super classes - Structure en arbre ou en graphe orienté - Restriction d'instanciation - Classe abstraite : non instanciable - Classe finale : non dérivable ![](https://i.imgur.com/tFmfMPo.png) - Protection (publique/privée): - Protégée - Restreint à la sous-hierarchie (le type de l'objet représente la racine de la hierarchie d'accès à l'attribut) - Publique - La racine de la hiérarchie est telle que toutes les classes peuvent accéder à l'attribut - Problèmes : - Exposition de l'implémentation - Héritage de l'interface de liste - Héritage multiple : plusieurs classes mère - Ambiguïtés - Problème de performance - Sous-classage : - Héritage d'implémentation (réutilisabilité du code) - Héritage d'interface (sémantique, sous-typage) **Héritage d'implémentation => Héritage d'interface** - Sous-typage : Sous-entend que tout objet d'une classe peut être manipulé comme un objet d'une super-classe - Héritage par restriction - Imposer des contraintes plus fortes dans la sous-classe que dans la super-classe - Programmation différentielle - Hériter de manière additive au lieu de restrictive - Problème de mutation - Ambiguïtés - Héritage en diamant = duplication ou non de la classe commune ![](https://i.imgur.com/cSvrdsE.png) ### Historique * Smalltalk (1971 + 1980) - Alan Kay + Dan Ingalls - 1er langage POO - DynaBook 1972 * Simula (1962 + 1967) - Ole-Johan Dalh + Kristen Nygaard - Smalltalk - Origine du modèle de Hoare - Origine des mécanismes orienté objet Actuellement : - Standardisation * OMG (Object Management Group) : 1989 * UML (Unified Modelling Language) : Modelisation graphique ## Surcharge, Masquage, Ré-écriture | Surcharge | Masquage | Ré-écriture | | -------- | -------- | -------- | | Même nom, signature différente | Même nom, signature différente ou identique | Même nom, même signature | | Méthodes statiques/dynamiques + fonctions + opérateurs | Méthodes statiques/dynamique | Méthodes "virtuelles" | | Dispatch statique | Dispatch statique | Dispatch dynamique | | Polymorphisme intra-classe | Polymorphisme inter-classe | Polymorphisme intra-hierarchique (inclusion) | | ![](https://i.imgur.com/BddaUi3.png) | ![](https://i.imgur.com/zLPfDk8.png) | ![](https://i.imgur.com/FwFHjfv.png) | Dispatch <=> Polymorphisme Utilité - Faire des choses un peu différemment - Faire la même chose différemment - Relation gène <-> allèle Dispatch * Statique => Optimisé, performant à la compilation * Dynamique => Energivore, moins performant Ré-écriture * Satisfait la covariance sur son type de retour et la contravariance sur ses arguments | Langage | Propagation de la surcharge | Masquage ≠ Ré-écriture | | -------- | -------- | -------- | | **Java** | Oui | Méthodes statiques si même signature | | **C++** | Non, par défaut | Méthodes statiques uniquement | ## Méthodes abstraites Méthode abstraites => Classe abstraites - Classe abstraite = Classe non-instanciable - Déclarée sans implémentation initiale - Implémentée dans les sous-classes - Méthode abstraite = méthode "virtuelle pure" ![](https://i.imgur.com/4AE0Cyq.png) ## Covariance et Contravariance - Covariance - un type lié à une hiérarchie de classe est spécialisé dans le même sens que l'héritage - Contravariance