poo - dept-info.labri.frdept-info.labri.fr/~benois-p/poo_miage/cours/poo_ch1.pdf · 14/01/19 2...

26
19/03/20 1 POO par Jenny Benois-Pineau Chapitre 1 Principes Généraux

Upload: others

Post on 02-Apr-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 1

POO

par

Jenny Benois-Pineau

Chapitre 1 Principes Généraux

Page 2: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 2

Introduction

n  Pourquoi POO ? n  Crise du logiciel n  Robustesse, interchangeabilité des

composantes, réutilisation du code, extensibilité, protection

n  Langages : Java, Smalltalk, Eiffel, C++(Bjarne Stroustrup ), Python(Guido van Rossum)

n  Objectif de ce cours : appréhender les concepts objet à travers les langages C++ (essentiellement) et Java (exemples)

Page 3: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

3

POO vs PP/PI(I)

n  Objet =<ensemble des données avec les opérations associées>

n  PP : type abstrait=<données et traitements> n  PO : Objet =<données et traitements

encapsulés>

n  Exemple : modéliser une personne

Page 4: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

4

POO vs PP/PI(II)

n  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é »

Page 5: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

5

POO vs PP/PI(III)

n  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;

}

Page 6: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

6

POO vs PP/PI(IV)

n  Les inconvénients n  Séparation des données des traitements n  Contrôles difficiles : … Personne Ind;

SePresente(Ind); - le résultat??? n  Accès libre à toutes les composantes->possibilité

de modifier malencontreusement

Page 7: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

7

POO : encapsulation

n  Objet P rassemble dans une même entité – encapsule- les données et les comportements

n  Un objet contrôle ses comportements : P.SePresente() vs SePresente(P)

n  On envoie un « message » à objet pour déclencher un traitement P.SePresente()

n  L’objet vérifie que le message correspond à un des comportements qu’il encapsule

n  (vérification au moment de la compilation)

n  Comment déclarer un objet?

Page 8: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

8

Classe : un moule pour les objets

Personne

+ Nom

+ Societe

+ SePresente

Classe

Objets

P

R

Q

Instancier

Page 9: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

9

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; }

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

Page 10: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 10

Discipline de programmation

n  Une classe = n  (1) fichier .hpp n  (2) fichier .cpp n  Le pourquoi : n  (1)Séparation de la déclaration et

d’implémentation n  (2)Compilation séparée

Page 11: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 11

Directives de pré-compilateur

n  Lorsque on parle de compilation du programme on sous-entend traitement du code source par

n  -pré-compilateur n  -compilateur proprement dit du fichier –

résultant de la précompilation n  -fonctions du pré-compilateur : inclusion des

fichiers, définitions des constantes et des macro-commandes, inclusion conditionnelle, pilotage des messages d’erreur.

Page 12: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 12

DIRECTIVE « include »

n  Fichier MaClasse.cpp n  #include <iostream> n  #include “MaClasse.hpp ” n  #include “Util.h” n  using namespace std; // utilisation de l’espace de

nommage n  int main(){

n  MaClasse C; n  … n  return 0;

n  }

Page 13: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 13

Directive « define »

n  Directive « define » est utilisée pour la définition des constantes, des macro-fonctions,

n  Syntaxe : n  #define identificateur chaîne de substitution n  Ex : n  #define TailleMax 1000 n  classe Tableau{ n  int Tab[TailleMax]; n  int longueur_eff; n  };

Page 14: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 14

Definition des macro-fonctions

n  #define identificateur(paramètre,…) n  Exemple : n  #define ABS(x) x<0? x:-x

n  …. n  x=-2; n  ABS(x); n  cette affectation sera substituée par n  x<0?x:-x n  Veiller à la correspondance du nombre et du type

d’arguments: n  ABS(”ABC”) ó “ ABC ”<0? ”ABC ”:- ”ABC ”

Page 15: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 15

Inclusion conditionnelle(1)

n  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.

n  g++ -c MaClasse.cpp –compilation d’un fichier-source

n  Résultat : MaClasse.o –fichier-objet

Page 16: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 16

Inclusion conditionnelle(2)

n  Dans un fichier .hpp n  #ifndef MaClasse_H n  #define MaClasse_H n  class MaClasse{

….. }; #endif

Page 17: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 17

Branchement conditionnel

n  #ifdef identificateur n  Partie –alors

n  #else n  Partie-sinon

n  #endif n  Exemple : n  #ifdef VERBOSE n  cout<<“ Valeur a “ =<<a;

Page 18: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

18

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[ ]){ ….. } }

Page 19: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19

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

Page 20: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

20

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é

Page 21: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 21

Fonctions constantes(1)

n  On déclare les objets constants afin de ne pas pouvoir les changer (héritage du langage C)

n  class point { public :

n  double x; n  double y; n  void affiche(); }; const point c; c.affiche(); //erreur de compilation

Page 22: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 22

Fonctions constantes(2) ….. public :

n  Double x; n  Double y; n  void affiche(); //les deux fonctions sont identiques n  void affiche () const; // mais! n  }; …. 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

Page 23: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 23

Protection des membres

Personne

- Nom

- Societe

+ SePresente

+ Public

- Private

O Protected

Page 24: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

24

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; }

Page 25: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 25

Accessibilité

Nom_Cls

private

public

Fonctions usuelles

Classe

Page 26: POO - dept-info.labri.frdept-info.labri.fr/~benois-p/POO_MIAGE/Cours/POO_CH1.pdf · 14/01/19 2 Introduction n Pourquoi POO ? n Crise du logiciel n Robustesse, interchangeabilité

19/03/20 26

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.