1 00:00:00,510 --> 00:00:03,790 Bonjour. Donc dans le cours d'avant, on a regardé comme 2 00:00:04,000 --> 00:00:06,620 on avait implémenté les booléens, not et or. 3 00:00:07,120 --> 00:00:09,250 Et il nous restait en suspens la question 3: c'est 4 00:00:09,450 --> 00:00:11,750 pourquoi diable a-t-on posé ces questions? 5 00:00:12,200 --> 00:00:13,710 Donc c'est ce qu'on va regarder dans ce cours. 6 00:00:14,780 --> 00:00:16,460 Donc, je vous rappelle l'implémentation. 7 00:00:16,660 --> 00:00:19,760 Donc là, pour not qu'on avait vu, on avait vu qu'on avait deux objets. 8 00:00:20,260 --> 00:00:24,050 On avait true et false, qui étaient instance de la classe 9 00:00:24,250 --> 00:00:25,100 True et de la classe False. 10 00:00:25,300 --> 00:00:28,300 Et quand on envoyait un message not, on cherchait au bon 11 00:00:28,500 --> 00:00:31,560 endroit chacun dans sa classe respective et qu'on exécutait les méthodes. 12 00:00:32,600 --> 00:00:33,720 Donc ça, pas de problème. 13 00:00:35,160 --> 00:00:37,580 Donc maintenant, ce que j'avais dit, j'avais dit "mais en 14 00:00:37,780 --> 00:00:40,170 fait si on regarde ce qu'on est en train de faire, c'est 15 00:00:40,370 --> 00:00:43,040 que d'une part en fait, on laissait le receveur décider". 16 00:00:43,240 --> 00:00:45,430 Ça veut dire qu'on ne prenait pas de décision. 17 00:00:46,360 --> 00:00:49,130 Et que, on envoyait le message et que le message allait se résoudre. 18 00:00:49,520 --> 00:00:52,440 Et donc c'étaient ces deux heuristiques qui étaient 19 00:00:52,640 --> 00:00:56,030 "laisser le receveur décider" et "ne me demande pas, mais 20 00:00:56,230 --> 00:00:59,120 dit de faire les choses". On le retrouvera encore. 21 00:00:59,320 --> 00:01:02,510 Maintenant, regardons plus précisément l'exercice. 22 00:01:03,180 --> 00:01:04,940 Donc qu'est-ce que ça illustre ? 23 00:01:05,140 --> 00:01:07,530 Parce que vous n'allez sûrement jamais implémenter des 24 00:01:07,730 --> 00:01:09,410 booléens dans votre vie. En tout cas, je vous le souhaite. 25 00:01:10,320 --> 00:01:13,020 Et est-ce que c'est vraiment totalement inutile? 26 00:01:13,220 --> 00:01:14,160 Quelle est la leçon ? 27 00:01:14,360 --> 00:01:15,780 Quelles sont les leçons qui sont sous-jacentes? 28 00:01:16,170 --> 00:01:19,010 Et je pense que c'est très important de vous poser cette 29 00:01:19,210 --> 00:01:21,470 question, de se dire "oui, l'implémentation est comme ça. 30 00:01:21,670 --> 00:01:24,740 Mais pourquoi? Qu'est-ce que ça illustre?" 31 00:01:24,940 --> 00:01:28,040 Cela illustre en fait qu'à chaque fois que j'envoie un 32 00:01:28,240 --> 00:01:32,920 message, en fait, j'ai une sorte de case statement 33 00:01:35,040 --> 00:01:38,820 que vous retrouverez dans la programmation C ou ce genre de choses. 34 00:01:39,960 --> 00:01:42,590 Envoyer un message, c'est faire un choix multiple. 35 00:01:44,500 --> 00:01:46,160 Alors ce qui est intéressant, c'est qu'envoyer un 36 00:01:46,360 --> 00:01:49,800 message, finalement, c'est un peu plus qu'un case parce 37 00:01:50,000 --> 00:01:52,430 que c'est un case dynamique. En fait, il va dépendre des 38 00:01:52,630 --> 00:01:54,890 classes qui sont chargées et des instances qui ont été créées. 39 00:01:55,820 --> 00:01:57,430 Mais si on regarde ça veut dire que quand vous avez 40 00:01:57,630 --> 00:02:01,000 programmé en Java, vous avez souvent écrit, je ne sais pas, moi, x. 41 00:02:01,390 --> 00:02:03,860 f pour invoquer la méthode F. 42 00:02:04,280 --> 00:02:06,000 Et moi ce que je suis en train de vous expliquer, c'est 43 00:02:06,200 --> 00:02:09,450 que le point, là, c'est un opérateur de choix. 44 00:02:10,890 --> 00:02:12,360 Et ça, c'est vraiment fondamental. 45 00:02:13,470 --> 00:02:15,000 Et que ce choix est dynamique. 46 00:02:15,650 --> 00:02:17,930 Et que souvent, on ne vous l'a pas présenté de cette manière. 47 00:02:18,130 --> 00:02:20,630 Mais que c'est vraiment ce que l'exemple est en train d'illustrer 48 00:02:20,830 --> 00:02:22,380 et d'une manière très forte en fait. 49 00:02:23,120 --> 00:02:26,070 Si je résume, vous avez vraiment envoyé un message. 50 00:02:26,270 --> 00:02:27,670 Ça fonctionne comme faire un case statement. 51 00:02:28,020 --> 00:02:30,570 Mais c'est un case statement dynamique dans le sens où 52 00:02:31,060 --> 00:02:33,410 cela va dépendre des classes qui ont été chargées. 53 00:02:33,610 --> 00:02:35,430 Là, j'ai un exemple sur les booléens où il y a deux 54 00:02:35,630 --> 00:02:37,390 instances et deux classes. Mais, il pourrait y en avoir 55 00:02:37,590 --> 00:02:39,160 cinquante et ça fonctionnerait de la même manière. 56 00:02:40,370 --> 00:02:43,140 À chaque fois que vous envoyez un message en fait, l'exécution, 57 00:02:43,340 --> 00:02:45,030 la machine virtuelle parce que Pharo a une machine 58 00:02:45,230 --> 00:02:47,150 virtuelle tout comme la machine virtuelle Java ou C Sharp. 59 00:02:47,840 --> 00:02:51,510 La machine virtuelle, l'engin d'exécution va sélectionner 60 00:02:51,710 --> 00:02:53,760 la bonne méthode dépendante de la classe du receveur. 61 00:02:54,620 --> 00:02:58,140 Donc, envoyer un message c'est un mécanisme de choix. 62 00:02:58,370 --> 00:03:00,140 Et vous à chaque fois que vous allez utiliser une 63 00:03:00,340 --> 00:03:03,530 condition, vous allez vous substituer en fait à ce 64 00:03:03,730 --> 00:03:07,850 mécanisme qui est implémenté dans la machine virtuelle qui fait un choix. 65 00:03:08,050 --> 00:03:12,100 Et donc ce que les solutions avec not montrent, c'est: 66 00:03:12,330 --> 00:03:15,870 utilisons le choix qui est donné par la machine virtuelle 67 00:03:16,220 --> 00:03:17,380 pour implémenter nos programmes. 68 00:03:17,580 --> 00:03:19,410 On n'a pas besoin d'utiliser un if en plus. 69 00:03:19,940 --> 00:03:23,800 Puisqu'en fait, envoyer un message, c'est déjà faire un if ou une condition. 70 00:03:24,800 --> 00:03:27,310 Donc la question maintenant qu'on peut se poser c'est: 71 00:03:27,560 --> 00:03:30,560 si j'avais exprimé l'exercice de départ d'une manière 72 00:03:30,760 --> 00:03:32,640 totalement différente, si j'avais dit: est-ce que vous 73 00:03:32,840 --> 00:03:34,640 pouvez implémenter not dans la classe Booléen? 74 00:03:34,840 --> 00:03:36,760 Ou or dans la classe Booléen ? 75 00:03:37,210 --> 00:03:39,000 Vous n'auriez pas pu avoir cette solution. 76 00:03:40,310 --> 00:03:41,070 Tiens, c'est étrange. 77 00:03:41,270 --> 00:03:43,520 Donc ça veut dire qu’en fait, le fait qu'il y ait qu'une 78 00:03:43,720 --> 00:03:45,430 classe ou plusieurs, ça a une influence vraiment 79 00:03:45,630 --> 00:03:48,250 importante sur la manière dont je vais pouvoir concevoir mon application. 80 00:03:49,220 --> 00:03:54,110 Et en effet, les classes vont jouer le rôle de 81 00:03:54,670 --> 00:03:55,930 branches ou de choix. 82 00:03:56,790 --> 00:03:59,410 Donc si vous avez le choix de choisir des yaourts, mais 83 00:03:59,610 --> 00:04:01,780 que vous allez dans un magasin où il y en a qu'un, vous 84 00:04:02,000 --> 00:04:04,350 choisirez ce yaourt-là. Là, c'est la même chose. 85 00:04:04,580 --> 00:04:08,100 Cela veut dire que votre classe va représenter un choix 86 00:04:08,300 --> 00:04:09,610 dans l'arbre d'héritage. 87 00:04:09,810 --> 00:04:11,130 Donc, qu'est-ce que ça implique ? 88 00:04:11,330 --> 00:04:14,640 Cela implique que quand je regarde un design où j'ai une 89 00:04:14,840 --> 00:04:18,080 grosse classe bien grasse avec plein de méthodes et à la 90 00:04:18,280 --> 00:04:20,690 place, je peux l'exprimer sous une forme de hiérarchie, 91 00:04:21,280 --> 00:04:23,010 ce design-là est de meilleure qualité. 92 00:04:23,210 --> 00:04:25,460 Pourquoi? Parce qu'il est déjà plus modulaire. 93 00:04:25,660 --> 00:04:29,660 Je peux facilement rajouter un autre choix si j'ai envie. 94 00:04:29,940 --> 00:04:31,250 Je peux étendre un autre champ. 95 00:04:31,450 --> 00:04:32,940 Je peux dire "ah oui, celui-là, il n'était pas mal, mais 96 00:04:33,140 --> 00:04:35,660 finalement je voudrais le raffiner pour en avoir à nouveau". 97 00:04:36,340 --> 00:04:38,600 Et en plus, ça me permet de réduire la complexité. 98 00:04:38,800 --> 00:04:41,070 Ça veut dire que je peux focaliser sur une seule classe 99 00:04:41,270 --> 00:04:45,110 et pas un truc avec plein de conditions de partout. 100 00:04:45,310 --> 00:04:49,250 Donc, si on regarde, on a d'un côté un opérateur de choix. 101 00:04:49,450 --> 00:04:52,000 Et d'un autre, on a quelque chose qui exprime du choix. 102 00:04:52,910 --> 00:04:56,120 Et quand on les met les deux ensemble, on obtient de la 103 00:04:56,320 --> 00:04:57,470 conception-objet de bonne qualité. 104 00:04:58,080 --> 00:04:59,730 Donc maintenant, ce qui est encore un peu plus 105 00:04:59,930 --> 00:05:02,960 sympathique, c'est que si on regarde, la solution avec 106 00:05:03,160 --> 00:05:04,900 les hiérarchies, elle est encore plus chouette que ça. 107 00:05:05,220 --> 00:05:07,110 Parce que je peux packager mes solutions. 108 00:05:07,310 --> 00:05:09,580 Ça veut dire, je peux dire "tiens, là, j'ai le package core. 109 00:05:10,000 --> 00:05:10,930 Et puis là, j'ai un plug-in. 110 00:05:11,740 --> 00:05:13,650 Je vais dire à mes clients "oui si tu veux. 111 00:05:13,850 --> 00:05:15,910 Cette fonctionnalité-là, il faut que tu download dans l'autre ce plug-in. 112 00:05:16,110 --> 00:05:17,510 Et que tu me payes bien sûr au passage". 113 00:05:18,120 --> 00:05:20,150 Je vais charger dynamiquement ce code. 114 00:05:20,580 --> 00:05:23,390 Et quand je créerai une instance de cette classe-là, 115 00:05:25,450 --> 00:05:29,100 quand j'enverrai mon message opération ici, ça sera le 116 00:05:29,300 --> 00:05:31,040 code du plug-in qui sera exécuté dans le système. 117 00:05:32,310 --> 00:05:36,370 Et donc ça, c'est vraiment, pour nous, l'essence de la programmation-objet. 118 00:05:36,570 --> 00:05:40,000 J'envoie un message et je vais sélectionner la bonne méthode. 119 00:05:41,060 --> 00:05:43,800 Et je vais utiliser le fait que je sais que le système 120 00:05:44,000 --> 00:05:45,780 sélectionne la bonne méthode pour avoir des 121 00:05:46,000 --> 00:05:49,470 implémentations encore plus élégantes. Donc, qu'est-ce qu'on a regardé? 122 00:05:49,670 --> 00:05:50,430 Qu'est-ce qu'on a vu en fait ? 123 00:05:50,630 --> 00:05:54,340 On a vu qu'envoyer un message, ça laisse le receveur décider. 124 00:05:54,540 --> 00:05:55,300 Donc, il y a un choix. 125 00:05:55,500 --> 00:05:58,190 Le client lui n'a pas à prendre de décision. 126 00:05:58,650 --> 00:06:00,850 Le code du client est beaucoup plus déclaratif. 127 00:06:01,050 --> 00:06:01,810 Il n'y a pas de conditions. 128 00:06:02,010 --> 00:06:04,540 Je donne des ordres "fais-ci, fais ça, ouvre, ferme". 129 00:06:05,020 --> 00:06:06,870 Et pas "est-ce que tu es de cette classe-là? 130 00:06:07,070 --> 00:06:08,720 Est-ce que tu es dans cet état-là pour que je te ferme?" 131 00:06:08,920 --> 00:06:09,680 Ce n'est pas du tout le point. 132 00:06:10,040 --> 00:06:12,430 Et différents receveurs peuvent être substitués dynamiquement. 133 00:06:12,630 --> 00:06:14,110 Donc ça, on le verra dans un autre cours. 134 00:06:14,310 --> 00:06:15,070 Mais c'est aussi sous-jacent. 135 00:06:16,650 --> 00:06:20,080 Donc de manière générale, essayez d'éviter d'écrire des if. 136 00:06:21,340 --> 00:06:23,720 Utiliser des messages et des objets quand vous pouvez. 137 00:06:23,920 --> 00:06:25,260 Ce n'est pas tous les jours le cas, mais au moins 138 00:06:25,460 --> 00:06:27,740 utilisez des messages et des objets quand vous le pouvez. 139 00:06:29,340 --> 00:06:32,760 L'engin d'exécution, la machine virtuelle, à chaque fois 140 00:06:32,960 --> 00:06:37,050 que vous envoyez un message fait un conditionnal switch pour vous. 141 00:06:37,720 --> 00:06:40,930 Donc, utilisez-le. Et vous pouvez vous amuser à taper le AntiIfCampaign. 142 00:06:42,090 --> 00:06:45,220 C'est une campagne que les programmeurs ont montée pour 143 00:06:45,420 --> 00:06:46,670 éviter que les gens écrivent des if. 144 00:06:48,850 --> 00:06:50,370 Donc, qu'est-ce qu'on a vu en fait dans ce cours? 145 00:06:50,570 --> 00:06:51,330 On a vu deux choses. 146 00:06:51,530 --> 00:06:52,470 On a vu que quand j'écris x. 147 00:06:52,670 --> 00:06:56,920 f, je le fais en syntaxe Java et en syntaxe Pharo ça 148 00:06:57,120 --> 00:07:00,300 serait F. Je fais un choix. 149 00:07:00,500 --> 00:07:03,860 Je choisis la méthode F qui doit être exécutée en 150 00:07:04,060 --> 00:07:06,080 dépendant du receveur. 151 00:07:07,090 --> 00:07:08,720 Donc j'ai cet opérateur de choix. 152 00:07:08,920 --> 00:07:12,190 Et j'ai une hiérarchie qui elle va représenter des choix potentiels. 153 00:07:12,390 --> 00:07:16,400 Donc, c'est vraiment un squelette sur lequel le choix va pouvoir s'appuyer. 154 00:07:16,780 --> 00:07:18,350 Et du coup, je n'ai pas de conditions. 155 00:07:18,940 --> 00:07:20,670 Et j'ai des programmes qui sont plus extensibles. 156 00:07:21,860 --> 00:07:25,400 Donc, voilà la fin du premier cours sur les concepts 157 00:07:25,600 --> 00:07:27,250 objets tels qu'on peut les voir en Pharo. 158 00:07:28,260 --> 00:07:30,320 Et, on en verra d'autres pendant les prochaines séances.