1 00:00:01,190 --> 00:00:03,000 Dans cette vidéo, nous allons vous montrer comment on va 2 00:00:03,167 --> 00:00:05,220 créer un package, une classe, décrire des tests. 3 00:00:05,770 --> 00:00:09,100 La première chose à faire déjà, c'est commencer à ouvrir le système Browser. 4 00:00:09,530 --> 00:00:11,710 Le système Browser, ça nous permet de browser des packages. 5 00:00:11,877 --> 00:00:12,590 Là, il y a des packages. 6 00:00:14,260 --> 00:00:16,600 La première chose à faire, c'est qu'on va créer un package. 7 00:00:16,830 --> 00:00:21,790 On va faire "Add package" "MyCounter". 8 00:00:22,280 --> 00:00:23,640 Comme il y a beaucoup de packages et qu'on ne veut pas 9 00:00:23,807 --> 00:00:27,050 les voir, c'est une bonne chose de filtrer tout ça. 10 00:00:27,950 --> 00:00:30,000 On a notre package "MyCounter". 11 00:00:30,157 --> 00:00:32,740 Et là, on va définir une classe qu'on va appeler 12 00:00:32,907 --> 00:00:37,550 "Counter" et elle a une variable d'instance count. 13 00:00:38,140 --> 00:00:42,290 Le petit icône orange nous indique que le code n'est pas sauvé. 14 00:00:42,610 --> 00:00:45,690 Là, on va compiler le code avec la fonction "Accept". 15 00:00:46,290 --> 00:00:49,570 Et là, j'ai la classe "Counter" qui a été compilée. 16 00:00:49,830 --> 00:00:51,920 Le système regarde un petit peu et nous dit qu'il y a des 17 00:00:53,200 --> 00:00:56,290 commentaires de qualité, on verra ça plus tard pour le moment on s'en fiche. 18 00:01:00,790 --> 00:01:03,690 Il y a un point d'exclamation rouge parce qu'on n'a pas 19 00:01:03,857 --> 00:01:05,280 écrit de commentaire. Donc, on va écrire un premier 20 00:01:05,447 --> 00:01:12,330 commentaire : 21 00:01:12,497 --> 00:01:13,880 "I'ma simple counter". 22 00:01:45,790 --> 00:01:49,230 On va mettre un petit exemple pour que lecteur comprenne 23 00:01:49,397 --> 00:01:53,050 comment ça va fonctionner: Counter new, 24 00:01:55,750 --> 00:02:00,120 Counter increment, Counter 25 00:02:02,920 --> 00:02:07,500 count. Là, ça devrait être égal à 2. 26 00:02:09,880 --> 00:02:14,180 Encore une fois, le texte n'est pas sauvé et on va le compiler. 27 00:02:14,347 --> 00:02:16,540 Il est sauvegardé. On n'a plus de counter. 28 00:02:16,850 --> 00:02:20,050 Maintenant, on va définir des accesseurs. 29 00:02:21,940 --> 00:02:24,770 Les accesseurs, on les met généralement dans le protocole Accessing. 30 00:02:26,640 --> 00:02:31,540 On va faire "count rend count". 31 00:02:33,160 --> 00:02:35,720 Et de la même manière, on va faire 32 00:02:38,220 --> 00:02:40,740 aNumber, on va faire un Setter. 33 00:02:46,190 --> 00:02:48,380 Vous avez vu, j'ai modifié la méthode count. 34 00:02:48,547 --> 00:02:50,770 Là, vous pouvez penser qu'elle est perdue mais non parce 35 00:02:50,937 --> 00:02:54,120 qu'à chaque fois que je change une méthode avec un nom 36 00:02:54,287 --> 00:02:55,320 différent, il en crée une nouvelle. 37 00:02:55,487 --> 00:02:58,530 Là, je compile une nouvelle méthode, j'ai count. 38 00:03:01,160 --> 00:03:05,190 Maintenant, on peut vraiment tester et faire notre premier petit programme. 39 00:03:07,360 --> 00:03:08,000 Là, je prends Playground. 40 00:03:09,910 --> 00:03:14,700 Je vais créer un counter. On se met sur une autre 41 00:03:14,867 --> 00:03:19,730 ligne. Je vais lui mettre une valeur 42 00:03:21,000 --> 00:03:25,420 : C count 7. Si je demande sa valeur, qu'est-ce que ça 43 00:03:25,587 --> 00:03:29,600 doit me rendre ? Ça va me rendre 7. 44 00:03:32,400 --> 00:03:34,390 Maintenant ce qu'on voudrait faire, c'est vraiment écrire 45 00:03:34,557 --> 00:03:38,460 ça sous forme d'un test parce que là, on ne peut pas l'exécuter 46 00:03:39,040 --> 00:03:40,350 et on aimerait l'exécuter automatiquement. 47 00:03:40,630 --> 00:03:42,910 On va créer une classe de test. 48 00:03:43,077 --> 00:03:44,820 Comment on crée une classe de test dans Pharo? 49 00:03:45,000 --> 00:03:48,450 On change la super classe, on dit que ça hérite de 50 00:03:50,220 --> 00:03:55,000 TestCase et on va définir une classe de 51 00:03:55,167 --> 00:03:56,140 test qu'on appelle CounterTest. 52 00:03:56,910 --> 00:03:59,860 Maintenant ce que je vais faire je vais la compiler. 53 00:04:00,660 --> 00:04:03,700 J'ai une nouvelle classe CounterTest dans mon système. 54 00:04:04,570 --> 00:04:08,410 Je vais définir une nouvelle méthode, je vais ajouter un 55 00:04:08,577 --> 00:04:10,030 protocole qui s'appelle tests. 56 00:04:11,620 --> 00:04:14,300 Là, je vais pouvoir définir une nouvelle méthode. 57 00:04:14,467 --> 00:04:17,940 Les méthodes de tests doivent commencer par "test" 58 00:04:18,107 --> 00:04:21,690 toujours et être dans une classe qui hérite de TestCase. 59 00:04:22,380 --> 00:04:23,580 On va l'appeler "testCounterisSetAndRead" 60 00:04:31,170 --> 00:04:35,590 par exemple. On l'a pratiquement notre test, on a déjà 61 00:04:35,757 --> 00:04:36,540 presque tout écrit. 62 00:04:37,620 --> 00:04:40,330 On va l'indenter un peu plus joliment. 63 00:04:40,497 --> 00:04:41,730 Je crée mon counter. 64 00:04:42,580 --> 00:04:45,680 Et maintenant, je vais faire "self assert 65 00:04:49,750 --> 00:04:54,200 equals 7". Cette phrase-là est 66 00:04:54,367 --> 00:04:58,560 exactement équivalente à "self assert C count égale 7". 67 00:05:01,870 --> 00:05:04,640 C'est que c'est plus pratique, quand on fait une erreur 68 00:05:04,807 --> 00:05:08,470 le retour est beaucoup plus intelligent quand on utilise la première forme. 69 00:05:08,637 --> 00:05:10,910 Là, on va compiler. 70 00:05:12,790 --> 00:05:17,690 Maintenant, je vais pouvoir faire exécuter mon test, mon 71 00:05:19,790 --> 00:05:22,440 test est vert. Quand on a un test et qu'il est vert, 72 00:05:22,607 --> 00:05:26,180 c'est un bon moment pour sauver sa production, son code. 73 00:05:26,370 --> 00:05:27,930 Dans Pharo, vous allez pouvoir sauver l'image. 74 00:05:28,097 --> 00:05:30,080 Là, c'est-ce que je fais, je vais sauver l'image mais ce 75 00:05:30,247 --> 00:05:31,320 n'est pas satisfaisant l'image. 76 00:05:32,770 --> 00:05:35,040 Je voudrais vous montrer comment vous allez sauver du 77 00:05:35,207 --> 00:05:36,820 code dans un système de version. 78 00:05:37,070 --> 00:05:39,960 Là, comme je ne sais pas si vous allez avoir accès à 79 00:05:40,127 --> 00:05:44,610 Internet, je vais le faire dans mon cache local. 80 00:05:44,777 --> 00:05:48,860 Vous voyez, j'ai ce dossier-là qui pointe 81 00:05:49,027 --> 00:05:52,930 sur tous les packages, sur lesquels je peux 82 00:05:54,000 --> 00:05:55,360 travailler, que j'ai chargés ou pas. 83 00:05:55,770 --> 00:05:58,490 Là, ce que nous montre le système, c'est que j'ai 84 00:05:58,657 --> 00:06:02,870 plusieurs packages qui ont des modifications qui n'ont pas été sauvegardées. 85 00:06:03,070 --> 00:06:05,060 On s'en fiche des 2 premières, mais nous, on voit que 86 00:06:05,227 --> 00:06:09,160 MyPackage a une étoile. Ça veut dire que j'ai du code 87 00:06:09,327 --> 00:06:10,760 dans l'image qui n'a pas été sauvé. 88 00:06:12,130 --> 00:06:14,020 Là c'est ce que je vais faire, je vais faire Save, je 89 00:06:14,187 --> 00:06:15,230 vais dire voila je choisis le repository. 90 00:06:16,520 --> 00:06:17,320 Je vais faire save. 91 00:06:21,400 --> 00:06:26,180 Là, je vais marquer "first version with accessors and a 92 00:06:27,210 --> 00:06:29,090 green test". Là, 93 00:06:32,640 --> 00:06:35,600 j'accepte. Là, il m'a sauvé un package. 94 00:06:35,800 --> 00:06:36,530 On va aller vérifier. 95 00:06:36,697 --> 00:06:41,370 Je peux ouvrir ce dossier et si je regarde, il contient 96 00:06:42,410 --> 00:06:44,460 plein de packages qui ont été chargés par le système. 97 00:06:44,627 --> 00:06:48,470 Mais en particulier, si je filtre là, je retrouve bien 98 00:06:48,637 --> 00:06:51,130 mon package avec ses versions. 99 00:06:57,620 --> 00:07:00,740 Je vous conseille à chaque fois que vous avez ajouté une 100 00:07:00,907 --> 00:07:03,460 fonctionnalité, c'est ce qu'on va faire systématiquement, de sauvegarder. 101 00:07:06,770 --> 00:07:09,900 Maintenant ce qu'on va faire, on va d'abord définir un 102 00:07:10,067 --> 00:07:12,130 test avant de l'implémenter. 103 00:07:12,410 --> 00:07:14,590 On va écrire un test pour qu'est-ce que c'est que l'incrément 104 00:07:14,757 --> 00:07:19,710 d'un 105 00:07:19,877 --> 00:07:21,200 counter. "TestIncrement" qu'est-ce qu'on aimerait avoir? 106 00:07:21,367 --> 00:07:22,000 On aimerait lui dire "Je 107 00:07:26,330 --> 00:07:27,430 crée un counter, 108 00:07:33,510 --> 00:07:38,400 je vais lui mettre une valeur par défaut, 109 00:07:38,840 --> 00:07:43,410 puis je vais incrémenter 2 fois ce counter. 110 00:07:44,100 --> 00:07:45,310 " Qu'est-ce que je dois vérifier ? 111 00:07:45,477 --> 00:07:48,130 Je dois vérifier que le counter en question 112 00:07:51,150 --> 00:07:51,870 a la bonne valeur. 113 00:07:57,900 --> 00:08:02,800 Je compile. Mon test 114 00:08:03,000 --> 00:08:06,880 est bien rouge puisque je n'ai pas implémenté counter, 115 00:08:07,510 --> 00:08:10,390 les opérations dans compteur incrémentent et décrémentent. 116 00:08:11,520 --> 00:08:12,450 Je vais ajouter "operations increment". 117 00:08:21,660 --> 00:08:22,390 Qu'est-ce qu'on va faire ? 118 00:08:22,557 --> 00:08:26,890 On va faire "self count 2: self count + 119 00:08:27,200 --> 00:08:30,270 1". Si on utilise systématiquement les accesseurs en 120 00:08:30,437 --> 00:08:32,080 interne ou pas, ça dépend, c'est une question de style. 121 00:08:34,510 --> 00:08:37,630 De la même manière vu que c'est très proche, on va 122 00:08:39,710 --> 00:08:40,500 définir "decrement". 123 00:08:42,380 --> 00:08:44,470 Vous voyez que sur increment il y a un test, donc je peux 124 00:08:44,637 --> 00:08:48,190 l'exécuter et mon test est vert. 125 00:08:48,357 --> 00:08:50,370 Donc, j'ai bien 2 tests qui fonctionnent. 126 00:08:50,710 --> 00:08:53,350 Si je vais dans la classe test, tous mes tests sont verts. 127 00:08:53,670 --> 00:08:54,540 Qu'est-ce que je vais faire ? 128 00:08:54,707 --> 00:08:56,790 Je sauvegarde. Je vais faire une nouvelle sauvegarde. 129 00:08:56,957 --> 00:09:00,340 Je vais dire "Adding increment and decrement". 130 00:09:13,110 --> 00:09:17,850 Là maintenant si je regarde, j'ai bien 2 versions 131 00:09:23,250 --> 00:09:23,883 de mes packages. 132 00:09:24,090 --> 00:09:29,020 On va écrire un test pour "decrement" 133 00:09:29,187 --> 00:09:30,100 parce qu'il n'y a pas de raison. 134 00:09:31,700 --> 00:09:36,590 "Decrement", par exemple je 135 00:09:36,757 --> 00:09:40,320 pourrais mettre une valeur à 2 si j'en ai envie et je 136 00:09:40,487 --> 00:09:43,890 décrémente 2 fois. Je dois obtenir 0. 137 00:09:44,057 --> 00:09:48,550 Mon test est vert donc 138 00:09:49,570 --> 00:09:50,203 je vais sauver. 139 00:10:06,490 --> 00:10:10,490 Maintenant ce qu'on aimerait avoir, c'est que si je 140 00:10:10,657 --> 00:10:14,300 regarde et que je fais "Counter new" et que je fais 141 00:10:14,467 --> 00:10:16,910 "Print it", ça m'affiche un counter et je ne sais pas sa 142 00:10:17,077 --> 00:10:19,000 valeur, donc ce n'est pas pratique. 143 00:10:19,360 --> 00:10:22,260 Ce qu'on aimerait c'est modifier ce comportement. 144 00:10:24,130 --> 00:10:26,630 Pour cela ce qu'on va faire on va ajouter une méthode qui 145 00:10:26,797 --> 00:10:29,840 s'appelle "PrintOn", dans le protocole Printing. 146 00:10:31,340 --> 00:10:33,110 Print on, c'est une méthode qui est appelée par le 147 00:10:33,277 --> 00:10:34,530 système à chaque fois que l'on fait PrintStream. 148 00:10:35,760 --> 00:10:36,750 On a comme argument aStream. 149 00:10:38,690 --> 00:10:39,440 Qu'est-ce qu'on va faire ? 150 00:10:40,200 --> 00:10:43,170 On va dire qu'on aimerait avoir un counter. 151 00:10:43,337 --> 00:10:47,460 Là typiquement, j'invoque les fonctions du dessus. 152 00:10:51,740 --> 00:10:54,170 Maintenant ce que je vais faire, j'aimerais 153 00:10:58,530 --> 00:10:59,850 ajouter un petit 154 00:11:04,470 --> 00:11:05,103 texte 155 00:11:17,370 --> 00:11:20,570 par exemple "with value" et puis "self count". 156 00:11:24,150 --> 00:11:27,740 Je fais ça parce que le counter c'est un nombre, donc je 157 00:11:27,907 --> 00:11:32,180 dois obtenir sa représentation textuelle. 158 00:11:34,260 --> 00:11:35,290 Je vais faire "cr". 159 00:11:35,457 --> 00:11:36,260 Je compile. 160 00:11:42,900 --> 00:11:45,550 Le système me dit que je pourrais faire mieux mais bon ce n'est pas grave. 161 00:11:46,040 --> 00:11:47,270 Pour le moment on s'en fiche. 162 00:11:48,590 --> 00:11:49,760 Je peux faire c'est "Counter new". 163 00:11:51,000 --> 00:11:54,740 Je regarde, il me dit que c'est un counter avec comme valeur nil. 164 00:11:54,907 --> 00:11:58,020 C'est normal puisque je ne l'ai pas encore initialisé. 165 00:12:01,260 --> 00:12:04,960 Maintenant, on va ajouter un support à l'initialisation. 166 00:12:07,590 --> 00:12:09,780 On va commencer par écrire un test et pour faire cela 167 00:12:14,050 --> 00:12:18,020 je vais dire, je veux que les valeurs à la création 168 00:12:19,770 --> 00:12:23,180 soient 0. 169 00:12:24,950 --> 00:12:25,760 Qu'est-ce que je vais faire ? 170 00:12:25,927 --> 00:12:27,280 Je vais faire "self assert". 171 00:12:27,447 --> 00:12:30,840 Je vais m'assurer que "Counter new 172 00:12:33,030 --> 00:12:36,210 count = 0". Là, 173 00:12:38,020 --> 00:12:39,010 qu'est-ce qu'on voit ? 174 00:12:39,177 --> 00:12:41,090 Mon test est faux. Pourquoi ? 175 00:12:41,257 --> 00:12:45,140 Parce que si je fais ça, j'obtiens nil. 176 00:12:47,140 --> 00:12:49,820 Vu que c'est une classe et que je n'accède pas à des 177 00:12:50,000 --> 00:12:53,560 variables d'instance de la classe CounterTest, je peux 178 00:12:53,727 --> 00:12:57,110 sélectionner l'expression et l'exécuter directement. 179 00:13:00,280 --> 00:13:03,170 Maintenant, une fois que j'ai ce test qui ne passe pas, 180 00:13:03,680 --> 00:13:04,420 qu'est-ce que je vais faire ? 181 00:13:04,587 --> 00:13:09,110 Je vais ajouter une méthode initialize dans le protocole initialisation. 182 00:13:16,900 --> 00:13:21,730 Et là qu'est-ce que je vais faire ? 183 00:13:22,160 --> 00:13:25,760 Je vais faire "super initialize", au cas où, et je vais 184 00:13:25,927 --> 00:13:27,730 dire "count 2 points = 0". 185 00:13:27,897 --> 00:13:31,550 Cette méthode-là est invoquée à chaque fois que j'ajoute la méthode "new". 186 00:13:32,330 --> 00:13:35,700 Maintenant je peux regarder avec mes tests, c'est vert. 187 00:13:35,867 --> 00:13:40,070 De la même manière, si je faisais "count", j'obtiens bien 0. 188 00:13:41,010 --> 00:13:45,320 Encore une fois, là on va sauvegarder: ""added printOn" 189 00:13:45,487 --> 00:13:47,490 "added initialize + tests". 190 00:14:04,000 --> 00:14:06,270 Donc ce qu'on peut maintenant qui est intéressant c'est 191 00:14:06,437 --> 00:14:09,300 que je peux voir tout mon historique. 192 00:14:09,467 --> 00:14:12,310 Je peux aussi voir et naviguer dans cet historique. 193 00:14:12,520 --> 00:14:16,180 Si je clique sur "version" je peux voir la différence entre 2 systèmes. 194 00:14:17,960 --> 00:14:20,440 Les changements entre la version 3 et la version 4, c'est 195 00:14:20,607 --> 00:14:21,530 "initialize" "printOn" et le Test. 196 00:14:22,000 --> 00:14:24,660 Si je veux la différence entre la version 197 00:14:28,490 --> 00:14:33,360 2 et la version 4, j'ai tous ces 198 00:14:33,527 --> 00:14:34,160 changements. 199 00:14:35,870 --> 00:14:38,220 Maintenant il me reste une chose à faire, j'aimerais bien 200 00:14:38,387 --> 00:14:43,100 changer un petit peu la manière dont les objets sont créés. 201 00:14:43,820 --> 00:14:47,210 Je vais commencer par créer un test pour vous expliciter 202 00:14:47,377 --> 00:14:51,040 ce que j'ai envie d'obtenir. Je vais définir un test 203 00:14:53,040 --> 00:14:56,000 que je vais appeler "AlternateClassCreation". 204 00:14:58,000 --> 00:14:59,500 Qu'est-ce qu'on a envie d'avoir ? 205 00:15:01,000 --> 00:15:03,000 On va dire, moi ce que je veux, je veux garantir quoi... 206 00:15:05,000 --> 00:15:11,000 que Counter withValue: 19 207 00:15:11,500 --> 00:15:13,000 Si je fais increment dessus 208 00:15:15,000 --> 00:15:20,000 et que je demande sa valeur, ça doit me rendre 20, 209 00:15:21,000 --> 00:15:23,000 d'accord. 210 00:15:30,000 --> 00:15:34,000 On va mettre une parenthèse ici, c'est mieux,voilà. 211 00:15:38,000 --> 00:15:42,000 Donc, encore une fois, le test ne passe pas, 212 00:15:44,000 --> 00:15:48,000 et l'assistant me dit : "tu envoies un message qui n'est pas connu". 213 00:15:49,000 --> 00:15:52,000 Ce qu'il faut voir c'est que le message withValue 214 00:15:52,200 --> 00:15:55,000 est envoyé non plus à un objet mais à une classe. 215 00:15:55,500 --> 00:15:58,500 Donc ça veut dire que je vais devoir définir ce message là 216 00:15:58,600 --> 00:15:59,900 sur la classe. Donc je sélectionne la classe. 217 00:16:00,000 --> 00:16:03,000 Maintenant je passe au niveau classe et je vais ajouter 218 00:16:03,200 --> 00:16:10,000 un protocole qui s'appelle instance creation 219 00:16:12,500 --> 00:16:16,400 withValue: aNumber Alors qu'est-ce que je dois faire ? 220 00:16:17,500 --> 00:16:18,400 La première des choses à faire ça va être, 221 00:16:19,000 --> 00:16:21,800 je vais créer un counter, une variable counter, 223 00:16:22,000 --> 00:16:24,500 counter, je le fais lentement hein, 224 00:16:24,600 --> 00:16:26,000 self new Donc je crée un counter 225 00:16:26,100 --> 00:16:29,900 et je vais faire self count: aNumber 226 00:16:30,000 --> 00:16:34,000 et je vais rendre ce counter. 227 00:16:34,100 --> 00:16:35,000 On peut le faire de manière plus compacte 228 00:16:35,100 --> 00:16:38,000 mais pour le moment faisons-le simplement. 229 00:16:38,100 --> 00:16:40,000 Donc je compile ma méthode. 230 00:16:40,100 --> 00:16:43,000 Et maintenant ça veut dire que je peux envoyer des messages. 231 00:16:43,500 --> 00:16:49,000 Et vous avez vu, quand je clique sur ce bouton, 232 00:16:49,100 --> 00:16:52,000 je passe au niveau classe. Donc je passe du niveau classe 233 00:16:52,100 --> 00:16:53,000 au niveau instance. 234 00:16:53,100 --> 00:16:55,000 Donc là j'étais au niveau classe et là je reviens sur 235 00:16:55,100 --> 00:16:57,500 les messages qui sont envoyés à des instances. 236 00:16:58,100 --> 00:17:01,200 Qu'est-ce que ça veut dire ? ça veut dire que si je fais 237 00:17:01,500 --> 00:17:08,900 Counter withValue: 18, qu'est-ce que je vais obtenir ? 238 00:17:09,000 --> 00:17:11,000 Je vais obtenir une instance de la classe counter. 239 00:17:12,500 --> 00:17:15,000 J'obtiens bien un counter avec value 18. 240 00:17:15,100 --> 00:17:18,000 Et là je pourrais le faire decrement. 241 00:17:21,100 --> 00:17:23,000 Et si je rafraichis, j'ai bien 17. 242 00:17:26,100 --> 00:17:28,900 Donc maintenant si je regarde mon test, 243 00:17:29,000 --> 00:17:32,000 tous mes tests passent, donc je vais encore une fois 244 00:17:32,100 --> 00:17:35,000 sauvegarder et j'ai fini. 245 00:17:37,100 --> 00:17:44,000 Added instance creation API and tests. 246 00:17:45,000 --> 00:17:48,000 Done for now.