Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
Programmation orientée objet : Object, classe et encapsulation
1. PO3T Programmation orientée objet
Séance 1
Objet, classe
et encapsulation
Sébastien Combéfis, Quentin Lurkin mercredi 16 septembre 2015
2. Ce(tte) œuvre est mise à disposition selon les termes de la Licence Creative Commons
Attribution – Pas d’Utilisation Commerciale – Pas de Modification 4.0 International.
3. 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)
Évaluation
Examen (PO3T) : 100%
Enseignants
Sébastien Combéfis (s.combefis@ecam.be)
Quentin Lurkin (q.lurkin@ecam.be)
3
5. 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
7. 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 = []
2
3 words.append(’Hello ’) # Appel de la méthode append
4 words.append(’World!’) # de l’objet words (list)
5
6 print(’ ’.join(words))
Hello World!
7
8. Et en Java...
1 import java.util. ArrayList ;
2
3 public class Cours1
4 {
5 public static void main ( String [] args)
6 {
7 ArrayList <String > words = new ArrayList <String >();
8
9 words.add ("Hello"); // Appel de la méthode add
10 words.add ("World!"); // de l’objet words (ArrayList)
11
12 System.out.println (String.join (" ", words));
13 }
14 }
8
10. Et en C++...
1 # include <iostream >
2 # include <vector >
3
4 using namespace std;
5
6 int main (int argc , char *argv [])
7 {
8 vector <string > words;
9
10 words.push_back ("Hello");
11 words.push_back ("World!");
12
13 string s;
14 join(words , ’ ’, s);
15 cout << s << endl;
16
17 return 0;
18 }
10
11. Et en C#...
1 using System;
2 using System. Collections .Generic;
3
4 namespace Cours1
5 {
6 public class MainClass
7 {
8 public static void Main (string [] args)
9 {
10 List <string > words = new List <string >();
11
12 words.Add ("Hello"); // Appel de la méthode Add
13 words.Add ("World!"); // de l’objet words (List)
14
15 Console .WriteLine (String.Join (" ", words));
16 }
17 }
18 }
11
12. Manipuler les objets du monde
getFuelLevel
isOnGround
startEngine
startAutopilot
13. 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-Ericsson
Modèle : S500i
Couleur : Mysterious Green
Batterie : 80%
Luminosité : 60%
Marque : Sony-Ericsson
Modèle : S500i
Couleur : Spring Yellow
Batterie : 35%
Luminosité : 90%
13
14. 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);
2
3 Console .WriteLine ("Ancienne capacité : " + words.Capacity);
4 words.Capacity = 10;
5 Console .WriteLine ("Nouvelle capacité : " + words.Capacity);
Taille de la liste : 2
Ancienne capacité : 4
Nouvelle capacité : 10
14
15. 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);
4
5 Console .WriteLine ("Liste : " + String.Join(", ", words));
6 words.Clear ();
7 Console .WriteLine ("Liste : " + String.Join (", ", words));
True , False
Liste : Hello , World!
Liste :
15
16. 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 ());
8
9 System.gc();
10 System.out.println ( Runtime .getRuntime ().freeMemory ());
> java -Xmx2048m Cours1
83601240
78776072
82171712
16
17. Destruction
Destruction explicite d’un objet
Libération de la mémoire et des ressources allouées
1 class Bullshit
2 {
3 public:
4 ~Bullshit ();
5 };
6
7 Bullshit ::~ Bullshit ()
8 {
9 cout << "Damn , I’ve been destroyed!";
10 }
11
12 int main (int argc , char *argv [])
13 {
14 Bullshit *b = new Bullshit ();
15 delete b;
16
17 return 0;
18 }
17
19. 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
20. 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
GSM
Sony Ericsson
w200i
Orange-Blanc
GSM
Marque
Modèle
Couleur
envoyerSMS
recevoirAppel
voirNiveauBatterie
20
21. 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
GSM
Sony Ericsson
w200i
Orange-Blanc
GSM
Marque
Modèle
Couleur
envoyerSMS
recevoirAppel
voirNiveauBatterie
21
22. 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 = firstname
4 self.lastname = lastname
5 self.phonenumber = 0
6
7 def setPhoneNumber (self , number):
8 self.phonenumber = number
9
10 def __str__(self):
11 return ’{} {} ({}) ’.format(self.firstname , self.lastname ,
self.phonenumber )
12
13 marchand = Contact(’Cédric ’, ’Marchand ’)
14 print(marchand) # Cédric Marchand (0)
15
16 marchand. setPhoneNumber (8172)
17 print(marchand) # Cédric Marchand (8172)
22
23. 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 = firstname
3 self.lastname = lastname
4 self.phonenumber = 0
5
6 # [...]
7
8 marchand = Contact(’Cédric ’, ’Marchand ’)
9 print(marchand)
23
24. En C#...
1 class Contact
2 {
3 private string firstname , lastname;
4 private int phonenumber;
5
6 public Contact (string firstname , string lastname)
7 {
8 this.firstname = firstname;
9 this.lastname = lastname;
10 this. phonenumber = 0;
11 }
12
13 // [...]
14 }
15
16 public class MainClass
17 {
18 public static void Main ( string [] args)
19 {
20 Contact marchand = new Contact ("Cédric", "Marchand");
21 Console .WriteLine (marchand);
22
23 // [...]
24 }
25 }
24
25. 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 Contact
2 {
3 private String firstname , lastname;
4 private int phonenumber;
5
6 // [...]
7 }
25
26. Instanciation
On peut créer plusieurs instances d’une classe
Chaque instance a son identité propre
marchand
Contact
Contact
Cédric
Marchand
8172
Contact
firstname
lastname
phonenumber
setPhoneNumber
toString
flemal
Contact
Contact
Clémence
Flemal
0
marchand = Contact(’Cédric’, ’Marchand’)
marchand.setPhoneNumber(8172)
print(marchand)
flemal = Contact(’Clémence’, ’Flemal’)
26
27. 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 = number
3
4 # [...]
5
6 marchand. setPhoneNumber (8172)
7 print(marchand)
27
28. En C#...
1 class Contact
2 {
3 // [...]
4
5 public void setPhoneNumber (int number)
6 {
7 phonenumber = number;
8 }
9
10 // [...]
11 }
12
13 public class MainClass
14 {
15 public static void Main ( string [] args)
16 {
17 // [...]
18
19 marchand. setPhoneNumber (8172);
20 Console .WriteLine (marchand);
21 }
22 }
28
29. 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 }
5
6 // [...]
7
8 marchand. setPhoneNumber (8172); // this fera référence
9 Console .WriteLine (marchand); // à marchand
29
30. 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 # [...]
2
3 def getPhoneNumber (self):
4 return self.phonenumber
5
6 def setPhoneNumber (self , number):
7 self.phonenumber = number
8
9 # [...]
10
11 marchand. setPhoneNumber (8172)
12 print(marchand. getPhoneNumber ())
30
31. 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 // [...]
2
3 public int PhoneNumber
4 {
5 get { return phonenumber; }
6 set { phonenumber = value; }
7 }
8
9 // [...]
10
11 marchand. PhoneNumber = 999;
12 Console .WriteLine (marchand. PhoneNumber);
31
32. Type abstrait de donnée
Abstract Data Type
ADT
Cacher les détails
d’implémentation
Rendre les changements
indépendants du reste
du programme
Le programme est
auto-documenté
Le programme manipule
des entités qui modélisent
le monde réel
32
33. 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 Time
2 {
3 public int hour , minute;
4
5 public Time (int hour , int minute)
6 {
7 this.hour = hour;
8 this.minute = minute;
9 }
10 }
33
34. 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);
5
6 System.out.println ((t1.hour == t2.hour && t1.minute < t2.
minute) || t1.hour < t2.hour);
7 System.out.println (t1.isBefore (t2));
8 }
34
35. Encapsulation II
Les variables d’instance doivent être privées
L’accès est contrôlé par des méthodes publiques
1 public class Time
2 {
3 private int hour , minute;
4
5 // [...]
6
7 public boolean isBefore (Time t)
8 {
9 return this.hour < t.hour || (this.hour == t.hour && this.
minute < t.minute);
10 }
11 }
12
13 // [...]
14
15 System.out.println (t1.isBefore (t2));
35
36. Encapsulation III
Le code utilisateur est indépendant de l’implémentation
1 class Time
2 {
3 private int minutes;
4
5 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 }
15
16 // [...]
17
18 System.out.println (t1.isBefore (t2));
36
37. 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
38. 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 Time
2 {
3 private final int hour , minute;
4
5 public Time (int hour , int minute)
6 {
7 this.hour = hour;
8 this.minute = minute;
9 }
10 }
38
39. 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}
3
4 print(id(A), id(B))
4338390408 4338390184
39
40. Crédits
Photos des livres depuis Amazon
https://www.flickr.com/photos/madalena_pestana/2828893154
https://www.flickr.com/photos/jetstarairways/6769120131
https://www.flickr.com/photos/booleansplit/3510951967
40