POO_CH1 [Mode de compatibilité]
Transcription
POO_CH1 [Mode de compatibilité]
POO par Jenny Benois-Pineau 13/01/2013 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) 13/01/2013 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 Personne.hpp struct Personne { char Nom[25]; 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() { Personne Ind; strcpy(Ind.Nom, "Toto"); strcpy(Ind.Societe, "ABC SARL"); 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; - le résultat??? Accès libre à toutes les composantes->possibilité de modifier malencontreusement SePresente(Ind); 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 Personne Objets + Nom Classe + Societe P R + SePresente Q Instancier 8 4 Classe C++ Personne.hpp Class Personne { public: char Nom[25]; char Societe[25]; void SePresente(); }; Personne.cpp #include ``Personne.hpp`` void Personne::SePresente(){ cout<<« Je m'appelle" <<Nom<<endl; cout<<"Je travaille à"<<Societe<<endl; } Fonction-membre 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 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 13/01/2013 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. 13/01/2013 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; } 13/01/2013 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/01/2013 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 ” 13/01/2013 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 13/01/2013 15 Inclusion conditionnelle(2) Dans un fichier .hpp #ifndef MaClasse_H #define MaClasse_H class MaClasse{ ….. }; #endif 13/01/2013 16 8 Branchement conditionnel #ifdef identificateur Partie –alors #else Partie-sinon #endif Exemple : #ifdef VERBOSE cout<<“ Valeur a “ =<<a; 13/01/2013 17 Classe Java Personne.java import java.awt.*; Class Personne { 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.*; Class Personne { 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) Personne.hpp Class Personne { public: char Nom[25]; char Societe[25]; void SePresente(); }; Personne.CPP void Personne::SePresente(){ cout<<« Je m'appelle" <<Nom<<endl; cout<<"Je travaille à"<<Societe<<endl; } Personne.hpp Class Personne { public: char Nom[25]; 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) Personne.hpp Class Personne { public: char Nom[25]; char Societe[25]; void SePresente(); }; Personne.CPP void Personne::SePresente(){ cout<<« Je m'apelle" <<Nom<<endl; cout<<"Je travaille à"<<Societe<<endl; } Personne.hpp Class Personne { public: char Nom[25]; 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 13/01/2013 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 13/01/2013 22 11 Protection des membres Personne - Nom - Societe + Public - Private O Protected + SePresente 13/01/2013 23 Protection des données Personne.hpp Class Personne { private : char Nom[25]; 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 13/01/2013 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. 13/01/2013 26 13