1 00:00:00,510 --> 00:00:03,470 Bonjour à tous. Dans cette séquence, nous allons nous 2 00:00:03,670 --> 00:00:05,790 arrêter un petit peu sur les méthodes de classe. 3 00:00:06,350 --> 00:00:10,550 Nous avons vu que les méthodes de classe sont des 4 00:00:10,790 --> 00:00:12,950 méthodes normales, comme les autres. 5 00:00:14,000 --> 00:00:17,220 En général, elles servent à créer de nouvelles instances 6 00:00:18,000 --> 00:00:19,760 mais on peut s'en servir aussi pour d'autres choses. 7 00:00:20,310 --> 00:00:23,800 On va voir 2 exemples à quoi des méthodes de classe peuvent servir. 8 00:00:24,920 --> 00:00:28,840 Imaginons qu'on souhaite écrire un programme qui prend ce 9 00:00:29,040 --> 00:00:33,040 texte-là en paramètre et qui crée 10 00:00:34,020 --> 00:00:38,910 une structure. L'idée c'est que si une ligne commence par 11 00:00:39,110 --> 00:00:41,620 un point d'exclamation, on considère que c'est un titre. 12 00:00:42,280 --> 00:00:45,460 Si une ligne commence par un tiret, on considère que c'est 13 00:00:45,950 --> 00:00:48,010 un item dans une liste. 14 00:00:49,180 --> 00:00:51,920 Si ça commence par tiret tiret ou plus de tirets, on 15 00:00:52,120 --> 00:00:54,490 considère que c'est un sous-élément d'une liste. 16 00:00:55,750 --> 00:00:57,720 Autrement on considère que c'est un paragraphe. 17 00:00:58,620 --> 00:01:02,820 On souhaite écrire un programme qui prend ça en entrée et 18 00:01:03,070 --> 00:01:06,520 qui instancie les classes que vous voyez là, donc les 19 00:01:06,720 --> 00:01:07,760 sous-classes de document et item. 20 00:01:10,110 --> 00:01:13,670 On souhaite aussi, dans cette conception, que chaque 21 00:01:13,870 --> 00:01:16,500 sous-classe document et item soient responsables de 22 00:01:16,700 --> 00:01:19,810 parser les lignes et de décider si elles peuvent parser 23 00:01:20,010 --> 00:01:23,050 ou pas une ligne donnée. Donc, si je regarde la méthode 24 00:01:23,400 --> 00:01:28,310 can parse ici, on lui donne une ligne de texte. 25 00:01:28,580 --> 00:01:30,610 Si cette ligne commence par un point d'exclamation, la 26 00:01:30,810 --> 00:01:32,700 méthode can parse doit retourner vraie parce qu'on se 27 00:01:32,900 --> 00:01:34,830 trouve dans la classe section title. 28 00:01:36,470 --> 00:01:39,620 Dans la classe liste item, la méthode can parse doit 29 00:01:39,820 --> 00:01:42,470 retourner vraie si la ligne commence par un tiret, si la 30 00:01:42,670 --> 00:01:44,170 ligne passée en paramètre commence par un tiret. 31 00:01:44,840 --> 00:01:47,000 Et la méthode can parse, qui est ici, nous retournera 32 00:01:47,200 --> 00:01:49,330 systématiquement vraie. 33 00:01:49,530 --> 00:01:53,150 L'idée c'est d'écrire un algorithme qui va regarder les 34 00:01:53,350 --> 00:01:56,420 classes une par une, et dès qu'il y en a une qui retourne 35 00:01:56,620 --> 00:01:59,920 can parse pour une ligne donnée, on va utiliser cette 36 00:02:00,120 --> 00:02:03,220 classe-là pour en faire une nouvelle instance par rapport à cette ligne. 37 00:02:04,580 --> 00:02:06,750 Donc, ça c'est le but de la méthode can parse et le but 38 00:02:06,950 --> 00:02:10,130 de la méthode new from line, ça prend aussi une ligne en 39 00:02:10,330 --> 00:02:13,440 paramètres, une ligne de texte en paramètres sauf que ça 40 00:02:13,640 --> 00:02:16,010 va retourner une instance de la classe dans laquelle ça 41 00:02:16,210 --> 00:02:18,470 vient d'être implémenté. 42 00:02:18,670 --> 00:02:21,920 Donc, si j'envoie le message "New from line" à la classe 43 00:02:22,120 --> 00:02:24,920 section title avec une chaîne de caractères qui commence 44 00:02:25,120 --> 00:02:29,170 par un point d'exclamation, la méthode new from line va 45 00:02:29,370 --> 00:02:31,000 retourner une instance de la classe section title. 46 00:02:32,410 --> 00:02:33,550 Alors, comment ça se passe ? 47 00:02:34,000 --> 00:02:36,300 C'est la classe parser qui va être responsable de faire 48 00:02:36,500 --> 00:02:38,820 ce travail-là et de chercher parmi les sous-classes de 49 00:02:39,020 --> 00:02:41,360 document item quelle est celle qui va être responsable d'une 50 00:02:41,560 --> 00:02:42,320 ligne en particulier. 51 00:02:42,890 --> 00:02:45,750 La classe parser possède une méthode document classes 52 00:02:45,950 --> 00:02:50,790 dont la mission est de retourner la 53 00:02:51,000 --> 00:02:53,370 liste des sous-classes de document item. 54 00:02:53,860 --> 00:02:56,100 Donc, ça va retourner une collection qui contient cette 55 00:02:56,300 --> 00:02:57,060 classe-là, cette classe-là et cette classe-là. 56 00:02:58,710 --> 00:03:01,420 Pour ce faire, on envoie le message "All sup classes" à "Document item". 57 00:03:01,620 --> 00:03:04,440 "All sup classes", c'est une méthode qui existe déjà dans 58 00:03:04,640 --> 00:03:06,750 le système Pharo, qui retourne la liste des sous-classes 59 00:03:07,750 --> 00:03:08,510 d'une classe donnée. 60 00:03:09,920 --> 00:03:13,280 Là, en faisant ça, j'obtiens directement une collection 61 00:03:13,480 --> 00:03:14,240 qui contient section title, list item et text. 62 00:03:14,440 --> 00:03:19,090 Cette collection-la, je veux la 63 00:03:19,290 --> 00:03:20,420 trier par priorité. 64 00:03:20,930 --> 00:03:24,210 L'idée c'est que la classe text doit arriver à la fin 65 00:03:24,410 --> 00:03:27,100 parce que sa méthode can parse retourne toujours vraie. 66 00:03:28,200 --> 00:03:31,680 Donc, la classe text peut parser n'importe quelle ligne. 67 00:03:33,050 --> 00:03:35,570 On testera ça après avoir testé les autres. 68 00:03:36,240 --> 00:03:39,290 On a cette notion de priorité, ici. 69 00:03:41,250 --> 00:03:44,910 On voit que beaucoup de méthodes sont soulignées. 70 00:03:45,320 --> 00:03:50,080 Si je souligne les méthodes ici, ça indique que ce sont 71 00:03:50,280 --> 00:03:51,240 des méthodes de classe. 72 00:03:52,720 --> 00:03:56,200 Pour exécuter ces méthodes-là, il faut envoyer des messages aux classes. 73 00:03:56,570 --> 00:04:00,350 Il faut que j'envoie le message "Can parse" à la classe 74 00:04:00,550 --> 00:04:04,470 section title pour savoir si la classe section title peut 75 00:04:04,670 --> 00:04:05,470 parser une ligne donnée. 76 00:04:08,290 --> 00:04:12,690 La méthode parse de la classe parser prend une ligne en paramètres. 77 00:04:12,890 --> 00:04:15,080 On va regarder dans l'ensemble des sous-classes de 78 00:04:15,280 --> 00:04:17,820 document item s'il y a une classe qui est capable de 79 00:04:18,020 --> 00:04:21,240 parser cette ligne-là, et si c'est le cas, va créer une 80 00:04:21,440 --> 00:04:25,560 instance de cette classe. Le message détecte envoyer une 81 00:04:25,760 --> 00:04:29,350 collection permet de trouver un 82 00:04:30,740 --> 00:04:33,070 élément d'une collection parmi N suivant un prédicat. 83 00:04:33,270 --> 00:04:37,520 Maintenant, on va s'intéresser à un autre exemple d'utilisation 84 00:04:37,720 --> 00:04:38,570 de méthodes de classe. 85 00:04:39,360 --> 00:04:43,730 On va s'intéresser à la lecture de paramètres de lignes de commande. 86 00:04:44,530 --> 00:04:47,690 Donc, l'idée ici, c'est qu'on veut un programme qui s'il 87 00:04:47,890 --> 00:04:50,580 reçoit des paramètres, qui va regarder quels sont les 88 00:04:50,780 --> 00:04:53,190 paramètres et faire quelque chose différemment en fonction des paramètres. 89 00:04:53,430 --> 00:04:56,790 Le premier paramètre indique l'action à exécuter. 90 00:04:57,730 --> 00:04:59,510 Et ce qu'on va faire dans la conception de ce 91 00:04:59,710 --> 00:05:02,010 programme-là, c'est qu'on va avoir une classe par type d'action. 92 00:05:02,690 --> 00:05:07,410 L'action eval va être représentée par une classe, eval command line handler. 93 00:05:07,610 --> 00:05:11,940 Quelle est l'action effectuée lorsque le 94 00:05:12,660 --> 00:05:14,750 paramètre eval est présent ? 95 00:05:14,950 --> 00:05:17,870 Ce qu'on va faire c'est qu'on va exécuter ce code-là, on 96 00:05:18,070 --> 00:05:20,060 va interpréter cette chaîne de caractères-là comme du 97 00:05:20,260 --> 00:05:23,570 code Pharo et retourner le résultat de ces expressions. 98 00:05:24,820 --> 00:05:27,250 Le nombre qui est ici est le résultat de l'expression theme factorial. 99 00:05:27,940 --> 00:05:30,720 Comment est-ce qu'on implémentent ça? 100 00:05:30,920 --> 00:05:35,000 On a une classe command line handler, une classe Evaluate 101 00:05:35,200 --> 00:05:38,050 command handler qui est une sous-classe dont le but va 102 00:05:38,250 --> 00:05:41,310 être de traiter le paramètre eval. 103 00:05:41,510 --> 00:05:44,300 Donc si le paramètre eval est envoyé comme premier 104 00:05:44,500 --> 00:05:47,200 paramètre en ligne de commande, c'est cette classe-là qui doit travailler. 105 00:05:48,730 --> 00:05:52,310 Donc, la méthode is responsible for doit retourner Vraie 106 00:05:53,260 --> 00:05:57,680 si une sous-classe est capable de prendre en compte la 107 00:05:57,880 --> 00:06:02,350 ligne de commande. On voit, en-dessous, 108 00:06:03,320 --> 00:06:07,410 exactement le même mécanisme qu'on a vu dans l'exemple précédent. 109 00:06:08,040 --> 00:06:11,450 Là encore, on utilise des méthodes de classe et on envoie 110 00:06:11,650 --> 00:06:16,510 des messages à des classes pour faire autre chose que créer des instances. 111 00:06:17,620 --> 00:06:21,700 Donc on a vu 2 utilisations possibles des méthodes de classes. 112 00:06:22,710 --> 00:06:24,680 Les méthodes de classe sont la plupart du temps utilisées 113 00:06:24,880 --> 00:06:27,170 pour créer de nouvelles instances, mais elles peuvent 114 00:06:27,370 --> 00:06:29,280 aussi être utilisées dans d'autres cas.