1 00:00:00,410 --> 00:00:02,520 Bonjour. Dans ce cours on va aborder un point qui n'est 2 00:00:02,720 --> 00:00:05,750 pas souvent abordé dans les cours de Pharo qui sont: 3 00:00:05,950 --> 00:00:09,210 Comment est-ce qu'on définit des objets de taille variable? 4 00:00:09,410 --> 00:00:13,800 Si on regarde, on voit qu'on utilise déjà des objets de taille variable. 5 00:00:14,000 --> 00:00:18,060 Quand je veux créer un tableau avec cette expression-là, 6 00:00:18,260 --> 00:00:20,350 je vais créer un tableau ayant 10 éléments. 7 00:00:20,550 --> 00:00:22,530 Là, ils sont tous mis à 1 000, mais avec cette même 8 00:00:22,730 --> 00:00:26,800 expression-là, je vais créer un tableau qui aura 5 9 00:00:28,120 --> 00:00:31,560 éléments. Donc on voit que la classe "Tableaux" crée des 10 00:00:31,760 --> 00:00:33,600 instances qui sont de taille variable. 11 00:00:34,110 --> 00:00:36,310 Et pour le moment, on ne vous a pas expliqué comment vous pouviez faire. 12 00:00:36,510 --> 00:00:38,550 Si je vous donnais ça comme exercice, vous ne sauriez pas le faire. 13 00:00:39,480 --> 00:00:41,870 Donc, ce qu'on va voir dans ce cours, rapidement, c'est 14 00:00:42,070 --> 00:00:44,890 comment on définit des classes dont les instances ont des 15 00:00:45,090 --> 00:00:48,880 tailles variables, comment on instancie de tels objets et 16 00:00:49,080 --> 00:00:51,780 comment on accède à ces tailles variables. 17 00:00:52,940 --> 00:00:54,120 Commençons par le premier point. 18 00:00:55,600 --> 00:00:56,520 En fait c'est très simple. 19 00:00:57,600 --> 00:00:59,880 On va utiliser le message "variableSubclass" au lieu du 20 00:01:00,080 --> 00:01:02,300 message "subclass" dans la définition de classe. 21 00:01:02,600 --> 00:01:04,740 Là, j'ai copié la définition de la classe "Tableaux". 22 00:01:05,220 --> 00:01:06,440 Vous voyez que j'utilise "variableSubclass", 23 00:01:06,640 --> 00:01:11,580 "instanceVariableNames", et caetera., pour créer ma 24 00:01:11,780 --> 00:01:14,770 classe. Alors que normalement, quand vous avez défini la 25 00:01:15,000 --> 00:01:19,880 classe "Counter" ou la classe "D", de toute façon 26 00:01:20,080 --> 00:01:21,030 vous n'aviez utilisé que "subclass". 27 00:01:22,010 --> 00:01:24,890 Donc avec cette définition-là, les instances que vous 28 00:01:25,090 --> 00:01:27,370 allez créer ont des tailles variables. 29 00:01:27,570 --> 00:01:29,090 On va prendre un exemple débile: imaginons qu'on veuille 30 00:01:29,290 --> 00:01:32,380 faire un point un peu étrange avec 2 variables d'instance 31 00:01:33,090 --> 00:01:37,000 X et Y comme un point et une variable, une zone variable, 32 00:01:37,200 --> 00:01:40,250 on mettrait cette définition-là. Qu'est-ce que ça crée? 33 00:01:40,450 --> 00:01:41,930 Ça créerai des objets qui ont cet aspect-là, en fait. 34 00:01:42,130 --> 00:01:45,650 Ce qui veut dire que j'aurais une valeur pour X, une 35 00:01:45,850 --> 00:01:49,760 valeur pour Y, et une zone variable par instance. 36 00:01:50,000 --> 00:01:53,630 Je pourrais avoir une autre instance qui a aussi X, Y, 37 00:01:53,830 --> 00:01:58,460 avec 10 ici, puis 20 là, et là 100 et là 200 par 38 00:01:58,660 --> 00:02:02,680 exemple, et là avec une autre taille variable où je peux 39 00:02:02,880 --> 00:02:03,660 mettre différents objets. 40 00:02:04,840 --> 00:02:07,720 Donc ce qu'on voit, c'est que les instances d'une classe 41 00:02:07,920 --> 00:02:09,470 qui permet d'avoir des instances de taille variable ont 42 00:02:10,000 --> 00:02:12,900 une zone indexée, qui vient s'ajouter après les variables 43 00:02:13,100 --> 00:02:15,420 d'instance qui sont nommées, comme X Y. 44 00:02:15,770 --> 00:02:18,000 Et elle est implicite et il n'y en a qu'une par classe 45 00:02:18,820 --> 00:02:20,540 pour des problèmes d'implémentation, sinon on ne saurait 46 00:02:20,740 --> 00:02:23,820 pas comment ça grandit. Donc voilà, vous avez vu comment 47 00:02:24,020 --> 00:02:27,890 on crée des classes dont les instances ont une taille variable. 48 00:02:28,860 --> 00:02:30,880 Maintenant, comment on les instancie, on l'a déjà vu tout 49 00:02:31,080 --> 00:02:32,900 au début du cours mais on va regarder, et comment on 50 00:02:33,100 --> 00:02:34,190 accède à cette taille variable. 51 00:02:36,340 --> 00:02:40,190 En fait, on les instancie en utilisant le message "New:". 52 00:02:41,070 --> 00:02:43,000 Ce qui est important c'est le message "New:". 53 00:02:43,180 --> 00:02:46,310 On a vu ça dans le cours sur les collections mais c'est bien de le rappeler. 54 00:02:46,720 --> 00:02:49,480 Là ça nous donne: "OK, je veux créer un objet de taille 55 00:02:49,680 --> 00:02:52,680 variable et la taille variable de cet objet est spécifiée 56 00:02:52,880 --> 00:02:54,390 par la valeur max qui est donnée ici". 57 00:02:54,720 --> 00:02:58,060 Donc là, je crée un objet, un tableau, qui aura 4 éléments. 58 00:03:02,000 --> 00:03:04,180 Comment je vais accéder à cette taille variable? 59 00:03:04,820 --> 00:03:08,200 Je vais accéder avec les messages "At" et "at put" que 60 00:03:08,400 --> 00:03:10,760 vous avez vus sur les tableaux. Et ça, ça va marcher pour 61 00:03:10,960 --> 00:03:13,680 tous les objets qui ont une taille variable. 62 00:03:14,320 --> 00:03:17,510 Donc là, si je mets "At 2", ici je vais mettre "Lulu". 63 00:03:21,180 --> 00:03:23,870 Si je regarde et que j'accède à la valeur 1, ça va me 64 00:03:24,070 --> 00:03:26,530 rendre 1 000, c'est normal. Et si je regarde quelle est 65 00:03:26,730 --> 00:03:29,550 la valeur 2, ça me donnera "Lulu". 66 00:03:30,100 --> 00:03:34,900 Donc, en fait, il y a un mapping entre les tableaux et 67 00:03:35,100 --> 00:03:38,060 les objets à taille variable en utilisant "at put" et 68 00:03:38,260 --> 00:03:40,580 "New" parce que ce protocole-là, d'API, va fonctionner 69 00:03:40,780 --> 00:03:44,610 pour les Array et pour tous les objets dont on voudrait 70 00:03:44,810 --> 00:03:47,270 qu'ils aient une taille variable, plus "Variable Size". 71 00:03:50,110 --> 00:03:52,430 Finalement, je ne vous ai pas appris grand-chose dans ce 72 00:03:52,630 --> 00:03:54,280 cours, je vous ai juste montré comment on définissait la 73 00:03:54,480 --> 00:03:56,350 classe "Array" et comment ça se généralise à d'autres 74 00:03:56,550 --> 00:03:58,160 objets, parce que vous connaissiez déjà le protocole. 75 00:03:59,850 --> 00:04:01,860 Donc finalement, si on regarde dans Pharo, on a des 76 00:04:02,060 --> 00:04:05,850 objets ou des classes qui ont ce qu'on appelle des formes différentes. 77 00:04:06,070 --> 00:04:09,690 On va avoir des classes qui n'ont que des variables d'instance 78 00:04:09,890 --> 00:04:14,070 nommées, comme le Counter avec 40 ou la classe D avec le 79 00:04:14,270 --> 00:04:18,150 nombre de faces. Après, on va avoir des classes qui ont 80 00:04:18,350 --> 00:04:22,740 seulement une zone variable ou indexée, comme la classe "Array". 81 00:04:22,940 --> 00:04:26,090 Et puis après, on va voir les autres qui peuvent être un mélange des deux. 82 00:04:27,000 --> 00:04:30,090 Donc là on a quelques contraintes, on peut faire ça,mais 83 00:04:30,290 --> 00:04:31,280 c'est un petit peu plus subtil. 84 00:04:31,480 --> 00:04:34,550 Ça veut dire qu'on peut maintenant décider quel est le 85 00:04:34,750 --> 00:04:36,650 type de classe variable. Là, je ne veux aller dans les 86 00:04:36,850 --> 00:04:38,030 détails je veux juste vous donner l'intention. 87 00:04:38,360 --> 00:04:41,750 Je peux dire que la classe, la partie variable, va être 88 00:04:41,950 --> 00:04:46,610 juste des pointeurs sur des objets, ou des bytes 89 00:04:46,860 --> 00:04:50,610 ou des words. On a besoin de ça parce que parfois, pour s'interfacer 90 00:04:50,810 --> 00:04:52,810 avec le monde extérieur, on a besoin de pouvoir spécifier. 91 00:04:53,010 --> 00:04:55,380 Moi, je veux une taille, et je veux dans cette taille, 92 00:04:55,580 --> 00:04:58,640 mettre des pointeurs sur des objets qui ont une certaine forme. 93 00:04:59,240 --> 00:05:02,870 Cette partie est vraiment avancée, mais c'est juste pour vous montrer. 94 00:05:03,070 --> 00:05:06,360 Donc vous, souvent, vous allez rester dans ce monde-là, avec subclass. 95 00:05:06,730 --> 00:05:09,170 De temps en temps, vous allez utiliser variableSubclass. 96 00:05:10,700 --> 00:05:13,620 Et par exemple, Bitmap, qui est l'objet qui représente l'écran, 97 00:05:14,820 --> 00:05:19,600 est vraiment un objet qui a une zone variable qui sont 98 00:05:19,800 --> 00:05:23,220 des Word. C'était juste pour vous dire que ça existe. 99 00:05:24,120 --> 00:05:27,260 Le système, comme je vous l'ai dit, est un système 100 00:05:27,460 --> 00:05:29,700 réflexif, on peut lui poser des questions. 101 00:05:29,920 --> 00:05:32,580 Vous pouvez donc très bien demander, en utilisant ces 102 00:05:32,780 --> 00:05:36,010 méthodes-là, si c'est une taille fixe, si c'est une 103 00:05:36,940 --> 00:05:39,160 taille variable, si ce sont des pointeurs, si ce sont 104 00:05:39,360 --> 00:05:41,570 plutôt des bytes qui sont stockés, et caetera. 105 00:05:41,770 --> 00:05:45,470 Donc on a toute l'API pour pouvoir demander de quelle 106 00:05:45,670 --> 00:05:48,360 sorte sont les classes. C'est comme ça qu'on a fait cette 107 00:05:48,560 --> 00:05:49,740 liste, en faisant des queries dans le système. 108 00:05:51,240 --> 00:05:55,920 Maintenant, il y a une contrainte: les classes définies 109 00:05:56,750 --> 00:06:00,580 en utilisant subclass peuvent avoir n'importe quelle sorte de sous-classe. 110 00:06:00,780 --> 00:06:04,560 Ça veut dire que si j'ai des points avec X Y, je vais 111 00:06:04,760 --> 00:06:08,140 pouvoir mettre une sous-classe qui va être Z, ou une 112 00:06:08,340 --> 00:06:12,240 sous-classe qui va être X Y plus une taille variable. 113 00:06:14,520 --> 00:06:19,400 Quand vous voulez faire une sous-classe d'une classe qui 114 00:06:19,600 --> 00:06:23,690 est déjà une variable, vous pouvez utiliser exclusivement 115 00:06:24,430 --> 00:06:26,470 des classes qui sont variables, c'est comme ça. 116 00:06:26,910 --> 00:06:29,080 Le système qui construit les classes va vérifier et dire 117 00:06:29,280 --> 00:06:30,530 "Non, c'est incompatible, je ne peux pas le faire". 118 00:06:30,730 --> 00:06:33,830 Pourquoi? Parce que lui a besoin de savoir qu'il n'y a 119 00:06:34,030 --> 00:06:35,880 qu'une zone et traiter les contraintes. 120 00:06:36,080 --> 00:06:37,600 Donc, de toute façon, le système vous dira que ce n'est 121 00:06:37,800 --> 00:06:40,170 pas possible de le créer. C'était juste pour vous dire que ça existe. 122 00:06:41,610 --> 00:06:43,940 Donc, ce que vous devez savoir finalement maintenant, c'est 123 00:06:45,860 --> 00:06:49,610 comment on définit des classes dont les instances ont une 124 00:06:49,810 --> 00:06:54,230 taille variable, comment on les instancie, avec New:, et 125 00:06:56,890 --> 00:06:59,780 comment on y accède avec les protocoles qui sont les 126 00:07:00,000 --> 00:07:01,820 protocoles que vous avez vus sur les tableaux.