1 00:00:00,570 --> 00:00:05,000 Bonjour. Bienvenue dans cette quatrième séquence sur l'héritage 2 00:00:05,200 --> 00:00:05,960 et le lookup. 3 00:00:06,440 --> 00:00:08,080 Dans cette séquence nous allons voir ce qui se passe 4 00:00:08,280 --> 00:00:09,950 quand l'algorithme de lookup ne trouve pas une méthode 5 00:00:10,150 --> 00:00:11,290 correspondante à un message. 6 00:00:11,880 --> 00:00:16,710 Alors on va voir que le code, les classes, sont capables 7 00:00:17,360 --> 00:00:21,840 d'ajouter du traitement pour traiter le fait qu' 8 00:00:22,410 --> 00:00:24,940 un message aurait été envoyé et qui n'aurait pas été compris. 9 00:00:26,000 --> 00:00:28,520 Si je reviens rapidement sur l'envoi de messages. 10 00:00:29,640 --> 00:00:32,550 On envoie le message area à l'objet colored rectangle. 11 00:00:33,850 --> 00:00:37,000 L'algorithme de lookup a pour but de trouver la méthode à 12 00:00:37,200 --> 00:00:40,160 exécuter par rapport à ce message là, donc l'algorithme 13 00:00:40,360 --> 00:00:42,710 de lookup cherche dans la classe du receveur, c'est-à-dire 14 00:00:42,910 --> 00:00:46,630 ColoredRectangle, une méthode qui s'appelle area, s'il la 15 00:00:46,830 --> 00:00:48,020 trouve, il l'exécute. 16 00:00:48,220 --> 00:00:49,570 Là il ne la trouve pas donc l'algorithme de lookup va 17 00:00:49,770 --> 00:00:54,100 aller voir dans la superclasse. La méthode area est 18 00:00:54,300 --> 00:00:58,540 trouvée et elle est exécutée sur le receveur. 19 00:01:00,790 --> 00:01:03,270 Alors qu'est-ce-qui se passe s'il n'y a pas de méthode 20 00:01:03,470 --> 00:01:06,960 area du tout, et que algorithme de lookup échoue? 21 00:01:08,090 --> 00:01:12,660 Alors dans ce cas-là on envoie le message "Coucou" à l'objet node1. 22 00:01:13,830 --> 00:01:17,570 Il n'y a pas de méthode Coucou implémentée, donc l'envoi 23 00:01:17,770 --> 00:01:18,530 de message se passe comment ? 24 00:01:18,730 --> 00:01:22,520 On envoie le message Coucou à node1, on cherche Coucou 25 00:01:22,720 --> 00:01:25,340 dans la classe Node il n'est pas trouvé, l'algorithme de 26 00:01:25,540 --> 00:01:27,820 lookup cherche Coucou dans la classe Object, il n'est pas trouvé. 27 00:01:28,260 --> 00:01:32,500 À ce moment-là, la machine virtuelle Pharo envoie le 28 00:01:32,700 --> 00:01:37,570 message doesNotUnderstand au receveur donc 29 00:01:37,770 --> 00:01:40,690 à node1. Donc doesNotUnderstand 30 00:01:43,920 --> 00:01:47,110 avec le message initial en paramètres, donc avec 31 00:01:48,580 --> 00:01:49,930 un coucou: stef en paramètre. 32 00:01:50,780 --> 00:01:55,150 Ici, si je le refais étape par étape, coucou est envoyé à 33 00:01:55,350 --> 00:01:59,610 node1, Coucou est cherché dans la classe Node, Coucou est 34 00:01:59,810 --> 00:02:02,480 cherché dans la classe Object, la méthode Coucou n'existe 35 00:02:02,680 --> 00:02:07,370 pas donc le message doesNotUnderstand est envoyé à l'objet node1. 36 00:02:09,070 --> 00:02:12,010 Donc l'algorithme de lookup va chercher une méthode 37 00:02:12,210 --> 00:02:13,830 doesNotUnderstand dans la classe de node1. 38 00:02:14,030 --> 00:02:17,260 DoesNotUnderstand n'est pas trouvé dans la classe Node 39 00:02:17,460 --> 00:02:19,260 donc l'algorithme de lookup charge doesNotUnderstand dans 40 00:02:19,460 --> 00:02:22,660 la super classe, la méthode doesNotUnderstand est trouvée 41 00:02:22,860 --> 00:02:25,180 ou une méthode doesNotUnderstand est trouvée dans la 42 00:02:25,380 --> 00:02:26,920 classe Object, elle est exécutée. 43 00:02:27,500 --> 00:02:28,570 Donc qu'est ce que ça signifie ça ? 44 00:02:28,770 --> 00:02:31,430 Ça signifie que dans toutes les sous-classes de la classe 45 00:02:31,630 --> 00:02:35,550 Object, on peut implémenter doesNotUnderstand pour avoir 46 00:02:35,750 --> 00:02:39,760 du comportement particulier qui va s'exécuter lorsqu'un 47 00:02:39,960 --> 00:02:43,310 objet, une instance de cette classe ne comprend pas un message. 48 00:02:44,470 --> 00:02:48,440 Donc sur ce slide vous avez les détails étape par étape 49 00:02:48,640 --> 00:02:50,100 de cet exemple que vous pouvez relire. 50 00:02:51,450 --> 00:02:54,450 DoesNotUnderstand, c'est un message comme les autres. 51 00:02:54,650 --> 00:02:56,550 Donc vous pouvez implémenter une méthode qui s'appelle 52 00:02:56,750 --> 00:03:00,230 doesNotUnderstand, et qui sera exécutée à chaque fois qu'une 53 00:03:00,430 --> 00:03:03,280 instance ne comprendra pas un message. 54 00:03:03,770 --> 00:03:08,000 On se sert de ce mécanisme dans certains cas un petit peu 55 00:03:08,200 --> 00:03:12,300 compliqués comme les proxys, la délégation 56 00:03:12,500 --> 00:03:16,280 automatique, c'est-à-dire lorsque vous voulez que tous 57 00:03:16,480 --> 00:03:18,720 les messages que reçoit un objet soient transmis à un autre objet. 58 00:03:19,710 --> 00:03:22,110 Dans ces cas-là on peut utiliser ce mécanisme de doesNotUnderstand. 59 00:03:24,080 --> 00:03:27,100 L'implémentation par défaut de doesNotUnderstand se 60 00:03:27,300 --> 00:03:30,260 trouve dans la classe object, et cette implémentation par 61 00:03:30,460 --> 00:03:34,070 défaut lève une exception. Donc l'exception 62 00:03:35,740 --> 00:03:36,950 s'appelle "MessageNotUnderstood". 63 00:03:38,670 --> 00:03:41,750 Donc si la méthode doesNotUnderstand de la classe object 64 00:03:42,000 --> 00:03:44,250 est exécutée, une exception est levée. 65 00:03:44,450 --> 00:03:49,000 Cela signifie que le code que vous écrivez peut capturer 66 00:03:49,200 --> 00:03:51,950 cette exception, comme il capturerait n'importe quelle 67 00:03:52,150 --> 00:03:55,230 exception, et peut y avoir du traitement particulier 68 00:03:55,650 --> 00:03:57,170 lorsqu'un message n'est pas compris. 69 00:03:58,280 --> 00:04:02,170 Dans cet exemple là, on revient sur la classe Node, et 70 00:04:03,110 --> 00:04:06,010 on a une méthode "sayHello" dans la classe Node, qui 71 00:04:06,210 --> 00:04:09,020 envoie le message Coucou au receveur donc à self. 72 00:04:10,840 --> 00:04:14,500 On a aussi une méthode Welcome qui envoie le message 73 00:04:14,700 --> 00:04:18,330 "Sayhello" à self et qui fait un traitement particulier 74 00:04:18,530 --> 00:04:22,710 si dans le contexte de cet envoi de message, 75 00:04:23,690 --> 00:04:28,080 si un message n'est pas compris, il va y avoir du traitement. 76 00:04:28,830 --> 00:04:32,570 Donc là say hello envoie le message Coucou à self, Coucou 77 00:04:32,770 --> 00:04:36,450 n'est toujours pas implémenté, donc au final la méthode 78 00:04:36,650 --> 00:04:40,390 doesNotUnderstand sera exécutée, 79 00:04:41,640 --> 00:04:45,220 une exception sera levée, donc l'exception messageNotUnderstood sera levée. 80 00:04:46,220 --> 00:04:49,610 Le code qui est ici avec undo sert à capturer les 81 00:04:49,810 --> 00:04:51,690 exceptions, c'est l'équivalent de try catch en Java. 82 00:04:51,890 --> 00:04:56,240 Vous aurez une séquence plus tard qui vous parlera des exceptions en détail. 83 00:04:57,920 --> 00:05:00,670 Mais là ce qui nous intéresse c'est de voir que ce 84 00:05:00,870 --> 00:05:02,780 code-là, en fait, c'est l'équivalent du catch de Java, 85 00:05:03,000 --> 00:05:05,490 donc c'est le code qui va être exécuté lorsque l'exception est capturée. 86 00:05:06,810 --> 00:05:11,400 Donc si on envoie le message Welcome à node1, 87 00:05:12,180 --> 00:05:15,530 sachant que Coucou n'est pas implémenté, on affichera 88 00:05:15,730 --> 00:05:17,760 dans la console le message something went wrong with the message. 89 00:05:17,960 --> 00:05:22,270 Ce que vous devez retenir, c'est que 90 00:05:22,680 --> 00:05:25,500 lorsque l'algorithme de lookup ne trouve pas une méthode 91 00:05:25,700 --> 00:05:28,010 correspondante à un message qui est envoyé, un message 92 00:05:28,210 --> 00:05:31,670 doesNotUnderstand est envoyé au receveur initial avec le 93 00:05:31,870 --> 00:05:33,740 message d'origine en paramètres. 94 00:05:34,330 --> 00:05:37,280 Vous pouvez implémenter une méthode doesNotUnderstand dans vos classes. 95 00:05:37,800 --> 00:05:41,620 A défaut, l'implémentation par défaut dans la classe object sera exécutée. 96 00:05:42,120 --> 00:05:45,530 Cette implémentation par défaut lève une exception, cette 97 00:05:45,730 --> 00:05:48,130 exception s'appelle messageNotUnderstood, et le code que 98 00:05:48,330 --> 00:05:50,180 vous écrivez peut capturer cette exception et avoir du 99 00:05:50,380 --> 00:05:53,050 traitement particulier lorsqu'un message n'est pas compris.