1 00:00:05,680 --> 00:00:08,000 -Bonjour à tous. Dans ce redo de la semaine 3, 2 00:00:08,320 --> 00:00:11,680 on va s'intéresser à comment écrire un simulateur de dé 3 00:00:12,320 --> 00:00:14,680 et à un langage qui serait capable de comprendre 4 00:00:15,000 --> 00:00:18,640 une expression comme "2 D20 + 1 D4". 5 00:00:18,960 --> 00:00:21,240 On peut croiser ce genre de dés dans des jeux de rôle 6 00:00:21,560 --> 00:00:22,640 comme "Donjons et Dragons", 7 00:00:22,960 --> 00:00:25,520 et on aimerait qu'à partir de ces expressions 8 00:00:25,840 --> 00:00:29,080 sorte le résultat d'un lancer de deux dés à 20 faces, 9 00:00:29,400 --> 00:00:32,560 plus le résultat du lancer d'un dé à quatre faces. 10 00:00:32,880 --> 00:00:36,520 Pour ce faire, on va avoir besoin de créer une classe de dé 11 00:00:36,840 --> 00:00:38,920 et une classe qui représenterait une poignée de dés 12 00:00:39,240 --> 00:00:41,440 pour pouvoir faire des opérations entre eux. 13 00:00:41,760 --> 00:00:44,720 Donc, on va ouvrir le System Browser : Tools, 14 00:00:45,040 --> 00:00:45,960 System Browser. 15 00:00:46,280 --> 00:00:49,800 On va créer notre classe "#Die", sous-classe d'objet, 16 00:00:50,120 --> 00:00:51,920 qui va avoir une variable d'instance 17 00:00:52,240 --> 00:00:55,200 qui s'appellera "faces", qui correspondra au nombre de faces, 18 00:00:55,520 --> 00:00:57,600 et on va mettre tout ça dans le package "Dice". 19 00:00:57,920 --> 00:00:59,480 On peut sauvegarder avec Cmd+S. 20 00:00:59,800 --> 00:01:01,120 Notre dé est créé. 21 00:01:01,440 --> 00:01:04,440 On va tout de suite lui mettre une méthode d'initialisation 22 00:01:04,760 --> 00:01:06,160 qu'on va appeler "initialize". 23 00:01:06,480 --> 00:01:09,800 On n'oublie pas d'appeler les méthodes d'initialisation 24 00:01:10,120 --> 00:01:12,280 des super classes avec "super initialize", 25 00:01:12,600 --> 00:01:15,400 et on va dire que le nombre de faces par défaut pour notre dé, 26 00:01:15,720 --> 00:01:16,520 ce sera six. 27 00:01:16,840 --> 00:01:17,840 On sauvegarde ça. 28 00:01:18,160 --> 00:01:22,000 On va tout de suite tester ce comportement, 29 00:01:22,320 --> 00:01:24,760 donc on va créer notre classe de test. 30 00:01:25,080 --> 00:01:27,920 Déjà, je vous enlève les autres packages. 31 00:01:28,240 --> 00:01:31,520 On va créer notre classe de test qu'on va appeler "DieTest", 32 00:01:31,880 --> 00:01:33,960 qui est une sous-classe de "TestCase", cette fois, 33 00:01:34,280 --> 00:01:37,720 mais on ne va pas avoir besoin de l'instance "faces". 34 00:01:38,040 --> 00:01:39,560 On peut sauvegarder, Cmd+S. 35 00:01:39,880 --> 00:01:42,440 Notre classe de test est là, on peut écrire notre test : 36 00:01:42,760 --> 00:01:47,080 "testInitializationIsOk". 37 00:01:47,400 --> 00:01:49,640 Très bien. Dans ce test, que va-t-on faire ? 38 00:01:49,960 --> 00:01:52,040 On va mettre une variable temporaire, "d", 39 00:01:52,360 --> 00:01:55,120 qui va être notre dé qu'on va initialiser. 40 00:01:56,040 --> 00:02:01,560 Et on va vérifier que le nombre de faces de notre dé 41 00:02:01,880 --> 00:02:02,960 vaut bien six. 42 00:02:03,480 --> 00:02:05,840 On voit que la méthode "faces" est écrite en rouge, 43 00:02:06,160 --> 00:02:08,200 parce que c'est un accessoire qu'on n'a pas défini, 44 00:02:08,520 --> 00:02:11,200 mais, comme on l'a vu dans le redo de la semaine dernière, 45 00:02:11,520 --> 00:02:13,280 le débogueur peut s'occuper de ça pour nous. 46 00:02:13,600 --> 00:02:16,280 On sauvegarde. Il y a un message d'erreur, mais ce n'est pas grave. 47 00:02:16,600 --> 00:02:19,320 On va lancer notre test en cliquant sur le bouton. 48 00:02:19,640 --> 00:02:20,840 On clique sur Create. 49 00:02:21,160 --> 00:02:23,440 On va le définir dans la classe "#Die" 50 00:02:23,760 --> 00:02:27,440 sous le protocole "accessing". 51 00:02:27,760 --> 00:02:28,720 OK. 52 00:02:29,040 --> 00:02:31,280 Il nous propose déjà un corps de méthode qui est correct. 53 00:02:31,600 --> 00:02:32,840 C'est un simple guetteur. 54 00:02:33,160 --> 00:02:35,480 On clique sur Proceed, notre test est vert. 55 00:02:37,840 --> 00:02:39,200 Je vais juste rafraîchir. Voilà. 56 00:02:39,520 --> 00:02:41,800 On voit que la méthode est maintenant reconnue. 57 00:02:42,120 --> 00:02:43,320 Notre test est vert. 58 00:02:43,840 --> 00:02:46,360 On va pouvoir définir un lancer de dé. 59 00:02:46,680 --> 00:02:48,000 Pour définir un lancer de dé, 60 00:02:48,320 --> 00:02:50,800 on fait ça via une méthode qui s'appelle "roll". 61 00:02:51,120 --> 00:02:53,880 Le comportement de cette méthode, c'est simplement 62 00:02:54,200 --> 00:02:56,520 de renvoyer le nombre de faces "atRandom". 63 00:02:56,840 --> 00:02:59,480 La méthode "atRandom", qu'est-ce qu'elle fait ? 64 00:02:59,800 --> 00:03:01,560 Je vous montre ça dans un Playground. 65 00:03:01,880 --> 00:03:05,000 Donc, si je fais "6 atRandom" 66 00:03:05,320 --> 00:03:07,720 et que j'imprime le résultat, Cmd+P, 67 00:03:08,040 --> 00:03:10,760 on a trois, cinq, six, six, un. 68 00:03:11,080 --> 00:03:15,320 On peut voir que ça va nous rendre, en résultat, 69 00:03:15,640 --> 00:03:16,920 un entier entre un 70 00:03:17,240 --> 00:03:21,040 et le chiffre sur lequel on va envoyer la méthode "atRandom". 71 00:03:21,360 --> 00:03:24,360 C'est exactement le comportement qu'on souhaite pour notre dé. 72 00:03:24,680 --> 00:03:26,400 On peut sauvegarder ça, Cmd+S. 73 00:03:26,720 --> 00:03:29,080 La méthode "roll" est là, on va maintenant la tester. 74 00:03:29,400 --> 00:03:33,400 Pour la tester, on va écrire "testRolling", 75 00:03:33,720 --> 00:03:35,480 et pour tester un comportement aléatoire, 76 00:03:35,800 --> 00:03:40,040 ce qui est bien, c'est d'utiliser la répétition. 77 00:03:40,720 --> 00:03:43,800 Ce qu'on va faire, c'est "10 timesRepeat", 78 00:03:44,120 --> 00:03:47,160 c'est-à-dire qu'il va répéter 10 fois. 79 00:03:47,480 --> 00:03:51,120 Cette méthode "timesRepeat" attend un bloc de code à exécuter. 80 00:03:51,440 --> 00:03:53,600 Donc, on va exécuter 10 fois, 81 00:03:53,920 --> 00:03:58,000 on va vérifier que le résultat de "d roll" 82 00:03:58,320 --> 00:04:02,600 va être compris entre un et six. 83 00:04:02,920 --> 00:04:05,080 Donc, si je recommence, 84 00:04:05,400 --> 00:04:07,680 on va créer notre variable temporaire "d", 85 00:04:08,000 --> 00:04:09,000 qui va être notre dé, 86 00:04:09,320 --> 00:04:12,600 puis on va répéter avec "timesRepeat" 10 fois 87 00:04:12,920 --> 00:04:13,840 ce bloc de code. 88 00:04:14,160 --> 00:04:16,520 Ce bloc de code va vérifier 89 00:04:16,840 --> 00:04:21,240 que le résultat de "d roll" est bien compris entre un et six. 90 00:04:21,560 --> 00:04:22,800 Ça va le répéter 10 fois. 91 00:04:23,120 --> 00:04:24,040 On sauvegarde. 92 00:04:24,360 --> 00:04:26,200 On lance notre test. Notre test passe. 93 00:04:26,520 --> 00:04:27,600 Si vous n'avez pas confiance 94 00:04:27,920 --> 00:04:29,480 dans le nombre de fois que vous répétez, 95 00:04:29,800 --> 00:04:32,200 vous pensez que c'est aléatoire et que ça peut ne pas marcher, 96 00:04:32,520 --> 00:04:34,920 vous pouvez le faire répéter plus de fois, 100 fois. 97 00:04:35,240 --> 00:04:36,280 On relance, ça fonctionne. 98 00:04:36,600 --> 00:04:39,000 C'est un bon moment pour faire notre premier commit. 99 00:04:39,320 --> 00:04:40,640 Pour le faire, on se dirige 100 00:04:40,960 --> 00:04:42,120 dans Iceberg. 101 00:04:42,880 --> 00:04:44,040 On clique sur Add. 102 00:04:44,360 --> 00:04:46,320 On va l'appeler "Dice". 103 00:04:46,640 --> 00:04:48,760 New repository, OK. 104 00:04:50,000 --> 00:04:52,280 Notre repository est là, on double-clique dessus. 105 00:04:52,600 --> 00:04:55,680 On va ajouter le package "Dice". 106 00:04:56,760 --> 00:04:58,080 Add. Très bien. 107 00:04:58,400 --> 00:05:00,840 On voit que les changements n'ont pas été rajoutés. 108 00:05:01,160 --> 00:05:03,400 Donc, on les rajoute, Commit. 109 00:05:03,720 --> 00:05:05,880 C'est le moment de faire une description qui a du sens. 110 00:05:06,200 --> 00:05:07,280 "Initial commit : 111 00:05:07,600 --> 00:05:13,280 Die initialization and rolling with test." 112 00:05:13,600 --> 00:05:15,280 On a toutes les informations. 113 00:05:15,600 --> 00:05:16,440 Commit. 114 00:05:16,760 --> 00:05:22,480 Votre nom et adresse mail de GitHub. 115 00:05:26,760 --> 00:05:29,760 Voilà, le premier commit de notre package est fait. 116 00:05:30,080 --> 00:05:34,480 C'est très bien, on va pouvoir garder Iceberg sous la main, ici. 117 00:05:34,800 --> 00:05:37,040 Et on va ajouter un nouveau test 118 00:05:37,360 --> 00:05:41,360 qu'on va appeler "testCreationIsOk". 119 00:05:41,680 --> 00:05:42,600 Que va faire ce test ? 120 00:05:42,920 --> 00:05:43,960 On aimerait créer un dé 121 00:05:44,280 --> 00:05:46,880 avec une méthode qui s'appellerait "withFaces: 20". 122 00:05:47,240 --> 00:05:49,440 Et on aimerait que... 123 00:05:50,720 --> 00:05:57,240 "self assert: d Faces equals: 20". 124 00:05:57,560 --> 00:06:00,240 On aimerait définir cette méthode de classe "withFaces" 125 00:06:00,560 --> 00:06:02,200 qui serait capable de prendre un entier 126 00:06:02,520 --> 00:06:05,760 et de nous sortir un dé qui a ce nombre de faces en sortie. 127 00:06:06,080 --> 00:06:08,440 On pourrait aller ici et la faire du côté classe, 128 00:06:08,760 --> 00:06:10,520 mais on va le faire dans le débogueur. 129 00:06:10,840 --> 00:06:13,320 Cmd+S, on lance la création, on lance le test 130 00:06:13,640 --> 00:06:15,040 et on va cliquer sur Create. 131 00:06:15,360 --> 00:06:18,040 On va créer notre méthode "withFaces" 132 00:06:18,360 --> 00:06:21,560 du côté classe de dé, et on va la classer 133 00:06:21,880 --> 00:06:25,120 dans le protocole Instance creation. 134 00:06:25,440 --> 00:06:26,200 OK. 135 00:06:26,520 --> 00:06:28,120 Donc, on a notre corps de méthode. 136 00:06:28,440 --> 00:06:31,360 Cette fois-ci, il ne sait pas comment l'interpréter. 137 00:06:31,680 --> 00:06:34,680 Donc, on va créer une variable temporaire 138 00:06:35,000 --> 00:06:36,960 dans laquelle on va mettre un dé, 139 00:06:37,280 --> 00:06:42,160 et ensuite, on va utiliser notre accesseur setter "faces", 140 00:06:42,480 --> 00:06:45,440 qu'on n'a pas encore défini, mais qui va se définir automatiquement. 141 00:06:45,760 --> 00:06:49,920 On va lui passer "anInteger" et on va rendre "d". 142 00:06:50,240 --> 00:06:51,840 Très bien, on peut sauvegarder ça. 143 00:06:52,160 --> 00:06:54,000 Même si le message "faces:" n'est pas compris, 144 00:06:54,320 --> 00:06:56,640 le débogueur va nous aider à le prendre en compte. 145 00:06:56,960 --> 00:06:58,720 On peut cliquer sur Proceed. 146 00:06:59,040 --> 00:07:01,600 Cette fois-ci, c'est "faces:" qui n'a pas été compris 147 00:07:01,920 --> 00:07:03,360 car on ne l'a pas défini. 148 00:07:03,680 --> 00:07:06,080 On clique sur Create, on va aller dans "Die". 149 00:07:06,400 --> 00:07:10,800 On va faire "accessing". OK. 150 00:07:11,480 --> 00:07:13,480 "faces := amInteger". 151 00:07:13,800 --> 00:07:15,720 C'est parfait, c'est le setter qu'il nous faut. 152 00:07:16,040 --> 00:07:16,880 On peut proceed. 153 00:07:17,200 --> 00:07:19,920 La méthode est rouge, mais si on la reset, elle est verte. 154 00:07:20,240 --> 00:07:24,520 On a maintenant nos trois tests qui sont écrits, qui fonctionnent. 155 00:07:24,840 --> 00:07:27,320 On peut les réexécuter. C'est le moment de sauvegarder. 156 00:07:27,640 --> 00:07:29,920 On retourne dans Iceberg, que j'ai gardé ici. 157 00:07:30,240 --> 00:07:34,680 On va dans Uncommitted changes, on double-clique, Commit. 158 00:07:37,680 --> 00:07:42,600 "Class method for instance creation." 159 00:07:43,640 --> 00:07:45,200 Très bien, on peut commit. 160 00:07:45,520 --> 00:07:47,800 On a notre dé qui est plutôt fonctionnel. 161 00:07:48,120 --> 00:07:50,320 On peut lui passer le nombre de faces qu'on veut, 162 00:07:50,640 --> 00:07:54,360 on peut lui demander de rouler et on a les tests associés. 163 00:07:54,680 --> 00:07:56,440 Voilà la fin de cette première partie. 164 00:07:56,760 --> 00:07:59,160 Dans la deuxième, on va s'intéresser à la poignée de dés 165 00:07:59,480 --> 00:08:01,280 et au comportement qu'on veut qu'elle ait.