Programmation orientée objet : Object, classe et encapsulation

449 vues

Publié le

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

Publié dans : Sciences
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
449
Sur SlideShare
0
Issues des intégrations
0
Intégrations
8
Actions
Partages
0
Téléchargements
26
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Programmation orientée objet : Object, classe et encapsulation

  1. 1. PO3T Programmation orientée objet Séance 1 Objet, classe et encapsulation Sébastien Combéfis, Quentin Lurkin mercredi 16 septembre 2015
  2. 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. 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
  4. 4. Livre de référence Beginning C# Object-Oriented Programming par Dan Clark ISBN 978-1-430-24935-1 4
  5. 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
  6. 6. Objet
  7. 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. 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
  9. 9. Et en PHP... 1 <?php 2 $words = new ArrayObject (); 3 4 $words ->append ("Hello"); 5 $words ->append ("World!"); 6 7 echo join (’ ’, $words -> getArrayCopy ()); 8 ?> 9
  10. 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. 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. 12. Manipuler les objets du monde getFuelLevel isOnGround startEngine startAutopilot
  13. 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. 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. 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. 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. 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
  18. 18. Classe
  19. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×