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

Documents pareils