Principes de l'orienté objet Jean-Jacques LE COZ
Abstraction La capacité d'un programme à ignorer certains aspects de l'information qu'il manipule. Chaque objet dans le système sert de modèle à un acteur abstrait qui peut réaliser du travail, rendre compte de son état et le modifier ainsi que communiquer avec d'autres objets sans révéler son implémentation.
Encapsulation Manipulation des objets assurée que par les méthodes. L'encapsulation repose sur le masquage de l'état des objets. L'encapsulation est alors complètement ou partiellement levée à l'aide de méthodes d'accès (getters et setters). Ce principe a été standardisé en Java pour les composants de type JavaBean.
Encapsulation (suite) Certains langages permettent de définir l'encapsulation (SmallTalk) en tant que telle. Les langages C++, Java et Python ne le permettent pas. Il faut donc utiliser la visibilité privée ou protégée. Attention pour ces langages, l'encapsulation est levée entre des instances d'une même classe.
Encapsulation (fin) L'encapsulation pose le fondement même de l'approche objet : Découpler l'interface de l'implémentation. Interface: ce que l'on voit d'un objet. Implémentation: la représentation interne de l'objet.
Standard JavaBean public class Pojo { private String X; private int[ ] Y; public Pojo(String arg) { this.setX(arg); tableau = { 1,2,3,4,5 }; } public void setX(String attribut) { X = attribut; } public void setY(int[ ] arg) { Y = arg; } public String getX() { return X; } public int[ ] getY() { return Y; } }
Polymorphisme Permettre à la même définition d'être utilisée avec des types différents de données (classes, objets). Le polymorphisme s'applique aux types de données et aux fonctions. Fonction polymorphe. Type de donnée polymorphe.
Exemple de polymorphisme Si un oiseau reçoit le message de partir vite : - il agite ses ailes et vole Si un lion reçoit le même message : - il bouge ses pattes et court Les deux réagissent au même message mais de façon différente.
Polymorphisme (suite) Trois types de polymorphisme: Polymorphisme «ad-hoc». Surcharge (overloading methods) Polymorphisme de spécialisation Réécriture ou implémentation (overriding methods) polymorphisme «parametric». Généricité ou template. Fonction(arg : type), arg représente n'importe quel type. *«Duck typing» : dynamic type system (Python, Ruby)
Polymorphisme en Java (1) public interface MonInterface { public void methode_polymorphe(); } public class MaClasseUne implements MonInterface { public void methode_polymorphe() { System.out.println(''un comportement''); } } public class MaClasseSeconde implements MonInterface { public void methode_polymorphe() { System.out.println(''un autre comportement''); } }
Polymorphisme en Java (2) public abstract class MonAbstraction { public abstract void methode_polymorphe(); } public class MaClasseTroisieme extends MonAbstraction { public void methode_polymorphe() { System.out.println(''un comportement''); } public class MaClasseQuatrieme extends MonAbstraction { public void methode_polymorphe() { System.out.println(''un autre comportement''); }
Polymorphisme en Java (3) public static void main(String args[ ]) { MonInterface objet1 = MaClasseUne(); MonInterface objet2 = MaClasseSeconde(); MonAbstraction objet3 = MaClasseTroisieme(); MonAbstraction objet4 = MaClasseQuatrieme();... // comportements polymorphes: objet1.methode_polymorphe(); objet2.methode_polymorphe(); objet3.methode_polymorphe(); objet4.methode_polymorphe();
Polymorphisme (suite) Sous-typage et polymorphisme Permet à une fonction écrite pour prendre un argument de type T d'accepter un type S sous-type de T. Respecte le principe de substitution de Barbara Liskov. Barbara Liskov et Jeannette Wing 1993
Polymorphisme (suite) Polymorphisme multiple Covariance Le comportement polymorphe est supporté par la spécialisation des méthodes et des arguments des méthodes Contravariance Le comportement polymorphe est supporté par la spécialisation des méthodes et la généralisation des arguments des méthodes
Covariance
Double dispatch Technique de programmation pour supporter le polymorphisme multiple Basée sur le Design pattern Visiteur Mise en évidence du comportement polymorphe Sur deux dérivations de classes Permet un couplage faible entre les visités et les visiteurs
Double Dispatch en action Polymorphisme
Principe 0 Si une classe est une sorte raffinée d'une autre classe alors cette classe est sous-classe de cette autre classe.
Principe 1 Identifier les aspects de l'application qui varient et les séparer de ceux qui restent les mêmes.
Exemple 1 Tout va bien méthodes héritées méthode réécrite
Exemple 1 (suite) Ajouter klaxonner tous les sous-types héritent de klaxonner() Tout va bien
Exemple 1 (suite) Besoin de réécrire les méthodes qui ne conviennent pas Ajouter voler() Ajouter Avion Rien ne va plus
Exemple 1 (suite) Solution par interfaces ?
Exemple 1 (suite) Rassembler tout ce qui varie à part de tout ce qui est stable Solution :
Principe 2 Programmer par interfaces pas par implémentations.
Exemple 1 (suite) Elever le niveau d'abstraction :
Exemple 2 (Java) public void methodeA(Vector arg) { for(int i=0; i<arg.size(); i++)... } public void methodeA(Collection arg) { for(int i=0; i<arg.size(); i++)... } public void methodeA(Collection arg) { methodeB(arg.iterator());... } public void methodeB(Iterator arg) { while(arg.hasNext()) Problème de départ 2 - Première solution 3 - Seconde solution
Principe 3 Favoriser la composition et non l'héritage La relation «A-UN» peut-être plus intéressante que la relation «EST-UN»
Exemple 1 (fin) est un : a un :
Principe 4 S'efforcer de coupler légèrement les objets qui interagissent. Permet de construire des systèmes souples qui permettent les évolutions car ils minimisent l'interdépendance des objets. Design pattern : Observateur, Commande
Exemple 3 Trop fort couplage entre AcquisitionDonnéesMétéo et les deux autres classes
Exemple 3 (fin) Solution de découplage avec le design pattern Observateur
Principe 5 Les classes doivent être ouvertes pour les extensions mais fermées pour les modifications. Design pattern : décorateur, visiteur
Exemple 4
Exemple 5
Principe 6 Dépendre d'abstractions et non de classes concrètes. Design pattern : Fabrique
Exemple 6
Principe 7 Ne parler qu'à ses amis. Design pattern : Façade, Adaptateur
Exemple 7
Principe 8 Ne nous appelez pas, nous vous appellerons.* *Hollywood principe Design pattern : Patron de méthode (template)
Exemple 8
Principe 9 Une classe ne doit avoir qu'une seule raison de changer. Une classe = une responsabilité
Principe dit d'Inversion Dépendre d'abstractions et pas de classes concrètes. Pour suivre le principe : aucune variable ne doit avoir de référence vers une classe concrète, aucune classe ne doit dériver d'une classe concrète, aucune méthode ne doit réécrire une méthode dont l'implémentation a été faite dans une classe de base.
Principe dit d'Inversion (suite) Synonymes Inversion de contrôle (IOC) Inversion de dépendance objetN objet1 objet2objet3 new objet1objet2objet3objetN structure intermédiaire new
Annexe A: type de donnée Est un label ou un nom pour un ensemble de valeurs et d'opérations sur ces valeurs. Bienfaits: Sécurité Optimisation Documentation Abstraction/modularité
Annexe A (suite) La détermination du type Lors de la compilation Statique Java, C++ Au moment de l'exécution Dynamique Ruby, Python
Bibliographie Conception et Programmation Objet – B. Meyer Design Patterns – Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides.