1 00:00:01,910 --> 00:00:04,410 Donc cette vidéo est un Redo pour le MOOC. 2 00:00:04,577 --> 00:00:07,030 Re-do dans le sens où on vous demande de le refaire, de 3 00:00:07,520 --> 00:00:09,540 suivre la vidéo et pas à pas de le refaire. 4 00:00:10,060 --> 00:00:13,470 C'est aussi une invitation à regarder comment on code. 5 00:00:13,720 --> 00:00:17,680 Donc moi je ne vais pas suivre un script très précis, je 6 00:00:17,847 --> 00:00:20,060 vais essayer de le faire mais si j'ai des bugs ou des 7 00:00:20,227 --> 00:00:23,090 choses comme ça, je vais les traiter au fur et à mesure. 8 00:00:24,870 --> 00:00:29,130 Donc l'idée de cette vidéo, c'est de faire un petit 9 00:00:29,297 --> 00:00:32,040 langage qu'on retrouve dans les jeux de rôles comme 10 00:00:32,207 --> 00:00:35,930 "Donjons et Dragons", qui nous disent par exemple, ceux 11 00:00:36,097 --> 00:00:38,800 qui ont ce genre de petites expressions, qu'est-ce que 12 00:00:38,967 --> 00:00:40,010 veut dire cette expression ? 13 00:00:40,420 --> 00:00:45,380 Elle veut dire: tu dois lancer 2 dés à 20 faces et 1 dé à 4 faces. 14 00:00:45,547 --> 00:00:47,420 Et vous allez voir que ça peut être une expression Pharo. 15 00:00:48,000 --> 00:00:52,490 Et donc, dans cette vidéo, on va 16 00:00:52,657 --> 00:00:55,170 implémenter une classe qui représente un dé et une classe 17 00:00:55,337 --> 00:00:57,420 qui représente une poignée de dés. 18 00:00:58,660 --> 00:00:59,770 Donc, on va commencer. 19 00:01:00,870 --> 00:01:04,290 Donc pour cela, on va commencer par définir un package. 20 00:01:05,710 --> 00:01:06,790 Donc ce package, on va l'appeler "Dice". 21 00:01:06,957 --> 00:01:11,860 Donc je n'ai pas trop envie de voir 22 00:01:12,027 --> 00:01:16,660 d'autres choses. Alors cette 23 00:01:16,827 --> 00:01:19,450 vidéo je ne vais pas la faire en mode codée dans le 24 00:01:19,617 --> 00:01:22,210 débugger, vous l'avez vu dans une autre vidéo, je vais le 25 00:01:22,377 --> 00:01:24,410 faire au cas par cas, de manière opportuniste. 26 00:01:25,490 --> 00:01:30,030 Donc là, je vais définir la classe "Die", qui a un 27 00:01:30,197 --> 00:01:31,370 certain nombre de faces. 28 00:01:32,100 --> 00:01:35,630 Je la compile. Je vais rajouter un commentaire de classe. 29 00:01:43,380 --> 00:01:45,890 Alors pour le moment, pas grand-chose parce que c'est très très simple. 30 00:01:47,550 --> 00:01:52,360 Ce qu'on va commencer à faire, on va faire en sorte qu'on 31 00:01:52,527 --> 00:01:53,950 puisse initialiser notre objet. 32 00:02:00,450 --> 00:02:02,260 Donc, je vais le faire comme ça. 33 00:02:10,190 --> 00:02:13,560 J'appelle une initialisation de la super classe, et je 34 00:02:13,727 --> 00:02:18,140 vais mettre par défaut 6 faces à mon dé, parce que ce 35 00:02:18,307 --> 00:02:19,140 sont les dés les plus courants. 36 00:02:19,820 --> 00:02:22,530 Maintenant je vais commencer aussi à développer une 37 00:02:22,697 --> 00:02:25,640 classe de tests, histoire d'être sûr que ce qu'on fait ne 38 00:02:25,807 --> 00:02:26,900 casse pas ce qui a déjà été fait. 39 00:02:27,260 --> 00:02:30,450 Donc les classes de tests, elles sont sous-classes de la classe TestCase. 40 00:02:30,617 --> 00:02:34,100 Et on va l'appeler "DieTest". 41 00:02:34,370 --> 00:02:37,510 Voilà, j'ai ma classe de tests. 42 00:02:37,790 --> 00:02:40,220 Donc un des premiers tests qu'on va faire, alors il ne 43 00:02:40,387 --> 00:02:42,480 faut pas les faire tout le temps comme ça, mais en tout 44 00:02:42,647 --> 00:02:46,650 cas, celui-là, j'aimerais bien commencer par avoir un test qui fonctionne. 45 00:02:47,840 --> 00:02:52,120 Comme là, on n'a pas grand-chose, je vais dire que l'initialisation est ok. 46 00:02:53,820 --> 00:02:56,160 Donc c'est aussi une façon pour moi de vous montrer 47 00:02:56,327 --> 00:02:59,770 comment on peut tester qu'on peut capturer des exceptions 48 00:02:59,937 --> 00:03:01,440 ou que des exceptions ne doivent pas arriver. 49 00:03:02,180 --> 00:03:04,590 Donc là, ce que je suis en train de dire, je veux dire: 50 00:03:04,757 --> 00:03:06,460 Die new should not raise error. 51 00:03:18,120 --> 00:03:19,170 Donc qu'est-ce que ça veut dire ? 52 00:03:19,337 --> 00:03:23,290 Ça veut dire, quand j'exécute ce morceau de code "Die 53 00:03:23,457 --> 00:03:25,600 new", il n'y a pas d'erreurs qui doivent arriver. 54 00:03:28,170 --> 00:03:32,560 Donc je vais classifier mon test et je vais le faire tourner. 55 00:03:32,727 --> 00:03:35,550 C'est vert. Très bien. 56 00:03:36,000 --> 00:03:40,020 Donc maintenant ce que j'aimerais faire, c'est définir la 57 00:03:40,187 --> 00:03:44,540 méthode qui fait tourner un dé, qui fait un lancé de dé. 58 00:03:44,707 --> 00:03:48,610 Donc, je sais que dans Pharo, il doit y avoir une méthode 59 00:03:48,777 --> 00:03:49,720 qui s'appelle "at Random". 60 00:03:49,887 --> 00:03:53,940 At Random, qu'est-ce qu'elle fait ? 61 00:03:54,480 --> 00:03:57,780 Elle me permet d'avoir… Ok. 62 00:03:58,310 --> 00:04:00,770 Donc maintenant je vais regarder l'implémentation pour m'assurer 63 00:04:00,937 --> 00:04:03,620 que c'est bon. AtRandom, voilà, qu'est-ce qu'il fait? 64 00:04:04,870 --> 00:04:09,070 Rend un entier au hasard entre 1 à self, donc c'est parfait. 65 00:04:10,910 --> 00:04:13,910 Donc ce que je vais faire, je vais définir une nouvelle 66 00:04:15,290 --> 00:04:19,220 méthode dans Operations. 67 00:04:21,160 --> 00:04:22,230 Qu'est-ce qu'elle va faire ? 68 00:04:22,397 --> 00:04:26,640 Roll. Je vais lui dire: tu me rends "faces 69 00:04:27,570 --> 00:04:28,203 atRandom". 70 00:04:35,750 --> 00:04:37,400 Donc on va écrire un test pour ça. 71 00:04:40,490 --> 00:04:43,590 TestRolling. Donc qu'est-ce qu'on fait là? 72 00:04:44,120 --> 00:04:49,040 On va créer un dé. d : = die 73 00:04:49,207 --> 00:04:49,840 new. 74 00:04:51,210 --> 00:04:53,140 Et maintenant, je vais faire "1000 timesRepeat". 75 00:04:54,420 --> 00:04:58,240 Quoi ? "D Roll". 76 00:05:03,620 --> 00:05:07,580 Donc ça, je veux que ce soit entre 1 et 6. 77 00:05:07,747 --> 00:05:12,640 "Between: and:", c'est 78 00:05:12,807 --> 00:05:15,560 bien. "Between 1 et 6". 79 00:05:15,820 --> 00:05:18,510 Alors, ce n'est pas très bien parce que là, on a fait un 80 00:05:18,677 --> 00:05:22,470 test que pour les dés à 6 faces, on aurait pu dire que ça 81 00:05:22,637 --> 00:05:25,310 fonctionne en fonction du nombre de faces de notre dé. 82 00:05:25,640 --> 00:05:26,580 On le fera plus tard. 83 00:05:26,830 --> 00:05:27,463 Donc je compile. 84 00:05:32,840 --> 00:05:35,620 J'ai une erreur. Voilà. 85 00:05:37,910 --> 00:05:39,170 Donc c'est bon, j'ai mon test. 86 00:05:39,337 --> 00:05:41,460 Donc là, c'est l'occasion de sauver, donc là j'ai mon 87 00:05:41,627 --> 00:05:44,590 package "Dice", je vais le sauver de manière locale, "Save". 88 00:05:44,757 --> 00:05:49,000 J'en avais fait quelques-uns avant pour me chauffer donc 89 00:05:49,167 --> 00:05:51,710 moi je vais en refaire un, qui est "New version with 90 00:05:56,530 --> 00:06:00,780 rolling and test". Très bien. 91 00:06:01,030 --> 00:06:02,370 Voilà, on a sauvé. 92 00:06:11,480 --> 00:06:14,610 Donc maintenant ce que j'aimerais faire, c'est changer un 93 00:06:14,777 --> 00:06:18,890 peu l'interface de création. Déjà on va 94 00:06:19,810 --> 00:06:22,200 recatégoriser, si on veut charger un peu l'interface de 95 00:06:22,367 --> 00:06:26,390 création, on aimerait dire par exemple: "to create a die 96 00:06:26,557 --> 00:06:28,090 use die faces". 97 00:06:39,290 --> 00:06:42,610 Donc là ce qu'il faut voir sur cette expression, c'est 98 00:06:42,777 --> 00:06:46,030 que faces c'est un message envoyé à la classe die et pas 99 00:06:46,197 --> 00:06:48,610 à une instance de la classe die, comme c'est le cas dans 100 00:06:49,090 --> 00:06:51,880 la méthode roll ou dans les autres méthodes qu'on a codées jusqu'à présent. 101 00:06:52,047 --> 00:06:55,040 Donc on va faire ça pour que vous compreniez bien quand 102 00:06:55,207 --> 00:06:58,900 est-ce qu'on doit utiliser et aller au niveau class ou pas. 103 00:06:59,350 --> 00:07:00,710 Donc commençons par écrire un test. 104 00:07:03,050 --> 00:07:06,420 Donc "betterInterface". 105 00:07:08,790 --> 00:07:10,200 Donc si je reprends la même logique, 106 00:07:12,230 --> 00:07:18,080 "TestbetterCreationInterface", ce 107 00:07:18,247 --> 00:07:20,950 que j'aimerais faire ici c'est faire quelque chose comme ça, par exemple. 108 00:07:22,680 --> 00:07:23,640 Et que ça, ça soit faces. 109 00:07:30,620 --> 00:07:32,420 Ce que je vais faire je vais le faire lentement. 110 00:07:32,950 --> 00:07:36,840 Là, je viens ici et je fais "instance creation" faces anInteger. 111 00:07:46,560 --> 00:07:49,000 Donc je pourrais l'écrire de façon compacte mais là je 112 00:07:49,167 --> 00:07:50,530 vais faire d'une manière calme. 113 00:07:51,000 --> 00:07:52,940 Donc je crée un die. 114 00:07:53,890 --> 00:07:57,740 Donc je fais "self new", puisque self là c'est la classe die elle-même. 115 00:07:58,220 --> 00:08:00,410 Donc je lui demande: crée-moi une instance. 116 00:08:00,577 --> 00:08:03,620 Et maintenant, à cette nouvelle instance je vais utiliser 117 00:08:03,787 --> 00:08:08,410 un accesseur pour pouvoir lui mettre la valeur qui a été passée en argument. 118 00:08:08,577 --> 00:08:12,130 Et bien sûr je vais rendre le dé que je viens de créer. 119 00:08:13,860 --> 00:08:16,920 Donc quand je vais exécuter le code, ça va pas marcher parce 120 00:08:17,087 --> 00:08:19,950 que faces n'existe pas, donc il ne faut pas s'inquiéter. 121 00:08:20,117 --> 00:08:22,760 Ce qu'on voit, c'est que mon test ne passe pas, mais que 122 00:08:22,927 --> 00:08:27,720 c'est normal, parce que si j'exécute même ça par 123 00:08:27,887 --> 00:08:29,520 exemple, si je fais débug pour voir. 124 00:08:33,640 --> 00:08:38,360 Donc si je fais Over, là il me dit: oui, je ne connais 125 00:08:38,527 --> 00:08:41,430 pas le message faces. 126 00:08:41,910 --> 00:08:45,770 Donc là on va le faire calmement, je ne vais pas le faire dans le débugger. 127 00:08:46,830 --> 00:08:49,600 Je vais dire: oui c'est vrai qu'il fallait qu'ici j'ajoute 128 00:08:52,910 --> 00:08:57,390 un accesseur. Donc je vais faire faces: anInteger. 129 00:08:57,557 --> 00:09:01,520 Et là on va faire faces : anInteger. 130 00:09:05,020 --> 00:09:08,110 Et tant qu'à faire, je vais faire l'accesseur en lecture. 131 00:09:09,330 --> 00:09:11,500 Voilà, je rends celui-là. 132 00:09:13,250 --> 00:09:14,450 Et là maintenant mon test est vert. 133 00:09:15,240 --> 00:09:19,180 Donc on va sauver, on va en profiter pour sauver, "save 134 00:09:19,347 --> 00:09:22,250 better die creation method with tests". 135 00:09:22,417 --> 00:09:23,050 Très bien. 136 00:09:31,610 --> 00:09:33,670 Donc maintenant ce qu'on va pouvoir commencer à faire, on 137 00:09:33,837 --> 00:09:37,650 va pouvoir commencer à définir ce qu'on veut pour 138 00:09:38,690 --> 00:09:42,050 diceHandle. Donc en gros, si on regarde, diceHandle, 139 00:09:42,217 --> 00:09:44,000 comment on aimerait l'écrire ? 140 00:09:44,167 --> 00:09:45,450 On aimerait écrire diceHandle new addDie. 141 00:09:49,300 --> 00:09:53,290 Donc là on va créer un nouveau dé, "die faces 6, addDie". 142 00:09:55,210 --> 00:09:59,680 "Die faces 10". 143 00:10:07,260 --> 00:10:12,040 Donc ce qu'on va faire, on va commencer par écrire une 144 00:10:12,207 --> 00:10:13,580 classe de test, cette fois-ci. 145 00:10:15,250 --> 00:10:19,930 Donc nouvelle classe qui hérite de TestCase, 146 00:10:20,290 --> 00:10:22,330 très bien. Donc j'ai ma nouvelle classe de tests. 147 00:10:24,000 --> 00:10:26,730 Et là, je vais définir un test. 148 00:10:30,220 --> 00:10:32,850 L'idée c'est que je vais créer une poignée et puis je 149 00:10:33,017 --> 00:10:35,140 vais vérifier que j'ai les bons dés dedans. 150 00:10:35,307 --> 00:10:39,380 Donc je vais faire "testAdding", je veux réutiliser mon 151 00:10:39,547 --> 00:10:43,730 code, il n'y a pas de raison. 152 00:10:45,530 --> 00:10:48,060 Donc, j'ai mon 153 00:10:54,310 --> 00:10:58,940 handle ; yourself parce que je veux 154 00:10:59,107 --> 00:11:01,960 récupérer le receveur du message, c'est-à-dire la poignée 155 00:11:02,127 --> 00:11:03,690 et pas l'argument qui est ici. 156 00:11:04,500 --> 00:11:08,260 Et maintenant, qu'est-ce que je dois faire? 157 00:11:08,427 --> 00:11:12,520 Je dois faire "self assert h diceNumber 158 00:11:13,960 --> 00:11:14,593 equals 2". 159 00:11:20,700 --> 00:11:23,380 Je compile. Alors bien sûr le système me dit: je ne 160 00:11:23,547 --> 00:11:25,930 connais pas la variable DiceHandle, est-ce que tu veux 161 00:11:26,097 --> 00:11:26,730 que ça soit une classe ? 162 00:11:26,897 --> 00:11:27,960 Ben oui. Il faut que ça soit une classe. 163 00:11:28,560 --> 00:11:29,750 Donc là, il va me la définir. 164 00:11:29,917 --> 00:11:31,340 Comme je sais que de toute façon il va falloir que je 165 00:11:31,507 --> 00:11:36,440 stoppe mes dés, je vais en profiter pour 166 00:11:36,870 --> 00:11:39,580 mettre une variable d'instance. 167 00:11:39,747 --> 00:11:40,860 Je compile tout ça. 168 00:11:41,790 --> 00:11:45,720 Donc maintenant, c'est rouge parce que "Add die" n'a jamais été défini. 169 00:11:47,620 --> 00:11:48,570 Donc on va le faire. 170 00:11:48,737 --> 00:11:51,620 Avant de faire ça, ça serait bien qu'on initialise 171 00:11:54,240 --> 00:11:56,660 la poignée, donc on va le faire comme ça, ça nous évitera 172 00:11:56,827 --> 00:11:57,890 d'avoir un bug plus tard. 173 00:12:02,890 --> 00:12:04,560 Donc dice : = OrdereCollection new. 174 00:12:04,727 --> 00:12:05,360 Recategorize. 175 00:12:21,880 --> 00:12:24,760 Et maintenant, je dois être capable de faire tourner mon 176 00:12:24,927 --> 00:12:27,730 test, qui va planter. Voilà, très bien. 177 00:12:27,897 --> 00:12:30,200 Et je vais créer Add die. 178 00:12:30,530 --> 00:12:31,163 Adding. 179 00:12:35,330 --> 00:12:38,030 Donc là, il me dit: oui, il faudrait que tu implémentes cette méthode. 180 00:12:38,197 --> 00:12:39,080 Oui, ça fait du sens. 181 00:12:39,247 --> 00:12:42,430 Donc là, je vais faire "Dice add adie". 182 00:12:43,590 --> 00:12:45,920 Voilà, très bien. Donc mon test ne va pas toujours 183 00:12:46,087 --> 00:12:48,150 marcher parce que je n'ai toujours pas défini la méthode 184 00:12:48,317 --> 00:12:52,120 diceNumber mais faisons-le. Oui, diceNumber, on va la 185 00:12:52,287 --> 00:12:56,780 créer, très bien, dans accessing cette fois-ci. 186 00:12:57,350 --> 00:12:58,800 Et diceNumber, qu'est-ce que ça va faire? 187 00:12:58,967 --> 00:13:00,330 Ça doit rendre finalement 188 00:13:06,290 --> 00:13:08,110 dice size. Voilà, je recompile, proceed. 189 00:13:09,940 --> 00:13:12,510 Et mon test doit être vert donc j'en profite pareil, mes 190 00:13:12,677 --> 00:13:14,860 tests sont verts super, je prends et je sauve. 191 00:13:17,250 --> 00:13:18,580 "With addDie and test". 192 00:13:24,560 --> 00:13:28,090 Donc le test on pourrait l'améliorer parce que là, 193 00:13:28,257 --> 00:13:31,900 finalement, il teste qu'on ajoute deux nombres, moi je voudrais 194 00:13:32,067 --> 00:13:35,180 qu'on teste quand 195 00:13:35,347 --> 00:13:37,610 on ajoute 2 fois le même dé, on ne le perd pas. 196 00:13:38,280 --> 00:13:39,340 Donc je vais faire "TestAddingTwiceTheSame DieisOK". 197 00:13:49,040 --> 00:13:50,290 Donc là, qu'est-ce que je vais faire? 198 00:13:50,457 --> 00:13:54,530 J'ajoute 6 et 6 et je dois bien obtenir 2. 199 00:13:57,030 --> 00:13:59,940 Donc je fais ça, je fais tourner mon test, c'est vert, super. 200 00:14:01,230 --> 00:14:04,700 Donc maintenant, ce qui serait sympa, c'est que on puisse 201 00:14:05,880 --> 00:14:08,960 définir ce que c'est que de faire 202 00:14:11,240 --> 00:14:14,900 ajouter 2 dés. Mais avant ça, on va faire quelque chose. 203 00:14:15,067 --> 00:14:17,210 Si vous regardez, moi ce que je n'aime pas trop c'est que 204 00:14:17,377 --> 00:14:19,030 quand j'inspecte ça, par exemple, 205 00:14:23,950 --> 00:14:28,740 si je fais" Inspect" là-dessus, je ne vois 206 00:14:28,907 --> 00:14:31,530 pas les valeurs des dés et puis ce n'est pas pratique pour débugger. 207 00:14:31,697 --> 00:14:33,030 Dans le débugger, on ne voit pas ça. 208 00:14:33,370 --> 00:14:36,090 Donc d'abord, avant de continuer, je voudrais améliorer 209 00:14:36,257 --> 00:14:38,370 ça donc ce que je vais faire je vais ajouter une méthode 210 00:14:38,660 --> 00:14:41,710 dans le protocole Printing. Donc la méthode "PrintOn", 211 00:14:44,220 --> 00:14:46,840 elle est définie sur tous les objets du système et elle 212 00:14:47,007 --> 00:14:50,380 va permettre de convertir un objet dans une 213 00:14:50,547 --> 00:14:53,490 représentation textuelle et 214 00:14:55,380 --> 00:14:58,780 elle nous passe une stream et nous, on va mettre juste la 215 00:14:58,947 --> 00:15:00,420 représentation qu'on veut dedans. 216 00:15:01,890 --> 00:15:03,500 Donc si je fais ça, je n'ai rien fait en fait. 217 00:15:03,667 --> 00:15:07,630 Si je fais super PrintOn en fait, je n'ai rien fait. 218 00:15:07,797 --> 00:15:09,230 Maintenant ce que je vais faire, je vais faire 219 00:15:09,397 --> 00:15:13,220 "aStreamnextPut", donc je vais mettre des caractères dans 220 00:15:13,387 --> 00:15:15,220 la stream, mais qu'est-ce que je vais commencer par mettre? 221 00:15:16,090 --> 00:15:18,330 Je vais mettre une parenthèse avec un espace, ça sera 222 00:15:18,497 --> 00:15:19,880 peut-être plus joli, une parenthèse. 223 00:15:20,450 --> 00:15:23,550 Après je vais prendre les faces et je vais les convertir 224 00:15:23,717 --> 00:15:27,780 en nombres, en chaînes, et je vais concaténer tout ça, 225 00:15:28,360 --> 00:15:30,760 avec une petite parenthèse fermante. 226 00:15:31,150 --> 00:15:34,930 Donc si je fais ça, j'ai fermé le débugger, donc on va le rouvrir. 227 00:15:35,850 --> 00:15:38,630 J'ai mon débugger. Voilà maintenant, j'ai un dé à 6 faces 228 00:15:38,797 --> 00:15:40,480 et un dé à 10 faces. Donc c'est quand même beaucoup plus 229 00:15:40,647 --> 00:15:44,140 sympa, vous allez voir, si jamais on a des bugs, ça nous aidera. 230 00:15:44,850 --> 00:15:48,140 Donc là je n'ai rien fait de spécial, mes tests tournent. 231 00:15:49,450 --> 00:15:53,340 Je resauve, ça ne coûte pas cher, "With printing". 232 00:15:55,220 --> 00:15:56,400 On va marquer "with die printOn". 233 00:16:03,030 --> 00:16:08,000 Très bien et maintenant on va faire le test, on ne va 234 00:16:08,167 --> 00:16:09,580 pas le faire, on va y aller directement. 235 00:16:10,080 --> 00:16:12,490 On va faire "add protocole roll operations". 236 00:16:13,600 --> 00:16:17,890 Et là, donc 237 00:16:18,057 --> 00:16:22,530 il y a plusieurs façons de définir ça. 238 00:16:22,820 --> 00:16:25,040 Je vous en propose une, ce n'est pas la plus jolie mais 239 00:16:25,207 --> 00:16:27,160 au moins c'est la plus claire probablement pour vous. 240 00:16:27,530 --> 00:16:29,130 Donc il y a des façons très compactes, je pourrais le 241 00:16:29,297 --> 00:16:31,490 faire en une ligne, mais en utilisant des itérateurs 242 00:16:31,657 --> 00:16:33,150 comme "Injected to", là, je vais faire une boucle. 243 00:16:33,550 --> 00:16:34,210 Donc qu'est-ce que je fais ? 244 00:16:34,377 --> 00:16:36,860 Je prends une valeur que j'initialise à zéro. 245 00:16:37,390 --> 00:16:42,320 Après je vais faire une boucle sur tous les dés, et pour 246 00:16:42,487 --> 00:16:47,120 chaque pas de boucle je vais récupérer un dé et ce dé qu'est-ce 247 00:16:47,287 --> 00:16:47,920 que je vais faire ? 248 00:16:48,120 --> 00:16:51,900 Je vais lui demander de me tirer un tirage du dé et d'ajouter 249 00:16:52,067 --> 00:16:53,440 le résultat dans ma variable. 250 00:16:55,640 --> 00:17:00,310 Rien de bien fou mais au moins ça a le mérite d'être très très explicite. 251 00:17:02,000 --> 00:17:05,380 Et donc maintenant, si je fais "Inspect" et que là je 252 00:17:05,547 --> 00:17:10,510 fais "Roll", 5 ça ne me prouve pas que ça marche. 253 00:17:11,210 --> 00:17:12,140 On va essayer encore. 254 00:17:12,307 --> 00:17:13,140 11. Voilà, ça, ça marche. 255 00:17:13,950 --> 00:17:16,120 Donc on va essayer d'écrire un test, il n'y a pas de 256 00:17:16,287 --> 00:17:19,920 raison, donc on va faire "Test", je veux garder celui-là 257 00:17:21,590 --> 00:17:22,940 et je vais l'appeler rolling. 258 00:17:26,960 --> 00:17:30,940 Alors comment on devrait faire pour tester ça? 259 00:17:31,107 --> 00:17:35,760 Il faut que ça soit entre 1 et le maximum du nombre de dés. 260 00:17:38,000 --> 00:17:42,100 Donc, on va faire ça. 261 00:17:42,267 --> 00:17:42,900 On 262 00:17:48,280 --> 00:17:49,930 pourrait définir une méthode qui fait ça. 263 00:17:50,240 --> 00:17:53,040 Faisons une méthode qui définit le maximum. 264 00:17:56,720 --> 00:18:00,100 "Operation maxValue". 265 00:18:02,480 --> 00:18:03,240 Qu'est-ce que c'est que maxValue ? 266 00:18:03,407 --> 00:18:05,020 Finalement, c'est très proche de ça. 267 00:18:05,780 --> 00:18:10,000 C'est que là, au lieu de faire un roll, 268 00:18:11,440 --> 00:18:12,430 je vais demander les faces. 269 00:18:16,560 --> 00:18:20,490 Donc vérifions. Si je fais "Inspect", là 270 00:18:21,830 --> 00:18:24,820 je vais faire "maxValue"16". 271 00:18:28,490 --> 00:18:30,480 Oui c'est juste 10 et 6. 272 00:18:30,647 --> 00:18:33,090 Donc, on va écrire un test tant qu'à faire pour 273 00:18:37,010 --> 00:18:41,600 "maxValue". Donc j'ai ça, je vais faire "maxValue equal 274 00:18:41,767 --> 00:18:42,400 16". 275 00:18:45,320 --> 00:18:48,150 Alors là, vous avez vu, j'aurais pu coder un truc tout 276 00:18:48,317 --> 00:18:51,320 sale dans mon test, mais finalement ça vaut plus la peine 277 00:18:51,487 --> 00:18:53,690 de créer une méthode dans la classe et de l'utiliser. 278 00:18:54,080 --> 00:18:58,370 Donc maintenant, on va pouvoir tester que la méthode roll 279 00:18:58,820 --> 00:19:02,340 fonctionne bien. Donc je vais faire "roll", 280 00:19:05,900 --> 00:19:08,770 et je vais lui dire qu'elle doit être absolument comprise 281 00:19:08,937 --> 00:19:11,000 entre "Roll between 1 and 282 00:19:14,230 --> 00:19:15,690 h maxValue. Voilà. 283 00:19:24,080 --> 00:19:26,000 Donc si je fais ça, ok ça marche. 284 00:19:28,120 --> 00:19:30,870 Ce n'est pas très statistique, donc là on pourrait faire 285 00:19:31,037 --> 00:19:35,800 quelque chose du style: 1 000 timeRepeat. 286 00:19:36,000 --> 00:19:38,560 Ok. Et là, 287 00:19:42,220 --> 00:19:46,680 on a nos 1 000 tests. 288 00:19:47,740 --> 00:19:49,330 Donc là, on va sauver maintenant, c'est très bien. 289 00:19:49,497 --> 00:19:52,440 On va encore sauver, "save" added maxValue 290 00:19:54,610 --> 00:19:56,030 and roll with tests. 291 00:20:03,940 --> 00:20:08,380 Donc maintenant, ce qu'on va faire, on est presque au 292 00:20:08,547 --> 00:20:11,070 bout de nos peines, nous ce qu'on voudrait exprimer c'est 293 00:20:11,237 --> 00:20:13,680 qu'au lieu d'avoir "die faces 6", 294 00:20:16,290 --> 00:20:17,670 moi j'aimerais avoir "1 D6". 295 00:20:17,837 --> 00:20:18,470 Et 296 00:20:25,510 --> 00:20:27,630 ce qu'on voit là finalement c'est que ça serait envoyer 297 00:20:27,797 --> 00:20:31,050 le message dé 6 à un petit entier. 298 00:20:31,770 --> 00:20:34,540 Donc on va aller regarder la classe Integer. 299 00:20:34,707 --> 00:20:39,620 Et ce qu'on va faire, on 300 00:20:39,787 --> 00:20:43,660 va définir une extension de classe. 301 00:20:43,827 --> 00:20:45,010 Qu'est-ce que c'est qu'une extension de classe? 302 00:20:45,890 --> 00:20:50,350 Je vais packager mes méthodes avec le même nom que le package. 303 00:20:50,800 --> 00:20:53,360 Donc vous allez voir, qu'est-ce que je fais, j'ajoute un 304 00:20:53,527 --> 00:20:57,420 protocole, je lui mets *, il doit commencer par *dice qui 305 00:20:57,587 --> 00:21:00,780 est le nom de mon package, automatiquement c'est grisé et 306 00:21:00,947 --> 00:21:02,900 là ça veut dire que cette méthode-là sera packagée en 307 00:21:03,067 --> 00:21:04,460 même temps que ce package. Donc on va le faire. 308 00:21:04,900 --> 00:21:08,950 Donc imaginons qu'on fasse qu'est-ce que c'est que D6? 309 00:21:10,000 --> 00:21:13,570 Un D6. Il faut réfléchir un petit peu. 310 00:21:21,050 --> 00:21:24,250 On va d'abord créer une poignée parce que ça pourrait 311 00:21:24,417 --> 00:21:25,510 être deux D 6 finalement. 312 00:21:27,210 --> 00:21:31,930 Donc "handle", on va faire "diceHandle 313 00:21:32,097 --> 00:21:32,730 new", 314 00:21:37,120 --> 00:21:38,280 très bien donc j'ai créé mon truc. 315 00:21:39,380 --> 00:21:42,110 Maintenant pour chaque receveur, donc je vais faire 316 00:21:42,277 --> 00:21:45,430 "self", ça c'est mon entier, "timesRepeat". 317 00:21:46,370 --> 00:21:50,140 Décidément, on l'aura beaucoup utilisé le timesRepeat, c'est rare. 318 00:21:51,900 --> 00:21:54,120 "TimesRepeat handle addDie", de quoi 319 00:21:56,790 --> 00:22:01,150 ? De "die faces". Et là, 320 00:22:02,000 --> 00:22:03,720 on le sait, c'est 6. 321 00:22:05,890 --> 00:22:09,830 Et bien sûr ce serait peut-être bien que je rende la poignée. 322 00:22:11,220 --> 00:22:12,330 Donc est-ce que ça marche ? 323 00:22:12,497 --> 00:22:14,950 Donc on va tester comme ça et puis après on va écrire un test. 324 00:22:15,470 --> 00:22:20,380 Mais si je fais 2 D 6 Inspect, voyez j'ai 325 00:22:20,547 --> 00:22:22,390 bien 2 D 6. Donc, c'est sympa. 326 00:22:23,190 --> 00:22:24,290 Donc écrivons un test. 327 00:22:25,640 --> 00:22:27,140 On va les catégoriser ces tests quand même. 328 00:22:28,150 --> 00:22:29,330 Donc on va faire "testNewSyntax". 329 00:22:33,950 --> 00:22:36,420 Alors là, pour le moment, on n'a que D6, après on va généraliser. 330 00:22:38,010 --> 00:22:40,000 Mais donc nous ce qu'on veut faire, c'est exactement la 331 00:22:40,167 --> 00:22:44,440 même chose que ça, donc on va avoir une handle, on va dire 2 D 6. 332 00:22:47,020 --> 00:22:49,620 Et là, ce qu'on va faire, on va faire "selfAssert". 333 00:22:53,310 --> 00:22:54,430 Donc qu'est-ce qu'on pourrait tester? 334 00:22:54,597 --> 00:22:56,470 Que diceNumber equals 2, 335 00:23:02,880 --> 00:23:05,420 par exemple. Alors vous avez vu, des fois j'utilise 336 00:23:05,587 --> 00:23:09,160 diceHandle, j'aurais pu aussi utiliser = 2 ici. 337 00:23:09,810 --> 00:23:12,080 En général, c'est plus sympa d'utiliser assert equal 338 00:23:12,540 --> 00:23:14,310 parce que comme ça, quand il y a une erreur, le système 339 00:23:14,477 --> 00:23:18,020 me dit: j'ai reçu ça et j'ai eu cette valeur à la place. 340 00:23:18,630 --> 00:23:22,910 Si je mets =, il va dire: j'ai eu une expression fausse. 341 00:23:23,680 --> 00:23:26,480 Donc là, pour l'utilisateur terminal, qui est vous en 342 00:23:26,647 --> 00:23:28,850 fait, en tant que développeur, c'est plus sympa d'utiliser 343 00:23:30,580 --> 00:23:33,340 assert equals parce qu'il va dire: j'ai reçu 3 alors que 344 00:23:33,560 --> 00:23:34,680 j'attendais 2, par exemple. 345 00:23:35,860 --> 00:23:37,060 Donc là, si je fais ça. 346 00:23:37,510 --> 00:23:38,780 Voilà, oui ça marche. 347 00:23:39,320 --> 00:23:41,940 Alors est-ce qu'on pourrait avoir une version un peu plus 348 00:23:42,107 --> 00:23:43,090 intelligente du test ? 349 00:23:43,257 --> 00:23:44,240 Pour le moment, ça nous convient. 350 00:23:44,860 --> 00:23:46,640 Ce qu'on va faire et donc là, vous voyez maintenant dans 351 00:23:46,807 --> 00:23:50,200 le package, j'ai une extension qui est D6. 352 00:23:50,690 --> 00:23:55,480 Donc on va généraliser ça avec "a number until", a 353 00:23:56,120 --> 00:23:57,550 number of faces. 354 00:24:01,360 --> 00:24:03,870 Et donc "a number of faces", on va le mettre ici. 355 00:24:05,200 --> 00:24:08,000 Et donc on va récrire D6, parce que ce serait quand même plus sympa D6. 356 00:24:08,137 --> 00:24:12,580 On va l'écrire comme ça D6, on va 357 00:24:12,747 --> 00:24:16,660 faire "^ self D6". 358 00:24:19,050 --> 00:24:20,750 Donc on va faire tous les autres, il n'y a pas de raison. 359 00:24:20,917 --> 00:24:24,370 On va faire 4, 360 00:24:26,020 --> 00:24:30,870 2. C'est plutôt une pièce qu'un dé mais 2, 361 00:24:31,220 --> 00:24:35,640 10 et 20. 362 00:24:36,440 --> 00:24:37,570 Vous avez compris le principe. 363 00:24:41,540 --> 00:24:45,930 Donc faisons tourner nos tests, puisque on a changé d'implémentation 364 00:24:47,010 --> 00:24:49,370 2 D6, donc ça veut dire que ça marche. 365 00:24:49,830 --> 00:24:50,690 Donc, on va sauver. 366 00:24:59,670 --> 00:25:03,320 Donc maintenant que nous reste-t-il à faire? 367 00:25:03,680 --> 00:25:08,030 En fait, il nous reste à pouvoir additionner des poignées. 368 00:25:09,300 --> 00:25:11,600 Donc qu'est-ce que j'ai envie d'avoir comme test? 369 00:25:11,767 --> 00:25:14,640 J'ai envie de m'assurer que si je fais, par exemple, 370 00:25:18,710 --> 00:25:23,240 "addingHandles", j'ai envie de m' 371 00:25:23,407 --> 00:25:25,590 assurer que si, en plus je peux utiliser une nouvelle syntaxe. 372 00:25:25,757 --> 00:25:26,440 Donc là, c'est sympa. 373 00:25:26,960 --> 00:25:28,940 Ce que j'ai envie de faire, j'ai envie de faire que si je 374 00:25:29,107 --> 00:25:33,820 fais 2 D 20 + 3 D5 375 00:25:34,000 --> 00:25:38,570 D 6 tant qu'à faire, on ne va pas commencer à compliquer 376 00:25:38,737 --> 00:25:42,050 les choses. Je dois avoir combien ? 377 00:25:43,160 --> 00:25:46,770 diceNumber doit être égal à 5. 378 00:25:48,180 --> 00:25:52,270 Donc là ce que vous voyez, c'est qu'on va devoir définir l'opérateur +. 379 00:25:52,870 --> 00:25:55,520 Donc dans Pharo, + ce n'est pas un opérateur, c'est juste un message. 380 00:25:55,687 --> 00:25:59,230 Donc on va définir un message sur la classe poignée de dé. 381 00:26:00,530 --> 00:26:02,850 Donc on va mettre plus. 382 00:26:04,650 --> 00:26:05,520 Alors "adiceHandle". 383 00:26:07,530 --> 00:26:09,410 Donc maintenant la question qu'on peut se poser c'est: 384 00:26:09,577 --> 00:26:11,770 est-ce qu'on modifie le receveur ou est-ce qu'on fait une 385 00:26:11,937 --> 00:26:12,840 approche fonctionnelle ? 386 00:26:13,130 --> 00:26:14,740 Moi je préfère faire une approche fonctionnelle dans 387 00:26:14,907 --> 00:26:17,470 laquelle on recrée une nouvelle poignée. 388 00:26:20,180 --> 00:26:23,690 Donc je vais créer une nouvelle poignée, je vais faire 389 00:26:26,060 --> 00:26:27,650 "handle self class new". 390 00:26:29,540 --> 00:26:34,060 Alors là, j'ai évité de mettre diceHandle et il y a une 391 00:26:34,227 --> 00:26:36,360 leçon qui vous expliquera pourquoi plus tard. 392 00:26:36,527 --> 00:26:37,770 Moi je préfère, c'est beaucoup plus proche. 393 00:26:37,937 --> 00:26:39,800 En général, on ne code pas en dur le nom des classes. 394 00:26:40,430 --> 00:26:42,530 Donc vous verrez dans la semaine 7, ou quelque chose 395 00:26:42,697 --> 00:26:44,040 comme ça, il y a toute une explication. 396 00:26:44,740 --> 00:26:49,660 Donc si je fais "self dice do", ce que je vais 397 00:26:49,827 --> 00:26:53,480 faire je vais itérer sur mes dés et je vais les ajouter dans handle. 398 00:26:53,647 --> 00:26:55,610 Donc, je vais faire "handle addDie each", 399 00:26:59,780 --> 00:27:03,660 et je vais faire la même chose… Alors là, je n'ai pas 400 00:27:03,827 --> 00:27:05,720 besoin de self et d'ailleurs, il ne connaît pas le 401 00:27:05,887 --> 00:27:07,420 message, c'est ce qu'il était en train de me dire, et ça 402 00:27:07,587 --> 00:27:09,370 me fait remarquer qu'effectivement je ne l'ai pas défini 403 00:27:09,820 --> 00:27:12,790 et que ça n'a pas marché pour "diceHandle", mais ce 404 00:27:15,630 --> 00:27:20,480 n'est pas grave, compilons d'abord et on fixera après. 405 00:27:21,230 --> 00:27:22,450 Donc là, qu'est-ce que ça veut dire ? 406 00:27:22,617 --> 00:27:24,790 Ça veut dire qu'il me manque un accesseur qui est dice. 407 00:27:25,280 --> 00:27:28,770 Donc on va ajouter dice ici, dice qui me rend la 408 00:27:28,937 --> 00:27:32,060 collection de mes dés. 409 00:27:32,227 --> 00:27:35,280 Voilà. Donc maintenant je vais tester si mon test passe. 410 00:27:35,700 --> 00:27:38,690 Mon test passe, donc c'est super, ça veut dire que j'ai 411 00:27:38,857 --> 00:27:43,610 pratiquement fini, je vais sauver, "with handles 412 00:27:44,810 --> 00:27:46,690 additions". Ok, très bien. 413 00:27:49,820 --> 00:27:53,770 Donc voilà, ça veut dire que maintenant on peut écrire 414 00:27:57,300 --> 00:28:02,210 2 D 4 et qu'on 415 00:28:02,377 --> 00:28:06,380 puisse faire "Roll", et que ça nous rende un nombre. 416 00:28:08,000 --> 00:28:10,400 Donc maintenant, vous êtes prêts à jouer à "Donjons et Dragons". 417 00:28:11,200 --> 00:28:15,870 Donc ce qu'il faut voir, finalement c'est que on a défini 418 00:28:17,570 --> 00:28:19,480 nos méthodes, on a défini nos tests, on les a fait 419 00:28:19,647 --> 00:28:23,010 tourner, on a été étendre une classe du système, la 420 00:28:23,177 --> 00:28:27,000 classe "entiers", avec des extensions qui sont liées à 421 00:28:27,167 --> 00:28:30,590 notre package, qui ne seront visibles que quand notre package sera chargé. 422 00:28:32,290 --> 00:28:34,580 On a aussi fait de la surcharge d'opérateurs, mais en 423 00:28:34,747 --> 00:28:39,320 fait on a défini juste un nouveau message plus, parce que 424 00:28:39,487 --> 00:28:43,600 dans Pharo l'addition est juste un message comme les 425 00:28:43,767 --> 00:28:48,160 autres, ce qui nous a permis d'exprimer relativement facilement un joli DSL. 426 00:28:49,900 --> 00:28:50,850 Donc à vous de jouer !