POO par Jenny Benois-Pineau 1 Introduction Pourquoi POO? Crise du logiciel Robustesse, interchangeabilité des composantes, réutilisation du code, extensibilité, protection Langages : Java, Smalltalk, Eiffel, C++ Objectif de ce cours : appréhender les concepts objet à travers les langages C++ (essentiellement) et Java (exemples) 2 1
POO vs PP/PI(I) Objet =<ensemble des données avec les opérations associées> PP : type abstrait=<données et traitements> PO : Objet =<données et traitements encapsulés> Exemple : modéliser une personne 3 POO vs PP/PI(II) Spécification Type abstrait Données - nom personne - la société Opérations -Se présenter= <afficher les informations> Objet Le nom de la personne ne peut pas être modifié; Restreindre l accès au champ «société» 4 2
POO vs PP/PI(III) La mise en œuvre C++ procédural struct Personne { char Societe[32]; ; void SePresente(Personne P); Personne.cpp #include <iostream.h> #include <string.h> #include "personne.hpp" void SePresente(Personne P) { cout<<"je m'apelle "<<P.Nom<<endl; cout<<"je travaille à "<<P.Societe<<endl; int main() { SARL"); Personne Ind; strcpy(ind.nom, "Toto"); strcpy(ind.societe, "ABC SePresente(Ind); return 0; 5 POO vs PP/PI(IV) Les inconvénients Séparation des données des traitements Contrôles difficiles : Personne Ind; SePresente(Ind); - le résultat??? Accès libre à toutes les composantes->possibilité de modifier malencontreusement 6 3
POO : encapsulation Objet P rassemble dans une même entité encapsule- les données et les comportements Un objet contrôle ses comportements : P.SePresente() vs SePresente(P) On envoie un «message» à objet pour déclencher un traitement P.SePresente() L objet vérifie que le message correspond à un des comportements qu il encapsule (vérification au moment de la compilation) Comment déclarer un objet? 7 Classe : un moule pour les objets Classe Personne + Nom + Societe + SePresente Objets P R Instancier Q 8 4
Classe C++ public: char Societe[25]; void SePresente(); ; Personne.cpp #include ```` void Personne::SePresente(){ cout<<«je m'appelle" <<Nom<<endl; cout<<"je travaille à"<<societe<<endl; utilisepersonne.cpp #include <iostream> #include <string.h> #include "personne.hpp«using namespace std; int main() { Personne Ind; strcpy(ind.nom, "Toto"); strcpy(ind.societe, "ABC SARL"); Ind.SePresente(); return 0; Fonction-membre Fonction externe utilise les objets 9 Discipline de programmation Une classe = (1) fichier.hpp (2) fichier.cpp Le pourquoi : (1)Séparation de la déclaration et d implémentation (2)Compilation séparée 10 5
Directives de pré-compilateur Lorsque on parle de compilation du programme on sous-entend traitement du code source par -pré-compilateur -compilateur proprement dit du fichier résultant de la précompilation -fonctions du pré-compilateur : inclusion des fichiers, définitions des constantes et des macro-commandes, inclusion conditionnelle, pilotage des messages d erreur. 11 DIRECTIVE «include» Fichier MaClasse.cpp #include <iostream> #include MaClasse.hpp #include Util.h using namespace std; // utilisation de l espace de nommage int main(){ MaClasse C; return 0; 12 6
Directive «define» Directive «define» est utilisée pour la définition des constantes, des macro-fonctions, Syntaxe : #define identificateur chaîne de substitution Ex : #define TailleMax 1000 classe Tableau{ int Tab[TailleMax]; int longueur_eff; ; 13 Definition des macro-fonctions #define identificateur(paramètre, ) Exemple : #define ABS(x) x<0? x:-x. x=-2; ABS(x); cette affectation sera substituée par x<0?x:-x Veiller à la correspondance du nombre et du type d arguments: ABS( ABC ) ABC <0? ABC :- ABC 14 7
Inclusion conditionnelle(1) Compilation séparée : permet de corriger les erreurs de syntaxe, des erreurs de correspondance des déclarations aux implémentations, pour chaque classe séparément. g++ -c MaClasse.cpp compilation d un fichier-source Résultat : MaClasse.o fichier-objet 15 Inclusion conditionnelle(2) Dans un fichier.hpp #ifndef MaClasse_H #define MaClasse_H class MaClasse{ ;.. #endif 16 8
Branchement conditionnel #ifdef identificateur Partie alors #else Partie-sinon #endif Exemple : #ifdef VERBOSE cout<< Valeur a =<<a; 17 Classe Java Personne.java import java.awt.*; public String Nom; public String Societe public void Se Presente(){ System.out.println ("Je m'appelle" +Nom); System.out.println ("Je travaille à" +Societe); public static void main (String args[ ]){ Personne P; P=new Personne(); P.nom=Personne(); P. societe=``abc``; P.SePresente(); //toute méthode fait partie d une classe Personne.java import java.awt.*; public String Nom; public String Societe public void SePresente(){ System.out.println ("Je m'appelle" +Nom); System.out.println ("Je travaille à" +Societe); Class Test{ public static void main(string args[ ]){.. 18 9
Fonctions membres C++(1) public: char Societe[25]; void SePresente(); ; Personne.CPP void Personne::SePresente(){ cout<<«je m'appelle" <<Nom<<endl; cout<<"je travaille à"<<societe<<endl; public: char Societe[25]; inline void SePresente(){ cout<<nom; cout<<societe; ; Fonction inline : le code est recopié à la place de l appel pour gagner du temps d exécution 19 Fonctions membres C++(2) public: char Societe[25]; void SePresente(); ; Personne.CPP void Personne::SePresente(){ cout<<«je m'apelle" <<Nom<<endl; cout<<"je travaille à"<<societe<<endl; public: char Societe[25]; void SePresente() const{ cout<<nom; cout<<societe; char* surname () const {return Nom;; ; Fonctions constantes laissent l objet inchangé 20 10
Fonctions constantes(1) On déclare les objets constants afin de ne pas pouvoir les changer (héritage du langage C) class point { public : double x; double y; void affiche(); ; const point c; c.affiche(); //erreur de compilation 21 Fonctions constantes(2).. public : Double x; Double y; void affiche(); //les deux fonctions sont identiques void affiche () const; // mais! ;. int main(){ const point c; c.affiche(); //compilation normale, c est la méthode «const» qui est invoquée Java : la notion de fonction membre constante n existe pas 22 11
Protection des membres Personne - Nom - Societe + Public - Private O Protected + SePresente 23 Protection des données private : char Societe[25]; public : void SePresente(); ; Personne.CPP void Personne::SePresente(){ cout<<«je m'appelle" <<Nom<<endl; cout<<"je travaille à"<<societe<<endl; utilisepersonne.cpp #include <iostream.h> #include <string.h> #include "personne.hpp" int main() { Personne Ind; strcpy(ind.nom, "Toto"); Erreur de compilation strcpy(ind.societe, "ABC SARL"); Erreur de compilation Ind.SePresente(); return 0; 24 12
Accessibilité Classe Nom_Cls Fonctions usuelles private public 25 Masquage de l information File.hpp Class File{ private : xxxxxxxxxxx public : void enfiler(int valeur); void defiler(); int valeur_file const();.. ; Masquage de l implémentation La modification de la partie privée n affecte pas les programmes applicatifs efficacité du processus de développement. 26 13