{{tag>cours dev poo pharo fun-mooc}}
====== L' objet en POO ======
Tutoriel [[000_start|Programmation objet immersive en Pharo]] proposé par l'**inria** disponible à l'adresse https://mooc.pharo.org et sur la plateforme FUN-MOOC.
===== Transcription de la vidéo =====
Cours présenté par Stéphane Ducasse, directeur de recherche à l'Inria.
Dans ce cours, je vais vous montrer ce qu'est un objet. C'est une **entité** qui a un **état** et qui va **exécuter des méthodes en réaction à un message**.
L'objet est une petite entité qui va vivre dans le système informatique et qui a plusieurs propriétés.
* La première, c'est qu'elle a un état.
* La deuxième, un comportement.
* La troisième, une identité.
Et en plus, cette entité va collaborer avec d'autres pour traiter des tâches plus complexes.
Donc, prenons un exemple. Si j'ai un dé, l'état du dé, ce sera le nombre de ses faces. Son comportement, ce sera de tirer aléatoirement une face parmi ses faces. Et sa collaboration avec le reste, c'est qu'on va le mettre dans une poignée de dés quand on joue à des jeux.
De la même manière, si je prends un rectangle... Un rectangle, c'est une entité qui aura une largeur, une longueur, qui pourra offrir certains comportements comme calculer une aire ou déterminer une intersection "Est-ce que je croise d'autres rectangles ?" Typiquement, le système sur votre ordinateur qui fait le réaffichage des fenêtres interagit avec des rectangles pour calculer comment minimiser le réaffichage.
De la même manière, un contact. Imaginons que vous avez une liste de contacts. Un contact va avoir un état qui sera l'adresse, le numéro de téléphone de la personne que vous voulez contacter. Un contact va savoir comment s'afficher à l'écran et va interagir, par exemple, avec un contact manager qui, lui, pourra trier les contacts.
Si vous collectionnez des jeux, vous aurez une fiche de description d'un jeu qui va être un objet, qui sera le nom du jeu, sur quelle plateforme il tourne, quel est son âge, sa cote. Et en fait, ce jeu va interagir avec un gestionnaire de fiches pour votre collection, par exemple.
En gros, ce qu'on voit, c'est qu'**un objet**, c'est **un état**, **un comportement** et **une identité**. L'état caractérisera l'objet. **Le comportement, c'est ce qu'il fera en réponse à des messages**. **L'identité, c'est ce qui le distingue des autres**.
J'ai souvent parlé d'identité et d'égalité. Et ce sont des concepts, qui souvent peuvent être confondus. Je vais vous donner une astuce pour ne pas le faire. Si vous entrez dans une pizzeria pour commander une pizza et que vous voulez la même qu'un des clients, l'identité serait d'aller manger sa pizza. L'égalité, c'est de commander la même. C'est bien deux choses différentes.
**Un objet est une entité qui a des responsabilités**. Ça signifie qu'elle va offrir des services à d'autres objets et garantir qu'elle les fait.
Par exemple, une tortue va vous offrir comme service : "Je sais écrire une ligne, changer de direction." En fait, ces responsabilités sont représentées sous la forme de l'exécution d'un comportement.
**Un objet va aussi encapsuler des données**. On peut conceptuellement imaginer que les données sont à l'intérieur et que vous, en tant que client de l'objet, vous ne pouvez pas accéder aux données, qu'elles sont protégées par une barrière et que seules les méthodes de l'objet vont accéder à ces données. Vous, en tant que client, vous pourrez simplement envoyer des messages. Ces messages exécuteront des méthodes et les méthodes vont pouvoir accéder et modifier les données. Ça, c'est un point important qui est l'encapsulation des données qu'offre la programmation objet.
Je disais qu'un objet réagit à un message. Là, je vous montre que j'envoie le message "go" à une tortue. Que va-t-elle faire en réaction ? Elle va se déplacer à l'écran et laisser une trace au sol. Il faut voir que différents objets peuvent comprendre le même message. Par exemple, si je dis à une fenêtre de s'ouvrir, vous aurez une nouvelle fenêtre sur votre Bureau. Maintenant, si je demande à un fichier de s'ouvrir, vous verrez peut-être le contenu du fichier. Si c'est une archive Zip, vous allez vouloir dézipper votre archive et obtenir son contenu. Il est important de voir que j'ai envoyé le même message "open" à trois objets différents et que j'ai obtenu trois comportements différents. Pourtant, le message était le même.
Une méthode décrit un comportement. Je voulais vous montrer comment la méthode qui calcule la hauteur d'un rectangle fonctionne.
Rectangle >> height
"Answer the height of the receiver."
^corner y - origin y
Que fait-elle ? Elle fait la différence entre le point en haut et le point en bas du rectangle et nous dit : "C'est la distance." De la même façon, si je veux calculer l'aire du rectangle, je vais multiplier sa hauteur par sa largeur.
Rectangle >> area
^ self with * self height
Donc mes méthodes spécifient un comportement déterminé par une liste d'instructions. Donc, une méthode peut utiliser d'autres messages. Elle peut envoyer d'autres messages pour faire son traitement. Il faut voir que, sur l'exemple précédent, j'ai envoyé un message au rectangle.
Pour exécuter un traitement, on peut s'appuyer sur d'autres objets. C'est la notion de **délégation**. Ça signifie que pour faire une tâche, je peux demander à un autre objet de la faire à ma place ou une partie de cette tâche. Donc je délègue ce que je dois faire à d'autres objets.
Un exemple, quand on veut collectionner des items, on peut dire à chaque item qu'il sache se sauvegarder sur le disque. Ou alors on peut dire : "Je vais demander à un objet spécial qui sait sérialiser, c'est-à-dire mettre sur le disque, des objets compliqués et lui demander de me sérialiser." En tant qu'objet, je n'ai pas à tout savoir.
Vous devez savoir maintenant qu'un objet est caractérisé par un état, un comportement et une identité, que les objets répondent à des messages en exécutant des méthodes et qu'un objet peut déléguer des messages à d'autres objets pour réaliser des tâches.
[[000_start|⌂ Retour au sommaire]]