Outils pour utilisateurs

Outils du site


cours:informatique:dev:programmation_objet_pharo:115_modele_objet_de_pharo

Le modèle objet de Pharo

Tutoriel 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

Présentation par Luc Fabresse, Professeur de l'institut Mines-Telecom de Doué.

Alors, dans cette séquence, on va voir le modèle-objet de Pharo. Donc, on va faire un survol de tout le modèle-objet pour essayer de vous en montrer l'élégance et la simplicité. Donc l'objectif, c'est vraiment de ne pas tout comprendre cette fois-ci, puisqu'on reviendra sur la plupart de ces notions dans les séquences qui vont suivre et les prochaines semaines.

Seulement des objets et des messages

En Pharo, il n'y a que des objets et des messages. Donc, il va y avoir beaucoup d'objets. Des objets pour représenter le curseur de la souris, les booléens, les tableaux, les nombres, les chaînes de caractères, les fenêtres, les scrollbars, ce que vous voulez, voire même le compilateur, les objets du système, que ce soit les sockets, les polices de caractères, les collections, etc.

Tout ça, ça sera des objets et ces objets-là, on va pouvoir leur envoyer des messages. On va leur envoyer différents types de messages. Il y en aura plein. Par exemple à une collection, je pourrai lui envoyer message le message size pour obtenir sa taille, le message +, le message ot:put, le message do etc.

On a donc des objets et des messages. Les messages dénotent l'intention du programmeur, quand j'envoie un message à un objet, je lui demande de réaliser un traitement. C'est vraiment une demande à l'objet qu'on fait.

Et l'objet va décider de la méthode à exécuter pour réaliser ces traitements. La méthode, c'est le comment. Comment réaliser l'intention du programmeur en décidant quelle méthode à exécuter.

Ensuite, on a un autre concept qui est le concept de closures, ce sont des fermetures lexicales, ce sont des blocks, des sortes de méthodes anonymes en Pharo. On appelle ça des blocks en Pharo, c'est un vocabulaire important. Les blocks sont délimités par des crochets [ ].

4 timesRepeat: [ Transcript show: 'Hello World!' ]

Dans l'exemple ci-dessus: crochet ouvrant, crochet fermant. Donc tout ça, c'est un block, on le verra, il faut considérer ça comme une méthode anonyme.

En Pharo, on a un modèle qui est très simple et très uniforme. Tout est objet, tout est instance d'une classe.

  • Les classes et les messages sont des objets eux-mêmes;
  • Tous les calculs se passent par envoi de messages à des objets. On parle vraiment d'envoi de messages, c'est le terme consacré, et pas d'exécution de méthodes, puisque quand on envoie un message à un objet, il y a un algorithme particulier qu'on appelle le method lookup, c'est un algorithme qui va sélectionner la bonne méthode à exécuter.
  • les méthodes sont virtuellement liées: elles acceptent la liaison tardive. Donc, j'envoie un message à un objet et il y a le method lookup qui va sélectionner la bonne méthode à exécuter. Donc, on reviendra là-dessus dans une séquence particulière.

Le modèle objet

Le modèle objet de Pharo est le suivant:

  • Les variables d'instance sont protégées. Donc, tous les objets ont des variables d'instance et elles sont protégées, c'est-à-dire qu'elles ne sont accessibles que par l'objet lui-même, ou alors depuis les sous-classes de cet objet.
  • Les méthodes sont publiques et virtuellement liées. Donc, toutes les méthodes sont publiques. Il n'y a pas de mot-clé public en Pharo.
  • Pharo accepte l'héritage simple entre classes. Donc, une classe ne peut avoir qu'une seule super-classe.

voici un exemple de code qui est le produit en croix de deux points:

(point1 x * point2 y) - (point1 y * point2 x)

donc on a un point 1 et un point 2, donc je vais multiplier le champ X du point 1 par le choix Y du point 2 et le soustraire à la multiplication du champ Y du point 1 et le champ X du point 2. Donc, c'est un exemple de calcul qu'on peut réaliser en Pharo.

Création d'objet

Pour créer des objets en fait, on va avoir des messages particuliers.

10@20

Dans l'exemple ici, si j'envoie le message @ à l'entier 10 et que je passe en paramètre l'entier 20, ça va me créer un point, donc une instance de la classe Point. Donc ici, le nom du message, c'est bien @, le receveur du message, l'entier qui a reçu le message, c'est l'entier 10, c'était celui qui était avant le nom du message, et puis l'argument, c'était 20, celui qui était après le nom du message.

Un autre exemple:

'Pharo', 'is Cool'

Ici, je vais créer une chaîne de caractères, on voit le résultat ici c'est une chaîne de caractères. Et comment cette chaîne de caractères a été obtenue ? On a utilisé une première chaîne de caractères, ici,'Pharo'. On lui a envoyé le message, virgule. En paramètre de ce message, on avait la chaîne de caractères'is Cool'd'accord qui est ici. Et la sémantique du message virgule, c'est la concaténation de chaînes, donc les deux chaînes ont été collées pour en produire une seule concaténée.

On peut créer des objets en instanciant une classe directement grâce au message new par exemple. Si j'ai une classe Monster, j'envoie le message new, j'obtiens bien une instance de la classe monster donc un objet monstre.

Monster new

Je peux créer une instance de la classe tableau, Array, en spécifiant l'objet new et en passant un paramètre. Pour passer un paramètre, c'est deux points, et puis je passe l'entier 6 et j'obtiens bien un tableau de taille 6.

Array new:6

On peut avoir des types de message particulier pour créer des objets et je peux définir mes propres messages sur mes classes typiquement, je peux créer une classe Tamagotchi avec une méthode withHunger. Cette méthode-là, je vais lui passer l'entier 10, ça permet de créer une instance de la classe Tamagotchi en les passant un paramètres. C'est vraiment des messages pour spécialiser pour la création d'objets.

Less is more

Ce qu'on a vu dans cette séquence, c'était un survol du modèle objet de Pharo. L'objectif, ce n'était pas de tout comprendre. On reviendra sur ces notions dans les prochaines séquences. Mais ce qu'il est important de retenir, c'est que:

  • Il n'y a pas de constructeur en Pharo;
  • Il n'y a pas de méthode statique.
  • Il n'y a pas de déclaration type.
  • Il n'y a pas d'interface.
  • Il n'y a pas de package, private, protected (tous les modifieurs de portée classiques que l'on rencontre dans les langages objet).
  • Il n'y a pas de type paramétré, il n'y a pas de boxing, unboxing et vous verrez que c'est pourtant un langage extrêmement puissant.

Pour résumer

  • En Pharo, tout est objet.
  • Tous les calculs se passent par envoi de messages à des objets;
  • Les méthodes acceptent la liaison tardive, c'est-à-dire qu'il y a un algorithme qu'on appelle le method lookup qui va sélectionner la bonne méthode à exécuter quand un objet reçoit un message.
  • Il y a la notion de blocks qui sont des méthodes anonymes. On verra que c'est extrêmement important en Pharo;
  • On peut envoyer des messages particuliers à des classes pour créer des objets.
cours/informatique/dev/programmation_objet_pharo/115_modele_objet_de_pharo.txt · Dernière modification : 2022/06/29 19:34 de yoann