1 00:00:00,300 --> 00:00:03,040 Alors, dans cette séquence, on va voir le modèle-objet de Pharo. 2 00:00:03,240 --> 00:00:05,540 Donc, on va faire un survol de tout le modèle-objet pour 3 00:00:05,740 --> 00:00:08,450 essayer de vous en montrer l'élégance et la simplicité. 4 00:00:08,870 --> 00:00:11,000 Donc l'objectif, c'est vraiment de ne pas tout comprendre 5 00:00:11,200 --> 00:00:12,840 cette fois-ci, puisqu'on reviendra sur la plupart de ces 6 00:00:13,040 --> 00:00:15,880 notions dans les séquences qui vont suivre et les prochaines semaines. 7 00:00:17,190 --> 00:00:20,400 Donc, en Pharo, il n'y a que des objets et des messages. 8 00:00:20,610 --> 00:00:22,000 Donc, il va y avoir beaucoup d'objets. 9 00:00:22,170 --> 00:00:24,940 Des objets pour représenter le curseur de la souris, les 10 00:00:25,140 --> 00:00:28,210 booléens, les tableaux, les nombres, les chaînes de 11 00:00:28,410 --> 00:00:31,060 caractères, les fenêtres, les scrollbars, ce que vous 12 00:00:31,260 --> 00:00:34,430 voulez, voire même le compilateur, les objets du système, 13 00:00:35,370 --> 00:00:38,190 que ce soit les sockets, les polices de caractères, les collections, etc. 14 00:00:38,590 --> 00:00:41,340 Tout ça, ça sera des objets et ces objets-là, on va 15 00:00:41,540 --> 00:00:43,570 pouvoir leur envoyer des messages. On va leur envoyer 16 00:00:43,770 --> 00:00:45,570 différents types de messages. Il y en aura plein. 17 00:00:45,770 --> 00:00:47,380 Par exemple à une collection, je pourrai lui envoyer 18 00:00:47,580 --> 00:00:49,630 message le message size pour obtenir sa taille, le 19 00:00:49,830 --> 00:00:51,500 message +, le message ot:put, le message do. 20 00:00:51,700 --> 00:00:54,420 Donc, des objets et des messages. 21 00:00:55,850 --> 00:00:59,140 Donc, les messages dénotent l'intention du programmeur, 22 00:00:59,340 --> 00:01:01,320 quand j'envoie un message à un objet, je lui demande de 23 00:01:01,520 --> 00:01:05,360 réaliser un traitement. Donc, c'est vraiment une demande 24 00:01:05,560 --> 00:01:08,670 à l'objet qu'on fait. Et l'objet va décider de la méthode 25 00:01:08,870 --> 00:01:10,510 à exécuter pour réaliser ces traitements. 26 00:01:10,710 --> 00:01:11,470 Donc, c'est le comment. 27 00:01:11,670 --> 00:01:15,310 Comment réaliser l'intention du programmeur en décidant 28 00:01:15,530 --> 00:01:20,470 quelle méthode à exécuter. Donc ensuite, on a un autre 29 00:01:20,670 --> 00:01:23,200 concept qui est le concept de closure, donc c'est les 30 00:01:23,400 --> 00:01:26,650 fermetures lexicales, ce sont des blocks, des sortes de 31 00:01:27,000 --> 00:01:28,830 méthodes anonymes en Pharo. 32 00:01:29,530 --> 00:01:30,870 On appelle ça des blocks en Pharo. 33 00:01:31,070 --> 00:01:33,640 C'est le vocabulaire important. 34 00:01:33,840 --> 00:01:35,360 Donc, les blocks sont délimités par des crochets. 35 00:01:35,560 --> 00:01:37,910 Par exemple, ici, vous avez un exemple: crochet ouvrant, crochet fermant. 36 00:01:38,220 --> 00:01:40,150 Donc tout ça, c'est un block, d'accord? 37 00:01:40,590 --> 00:01:44,210 Donc on verra, il faut considérer ça comme une méthode anonyme. 38 00:01:46,280 --> 00:01:50,080 Donc, en Pharo, on a un modèle qui est très simple et très uniforme. 39 00:01:50,700 --> 00:01:52,900 Tout est objet, tout est instance d'une classe. 40 00:01:53,580 --> 00:01:55,790 Même les classes et les messages sont des objets 41 00:01:56,000 --> 00:01:59,500 eux-mêmes, et tous les calculs se passent par envoi de 42 00:01:59,700 --> 00:02:04,230 messages à des objets. Donc, on parle vraiment d'envoi de messages. 43 00:02:04,680 --> 00:02:07,890 Donc, c'est le terme consacré, et pas d'exécution de 44 00:02:08,090 --> 00:02:10,820 méthodes, puisque quand on envoie un message à un objet, 45 00:02:11,730 --> 00:02:15,600 il y a un algorithme particulier qu'on appelle le method lookup. 46 00:02:15,800 --> 00:02:19,490 Donc, c'est un algorithme qui va sélectionner la bonne méthode à exécuter. 47 00:02:20,040 --> 00:02:23,660 Donc, les méthodes; en fait, elles sont virtuellement 48 00:02:23,860 --> 00:02:27,890 liées, elles acceptent la liaison tardive. 49 00:02:28,630 --> 00:02:30,930 Donc, j'envoie un message à un objet. 50 00:02:31,460 --> 00:02:34,800 Et il y a le method lookup qui va sélectionner la bonne méthode à exécuter. 51 00:02:35,000 --> 00:02:37,730 Donc, on reviendra là-dessus dans une séquence particulière. 52 00:02:40,250 --> 00:02:43,480 Donc, le modèle-objet de Pharo est le suivant: les 53 00:02:43,680 --> 00:02:45,440 variables d'instance sont protégées. 54 00:02:45,640 --> 00:02:47,850 Donc, tous les objets ont des variables d'instance et 55 00:02:48,050 --> 00:02:49,080 elles sont protégées, c'est-à-dire qu'elles ne sont 56 00:02:49,280 --> 00:02:52,760 accessibles que par l'objet lui-même, ou alors depuis les 57 00:02:52,960 --> 00:02:54,830 sous-classes de cet objet. 58 00:02:56,350 --> 00:02:59,000 Les méthodes sont publiques et virtuellement liées. 59 00:02:59,210 --> 00:03:00,200 Donc, toutes les méthodes sont publiques. 60 00:03:00,400 --> 00:03:02,000 Il n'y a pas de mot-clé public en Pharo. 61 00:03:02,910 --> 00:03:05,540 Et puis Pharo accepte l'héritage simple entre classes. 62 00:03:05,840 --> 00:03:07,800 Donc, une classe ne peut avoir qu'une seule super-classe. 63 00:03:09,680 --> 00:03:12,950 Donc, voici un exemple de code qui est le produit en 64 00:03:13,150 --> 00:03:16,360 croix de deux points: donc on a un point 1 et un point 65 00:03:16,560 --> 00:03:20,900 2, donc je vais multiplier le champ X du point 1 par le 66 00:03:21,100 --> 00:03:23,840 choix Y du point 2 et le soustraire à la multiplication 67 00:03:24,170 --> 00:03:28,290 du champ Y du point 1 et le champ X du point 2. 68 00:03:28,490 --> 00:03:32,480 Donc, c'est un exemple de calcul qu'on peut réaliser en Pharo. 69 00:03:34,690 --> 00:03:36,900 Donc, pour créer des objets en fait, on va avoir des 70 00:03:37,100 --> 00:03:40,250 messages particuliers, donc par exemple ici, si j'envoie 71 00:03:40,450 --> 00:03:44,930 le message @ à l'entier 10 et que je passe en 72 00:03:45,130 --> 00:03:48,540 paramètre l'entier 20, ça va me créer un point, donc une 73 00:03:48,740 --> 00:03:49,500 instance de la classe point. 74 00:03:50,540 --> 00:03:54,410 Donc ici, le nom du message, c'est bien @, le receveur du 75 00:03:54,610 --> 00:03:57,110 message, l'entier qui a reçu le message, c'est l'entier 76 00:03:57,310 --> 00:04:00,540 10, c'était celui qui était avant le nom du message, et 77 00:04:00,740 --> 00:04:03,020 puis l'argument, c'était 20, celui qui était après le nom du message. 78 00:04:04,180 --> 00:04:07,090 Donc, un autre exemple, par exemple ici, je vais créer 79 00:04:07,290 --> 00:04:09,290 une chaîne de caractères, on voit le résultat ici c'est 80 00:04:09,490 --> 00:04:11,900 une chaîne de caractères. Et comment cette chaîne de 81 00:04:12,100 --> 00:04:13,710 caractères a été obtenue ? 82 00:04:13,910 --> 00:04:16,230 On a utilisé une première chaîne de caractères, ici,'Pharo'. 83 00:04:16,750 --> 00:04:19,040 On lui a envoyé le message, virgule. 84 00:04:20,030 --> 00:04:23,030 En paramètre de ce message, on avait la chaîne de 85 00:04:23,230 --> 00:04:25,710 caractères'is Cool'd'accord qui est ici. 86 00:04:28,300 --> 00:04:31,180 Et la sémantique du message virgule, c'est la 87 00:04:31,380 --> 00:04:33,000 concaténation de chaines, donc les deux chaînes ont été 88 00:04:33,200 --> 00:04:35,350 collées pour en produire une seule concaténée. 89 00:04:37,120 --> 00:04:40,150 Donc on peut créer des objets en instanciant une classe 90 00:04:40,350 --> 00:04:42,250 directement grâce au message new par exemple. 91 00:04:42,510 --> 00:04:44,580 Donc, si j'ai une classe Monster, j'envoie le message 92 00:04:44,780 --> 00:04:48,460 new, j'obtiens bien une instance de la classe monster donc un objet monstre. 93 00:04:49,210 --> 00:04:52,260 Je peux créer une instance de la classe tableau, Array, 94 00:04:52,890 --> 00:04:55,690 en spécifiant l'objet new et en passant un paramètre. 95 00:04:55,890 --> 00:04:58,470 Pour passer un paramètre, c'est deux points, et puis je 96 00:04:58,670 --> 00:05:01,430 passe l'entier 6 et j'obtiens bien un tableau de taille 6. 97 00:05:03,320 --> 00:05:05,600 Donc, on peut avoir des types de message particulier pour 98 00:05:05,800 --> 00:05:08,300 créer des objets et je peux définir mes propres messages 99 00:05:08,500 --> 00:05:10,500 sur mes classes typiquement, je peux créer une classe 100 00:05:10,700 --> 00:05:13,150 Tamagotchi avec une méthode withHunger. 101 00:05:16,040 --> 00:05:18,240 Cette méthode-là, je vais lui passer l'entier 10, ça 102 00:05:18,440 --> 00:05:21,170 permet de créer une instance de la classe Tamagotchi en 103 00:05:21,370 --> 00:05:24,640 les passant en paramètres. Donc c'est vraiment des 104 00:05:24,840 --> 00:05:27,810 messages pour spécialiser pour la création d'objets. 105 00:05:29,000 --> 00:05:32,290 Donc, ce qu'on a vu dans cette séquence, c'était un 106 00:05:32,490 --> 00:05:34,190 survol du modèle objet de Pharo. 107 00:05:34,390 --> 00:05:35,530 L'objectif, ce n'était pas de tout comprendre. 108 00:05:35,730 --> 00:05:37,660 On reviendra sur ces notions dans les prochaines séquences. 109 00:05:38,120 --> 00:05:40,410 Mais ce qu'il est important de retenir, c'est qu'il n'y a 110 00:05:40,610 --> 00:05:41,650 pas de constructeur en Pharo. 111 00:05:42,010 --> 00:05:43,290 Il n'y a pas de méthode statique. 112 00:05:43,490 --> 00:05:44,470 Il n'y a pas de déclaration type. 113 00:05:44,720 --> 00:05:45,600 Il n'y a pas d'interface. 114 00:05:45,800 --> 00:05:48,600 Il n'y a pas de package, de private, de protected. 115 00:05:48,800 --> 00:05:51,190 Tous les modifieurs que l'on rencontre dans les langages AEG. 116 00:05:51,870 --> 00:05:54,630 Il n'y a pas de type paramétré, il n'y a pas de boxing, 117 00:05:54,830 --> 00:05:58,540 unboxing et vous verrez que c'est pourtant un langage extrêmement puissant. 118 00:06:00,840 --> 00:06:02,660 Donc, en Pharo, tout est objet. 119 00:06:02,860 --> 00:06:06,480 Tous les calculs se passent par envoi de messages à des 120 00:06:06,680 --> 00:06:11,200 objets, donc les méthodes acceptent la liaison 121 00:06:11,400 --> 00:06:13,460 tardive, d'accord. Donc, c'est-à-dire qu'il y a un 122 00:06:13,660 --> 00:06:15,050 algorithme qu'on appelle le method lookup qui va 123 00:06:15,250 --> 00:06:18,150 sélectionner la bonne méthode à exécuter quand un objet reçoit un message. 124 00:06:19,030 --> 00:06:22,130 Il y a la notion de blocks qui sont des méthodes anonymes. 125 00:06:22,900 --> 00:06:24,700 On verra que c'est extrêmement important en Pharo. 126 00:06:25,230 --> 00:06:29,580 Et puis, on peut envoyer des messages particuliers à des 127 00:06:29,780 --> 00:06:31,050 classes pour créer des objets.