40
PO3T Programmation orientée objet Séance 1 Objet, classe et encapsulation Sébastien Combéfis, Quentin Lurkin mercredi 16 septembre 2015

Programmation orientée objet : Object, classe et encapsulation

Embed Size (px)

Citation preview

Page 1: Programmation orientée objet : Object, classe et encapsulation

PO3T Programmation orientée objet

Séance 1

Objet, classeet encapsulation

Sébastien Combéfis, Quentin Lurkin mercredi 16 septembre 2015

Page 2: Programmation orientée objet : Object, classe et encapsulation

Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative CommonsAttribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.

Page 3: Programmation orientée objet : Object, classe et encapsulation

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 ([email protected])Quentin Lurkin ([email protected])

3

Page 4: Programmation orientée objet : Object, classe et encapsulation

Livre de référence

Beginning C# Object-OrientedProgrammingpar Dan Clark

ISBN 978-1-430-24935-1

4

Page 5: Programmation orientée objet : Object, classe et encapsulation

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

Page 6: Programmation orientée objet : Object, classe et encapsulation

Objet

Page 7: Programmation orientée objet : Object, classe et encapsulation

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

Page 8: Programmation orientée objet : Object, classe et encapsulation

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

Page 9: Programmation orientée objet : Object, classe et encapsulation

Et en PHP...

1 <?php2 $words = new ArrayObject ();34 $words -> append (" Hello ");5 $words -> append (" World !");67 echo join (’ ’, $words -> getArrayCopy ());8 ?>

9

Page 10: Programmation orientée objet : Object, classe et encapsulation

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

Page 11: Programmation orientée objet : Object, classe et encapsulation

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

Page 12: Programmation orientée objet : Object, classe et encapsulation

Manipuler les objets du monde

getFuelLevel

isOnGroundstartEngine

startAutopilot

Page 13: Programmation orientée objet : Object, classe et encapsulation

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

Page 14: Programmation orientée objet : Object, classe et encapsulation

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

Page 15: Programmation orientée objet : Object, classe et encapsulation

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

Page 16: Programmation orientée objet : Object, classe et encapsulation

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

Page 17: Programmation orientée objet : Object, classe et encapsulation

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

Page 18: Programmation orientée objet : Object, classe et encapsulation

Classe

Page 19: Programmation orientée objet : Object, classe et encapsulation

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

Page 20: Programmation orientée objet : Object, classe et encapsulation

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

Page 21: Programmation orientée objet : Object, classe et encapsulation

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

Page 22: Programmation orientée objet : Object, classe et encapsulation

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

Page 23: Programmation orientée objet : Object, classe et encapsulation

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

Page 24: Programmation orientée objet : Object, classe et encapsulation

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

Page 25: Programmation orientée objet : Object, classe et encapsulation

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

Page 26: Programmation orientée objet : Object, classe et encapsulation

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

Page 27: Programmation orientée objet : Object, classe et encapsulation

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

Page 28: Programmation orientée objet : Object, classe et encapsulation

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

Page 29: Programmation orientée objet : Object, classe et encapsulation

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

Page 30: Programmation orientée objet : Object, classe et encapsulation

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

Page 31: Programmation orientée objet : Object, classe et encapsulation

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

Page 32: Programmation orientée objet : Object, classe et encapsulation

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

Page 33: Programmation orientée objet : Object, classe et encapsulation

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

Page 34: Programmation orientée objet : Object, classe et encapsulation

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

Page 35: Programmation orientée objet : Object, classe et encapsulation

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

Page 36: Programmation orientée objet : Object, classe et encapsulation

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

Page 37: Programmation orientée objet : Object, classe et encapsulation

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

Page 38: Programmation orientée objet : Object, classe et encapsulation

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

Page 39: Programmation orientée objet : Object, classe et encapsulation

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

Page 40: Programmation orientée objet : Object, classe et encapsulation

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