View
447
Download
3
Category
Preview:
Citation preview
PO3T Programmation orientée objet
Séance 1
Objet, classeet encapsulation
Sébastien Combéfis, Quentin Lurkin mercredi 16 septembre 2015
Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative CommonsAttribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
Informations générales
PO3T Programmation orientée objet
13 cours de 1h30 (19,5 heures)
Documents utilisés sont sur Eole (slides et énoncés des labos)
ÉvaluationExamen (PO3T) : 100%
EnseignantsSébastien Combéfis (s.combefis@ecam.be)Quentin Lurkin (q.lurkin@ecam.be)
3
Livre de référence
Beginning C# Object-OrientedProgrammingpar Dan Clark
ISBN 978-1-430-24935-1
4
Objectifs
Création et utilisation d’objets
État
Appel de méthode
Ramasse-miettes
Définition de classes
Variable d’instance, visibilité
Constructeur
Définition de méthode
Encapsulation
5
Objet
Vie d’un objet
Vie d’un objet
Création de l’objet (initialisation)
Appel de méthode, changement d’état (utilisation)
Destruction de l’objet (finalisation)
1 words = []23 words . append (’Hello ’) # Appel de la méthode append4 words . append (’World !’) # de l’objet words (list)56 print (’ ’.join( words ))
Hello World !
7
Et en Java...
1 import java.util. ArrayList ;23 public class Cours14 {5 public static void main ( String [] args)6 {7 ArrayList <String > words = new ArrayList <String >();89 words .add (" Hello "); // Appel de la méthode add
10 words .add (" World !"); // de l’ objet words ( ArrayList )1112 System .out. println ( String .join (" ", words ));13 }14 }
8
Et en PHP...
1 <?php2 $words = new ArrayObject ();34 $words -> append (" Hello ");5 $words -> append (" World !");67 echo join (’ ’, $words -> getArrayCopy ());8 ?>
9
Et en C++...
1 # include <iostream >2 # include <vector >34 using namespace std;56 int main (int argc , char *argv [])7 {8 vector <string > words ;9
10 words . push_back (" Hello ");11 words . push_back (" World !");1213 string s;14 join(words , ’ ’, s);15 cout << s << endl;1617 return 0;18 }
10
Et en C#...
1 using System ;2 using System . Collections . Generic ;34 namespace Cours15 {6 public class MainClass7 {8 public static void Main ( string [] args)9 {
10 List <string > words = new List <string >();1112 words .Add (" Hello "); // Appel de la méthode Add13 words .Add (" World !"); // de l’ objet words (List)1415 Console . WriteLine ( String .Join (" ", words ));16 }17 }18 }
11
Manipuler les objets du monde
getFuelLevel
isOnGroundstartEngine
startAutopilot
Objet
Un objet possède
des attributs (caractéristiques)
des méthodes (fonctionnalités)
L’état de l’objet peut varier tout au long de l’exécution
Défini par l’ensemble des valeurs des attributs
Marque : Sony-EricssonModèle : S500iCouleur : Mysterious GreenBatterie : 80%Luminosité : 60%
Marque : Sony-EricssonModèle : S500iCouleur : Spring YellowBatterie : 35%Luminosité : 90%
13
Attribut
Un attribut possède une valeur
Cette valeur fait partie de l’état de l’objet
Les attributs sont accessibles en lecture et/ou en écriture
1 Console . WriteLine (" Taille de la liste : " + words . Count );23 Console . WriteLine (" Ancienne capacité : " + words . Capacity );4 words . Capacity = 10;5 Console . WriteLine (" Nouvelle capacité : " + words . Capacity );
Taille de la liste : 2Ancienne capacité : 4Nouvelle capacité : 10
14
Fonctionnalité
Une fonctionnalité est appliquée sur un objet cible
Elle agit sur l’état de l’objet, en le lisant et/ou le modifiant
1 bool contains = words . Contains (" Hello ");2 bool allShorts = words . TrueForAll (s => s. Length <= 5);3 Console . WriteLine ( contains + ", " + allShorts );45 Console . WriteLine (" Liste : " + String .Join(", ", words ));6 words . Clear ();7 Console . WriteLine (" Liste : " + String .Join (", ", words ));
True , FalseListe : Hello , World !Liste :
15
Ramasse-miettes
Langages avec machine virtuelle ont un ramasse-miette
Suppression automatique et régulière des objets non référencés
1 System .out. println ( Runtime . getRuntime (). freeMemory ());2 StringBuilder builder = new StringBuilder ("a");3 for (int i = 0; i < 20; i++)4 {5 builder . append ( builder );6 }7 System .out. println ( Runtime . getRuntime (). freeMemory ());89 System .gc ();
10 System .out. println ( Runtime . getRuntime (). freeMemory ());
> java -Xmx2048m Cours1836012407877607282171712
16
Destruction
Destruction explicite d’un objet
Libération de la mémoire et des ressources allouées
1 class Bullshit2 {3 public :4 ~ Bullshit ();5 };67 Bullshit ::~ Bullshit ()8 {9 cout << "Damn , I’ve been destroyed !";
10 }1112 int main (int argc , char *argv [])13 {14 Bullshit *b = new Bullshit ();15 delete b;1617 return 0;18 }
17
Classe
Classe
Une classe est un modèle avec lequel on construit des objets
Il s’agit d’un modèle qui reprend les attributs et fonctionnalités
Un objet est une instance d’une classe
On crée un nouvel objet à partir d’une classe
19
Instance
Trois éléments distincts
Une classe est un modèle
Un objet est une instance d’une classe
Une variable (de type objet) stocke une référence vers l’objet
g
GSM
GSMSony Ericssonw200iOrange-Blanc
GSMMarqueModèleCouleurenvoyerSMSrecevoirAppelvoirNiveauBatterie
20
Alias
Une variable est une référence vers un objet
La variable permet d’accéder à l’objet
Un alias réfère le même objet qu’une autre variable
g
GSM
h
GSM
GSMSony Ericssonw200iOrange-Blanc
GSMMarqueModèleCouleurenvoyerSMSrecevoirAppelvoirNiveauBatterie
21
Définir une classe
Définition d’une classe Contact représentant un contact
Défini par un prénom, un nom et un numéro de téléphone
1 class Contact :2 def __init__ (self , firstname , lastname ):3 self. firstname = firstname4 self. lastname = lastname5 self. phonenumber = 067 def setPhoneNumber (self , number ):8 self. phonenumber = number9
10 def __str__ (self):11 return ’{} {} ({}) ’. format (self.firstname , self.lastname ,
self. phonenumber )1213 marchand = Contact (’Cédric ’, ’Marchand ’)14 print ( marchand ) # Cédric Marchand (0)1516 marchand . setPhoneNumber (8172)17 print ( marchand ) # Cédric Marchand (8172)
22
Constructeur et variable d’instance
Le constructeur initialise l’état de l’objet
On fait appel au constructeur au moment de l’instantiation
Initialisation des variables d’instance
On affecte une valeur à chaque variable d’instance
1 def __init__ (self , firstname , lastname ):2 self. firstname = firstname3 self. lastname = lastname4 self. phonenumber = 056 # [...]78 marchand = Contact (’Cédric ’, ’Marchand ’)9 print ( marchand )
23
En C#...
1 class Contact2 {3 private string firstname , lastname ;4 private int phonenumber ;56 public Contact ( string firstname , string lastname )7 {8 this . firstname = firstname ;9 this . lastname = lastname ;
10 this . phonenumber = 0;11 }1213 // [...]14 }1516 public class MainClass17 {18 public static void Main ( string [] args)19 {20 Contact marchand = new Contact (" Cédric ", " Marchand ");21 Console . WriteLine ( marchand );2223 // [...]24 }25 }
24
Variable d’instance
Une variable d’instance est liée à l’objet
Sa valeur fait partie de l’état de l’objet
Peuvent avoir une certaine visibilité
Uniquement accessible dans la classe ou visible de l’extérieur
1 public class Contact2 {3 private String firstname , lastname ;4 private int phonenumber ;56 // [...]7 }
25
Instanciation
On peut créer plusieurs instances d’une classe
Chaque instance a son identité propre
marchand
Contact
ContactCédricMarchand8172
ContactfirstnamelastnamephonenumbersetPhoneNumbertoString
flemal
Contact
ContactClémenceFlemal0
marchand = Contact(’Cédric’, ’Marchand’)marchand.setPhoneNumber(8172)print(marchand)
flemal = Contact(’Clémence’, ’Flemal’)
26
Méthode
Une méthode (d’instance) représente une fonctionnalité
Elle agit sur une instance spécifique, l’objet cible
Peuvent avoir une certaine visibilité
Uniquement accessible dans la classe ou visible de l’extérieur
1 def setPhoneNumber (self , number ):2 self. phonenumber = number34 # [...]56 marchand . setPhoneNumber (8172)7 print ( marchand )
27
En C#...
1 class Contact2 {3 // [...]45 public void setPhoneNumber (int number )6 {7 phonenumber = number ;8 }9
10 // [...]11 }1213 public class MainClass14 {15 public static void Main ( string [] args)16 {17 // [...]1819 marchand . setPhoneNumber (8172) ;20 Console . WriteLine ( marchand );21 }22 }
28
Appel de méthode
Une méthode (d’instance) est appelée sur un objet cible
La méthode aura accès aux variables d’instances de cet objet
Mot réservé spécifique pour accéder à l’objet cible
Référence vers l’objet cible (this, self... )
1 public void setPhoneNumber (int number )2 {3 this . phonenumber = number ;4 }56 // [...]78 marchand . setPhoneNumber (8172) ; // this fera référence9 Console . WriteLine ( marchand ); // à marchand
29
Accesseur
Un getter permet de lire une variable d’instance
Ou de manière générale, d’obtenir une information sur l’état
Un setter permet de modifier une variable d’instance
1 # [...]23 def getPhoneNumber (self):4 return self. phonenumber56 def setPhoneNumber (self , number ):7 self. phonenumber = number89 # [...]
1011 marchand . setPhoneNumber (8172)12 print ( marchand . getPhoneNumber ())
30
Propriété C#
Une propriété permet de créer des accesseurs
Est vu de l’extérieur comme une variable d’instance publique
1 // [...]23 public int PhoneNumber4 {5 get { return phonenumber ; }6 set { phonenumber = value ; }7 }89 // [...]
1011 marchand . PhoneNumber = 999;12 Console . WriteLine ( marchand . PhoneNumber );
31
Type abstrait de donnée
Abstract Data Type
ADT
Cacher les détailsd’implémentation
Rendre les changementsindépendants du restedu programme
Le programme estauto-documenté
Le programme manipuledes entités qui modélisentle monde réel
32
Encapsulation I
Détails d’implémentation cachés du monde extérieur
Déclarer les variables d’instances comme privées
Accès contrôlés par les méthodes (d’instance) publiques
Permet un contrôle en lecture/écriture
1 public class Time2 {3 public int hour , minute ;45 public Time (int hour , int minute )6 {7 this .hour = hour;8 this . minute = minute ;9 }
10 }
33
Accès direct
Le code utilisateur dépend de l’implémentation
Couplage fort entre des codes différents
Le code utilisateur ne fonctionnera plus en cas de changements
1 public static void main ( String [] args)2 {3 Time t1 = new Time (8, 30);4 Time t2 = new Time (12 , 15);56 System .out. println (( t1.hour == t2.hour && t1. minute < t2.
minute ) || t1.hour < t2.hour);7 System .out. println (t1. isBefore (t2));8 }
34
Encapsulation II
Les variables d’instance doivent être privées
L’accès est contrôlé par des méthodes publiques
1 public class Time2 {3 private int hour , minute ;45 // [...]67 public boolean isBefore (Time t)8 {9 return this .hour < t.hour || ( this .hour == t.hour && this .
minute < t. minute );10 }11 }1213 // [...]1415 System .out. println (t1. isBefore (t2));
35
Encapsulation III
Le code utilisateur est indépendant de l’implémentation
1 class Time2 {3 private int minutes ;45 public Time (int hour , int minute )6 {7 this . minutes = 60 * hour + minute ;8 }9
10 public boolean isBefore (Time t)11 {12 return this . minutes < t. minutes ;13 }14 }1516 // [...]1718 System .out. println (t1. isBefore (t2));
36
Type de donnée
Une classe définit un nouveau type de donnée
Représentation plus directe d’objets du monde réel
Exposition d’une interface publique au monde extérieur
Variables d’instances et méthodes publiques
Des liens sont possibles entre différentes classes
37
Immuabilité
Un objet immuable garde le même état
Une fois initialisé, son état ne peut plus changer
Propriété très importantes dans plusieurs situations
Utilisation comme élément de certaines collections
Utilisation safe entre plusieurs threads
1 public class Time2 {3 private final int hour , minute ;45 public Time (int hour , int minute )6 {7 this .hour = hour;8 this . minute = minute ;9 }
10 }
38
Code de hachage
Identifier de manière unique un objet
Deux objets avec le même état sont considérés identiques
Code de hachage unique pour chaque objet (hashcode)
Par exemple un entier sur 32 bits en Java
1 A = {1, 2, 3}2 B = {3} | {1, 2}34 print (id(A), id(B))
4338390408 4338390184
39
Crédits
Photos des livres depuis Amazonhttps://www.flickr.com/photos/madalena_pestana/2828893154https://www.flickr.com/photos/jetstarairways/6769120131https://www.flickr.com/photos/booleansplit/3510951967
40
Recommended