1 00:00:07,930 --> 00:00:10,760 Bonjour à tous. Dans cette séquence, nous allons voir 2 00:00:10,960 --> 00:00:12,390 quelques points avancés sur les classes. 3 00:00:13,950 --> 00:00:17,370 3 points, notamment comment on va partager de l'état 4 00:00:17,690 --> 00:00:19,930 entre plusieurs instances d'une même classe et de ses sous-classes. 5 00:00:20,130 --> 00:00:24,820 Deuxième point, on va voir un point qui permet aux 6 00:00:25,020 --> 00:00:27,040 classes d'avoir leur propre variable. 7 00:00:28,680 --> 00:00:30,670 Et enfin, on va voir comment initialiser les classes. 8 00:00:33,100 --> 00:00:35,920 Premier point, partager de l'état entre plusieurs instances. 9 00:00:38,640 --> 00:00:42,560 On a plusieurs instances d'une même classe, et toutes ces 10 00:00:42,760 --> 00:00:47,040 instances veulent avoir un objet commun pour partager de l'état. 11 00:00:47,670 --> 00:00:52,510 En Java, on utilise une variable d'instance avec le 12 00:00:52,710 --> 00:00:57,500 mot-clé statique. La valeur d'une variable 13 00:00:57,700 --> 00:01:00,690 statique est la même pour toutes les instances. 14 00:01:01,710 --> 00:01:04,540 En Pharo, on utilise les variables de classes. 15 00:01:06,310 --> 00:01:08,730 Vous avez pu voir cette expression répétée encore et 16 00:01:08,930 --> 00:01:10,890 encore qui permet de créer une classe. 17 00:01:11,470 --> 00:01:15,290 Là, on crée la classe color, on dit que c'est une sous-classe d'objects. 18 00:01:15,800 --> 00:01:19,000 On liste ses variables d'instances et cette ligne-là à 19 00:01:19,200 --> 00:01:21,040 laquelle on n'a pas trop prêté attention jusqu'à 20 00:01:21,240 --> 00:01:25,360 maintenant liste les variables de classes de la classe color. 21 00:01:26,860 --> 00:01:30,120 On voit que la classe color a au moins 2 variables 22 00:01:30,320 --> 00:01:31,080 colorRegistry et componentMask. 23 00:01:32,800 --> 00:01:35,310 Les valeurs d'une variable de classes sont partagées 24 00:01:35,510 --> 00:01:38,240 entre toutes les instances d'une classe et toutes les 25 00:01:38,440 --> 00:01:41,820 instances des sous-classes. Ces variables sont 26 00:01:42,020 --> 00:01:45,000 accessibles à la fois à des méthodes côté instances et 27 00:01:45,200 --> 00:01:49,540 des méthodes côté classes et ces variables prennent une majuscule. 28 00:01:50,820 --> 00:01:54,550 Si je reviens à l'exemple de color, ici, j'ai ma classe 29 00:01:54,880 --> 00:01:58,070 color qui est une instance de la classe Color class, donc 30 00:01:58,270 --> 00:01:59,400 Color class c'est la méta classe. 31 00:02:01,160 --> 00:02:04,690 On a la classe Color qui définit 2 variables d'instances 32 00:02:04,890 --> 00:02:06,630 standards, rgb et alpha. 33 00:02:07,000 --> 00:02:09,140 Ces variables d'instances sont privées 34 00:02:11,870 --> 00:02:14,250 dans le sens où elles sont accessibles seulement depuis 35 00:02:14,840 --> 00:02:16,190 les méthodes de la classe Color. 36 00:02:18,420 --> 00:02:22,890 Et ColorRegistry, on voit que c'est une variable qui a 1, 37 00:02:23,090 --> 00:02:25,550 une majuscule 2, qui est soulignée. 38 00:02:25,750 --> 00:02:30,350 Ça indique que cette variable est une variable de 39 00:02:30,550 --> 00:02:34,000 classes et qu'elle est accessible non seulement depuis 40 00:02:34,200 --> 00:02:36,500 les méthodes de la classe Color, mais aussi depuis les 41 00:02:36,700 --> 00:02:38,800 méthodes de la classe Color class. 42 00:02:40,240 --> 00:02:43,460 Là, on a des exemples d'utilisation de cette variable-là. 43 00:02:44,170 --> 00:02:47,110 Dans une méthode d'instances, dans la méthode private 44 00:02:47,310 --> 00:02:52,000 good de la classe color, on accède à la variable de 45 00:02:52,200 --> 00:02:54,180 classe avec son nom. 46 00:02:55,390 --> 00:02:58,420 De la même façon, pour mettre une valeur dans cette 47 00:02:58,620 --> 00:03:03,150 variable, c'est juste 2 points égal comme avec n'importe 48 00:03:03,350 --> 00:03:05,540 quelle variable. Et on peut faire ça soit du côté 49 00:03:05,740 --> 00:03:09,200 instances, soit du côté classes. Très fréquemment, les 50 00:03:09,400 --> 00:03:14,000 valeurs de ces variables de classes seront lues à l' 51 00:03:14,200 --> 00:03:18,850 intérieur des méthodes d'instances et seront écrites 52 00:03:19,310 --> 00:03:21,680 à l'intérieur des méthodes de classes. 53 00:03:22,120 --> 00:03:23,840 C'est juste ce que l'on retrouve le plus fréquemment, 54 00:03:24,040 --> 00:03:25,450 rien ne contraint à cette utilisation. 55 00:03:28,200 --> 00:03:31,390 Maintenant, on va parler des variables d'instances de classes. 56 00:03:33,540 --> 00:03:34,380 Ce n'est pas la même chose. 57 00:03:35,250 --> 00:03:38,140 Une classe, c'est un objet comme les autres. 58 00:03:38,450 --> 00:03:41,330 Et comme tous les objets une classe peut avoir ses instances. 59 00:03:42,400 --> 00:03:44,800 Une classe étant décrite par sa méta classe, c'est la 60 00:03:45,000 --> 00:03:47,450 méta classe qui va lister les variables d'instances 61 00:03:47,650 --> 00:03:52,270 auxquelles son unique instance, qui est donc la classe, va pouvoir accéder. 62 00:03:53,420 --> 00:03:57,760 Pour définir une variable d'instances du côté classes, 63 00:03:58,480 --> 00:04:01,500 on appuie sur le bouton classes dans le navigateur de 64 00:04:01,700 --> 00:04:03,330 code, ce qui nous donne cette expression-là. 65 00:04:03,530 --> 00:04:07,000 Là, je suis en train de naviguer dans la classe 66 00:04:07,200 --> 00:04:10,000 RPackageSet et sa méta classe définit une 67 00:04:12,010 --> 00:04:12,770 variable cashePackages. 68 00:04:13,000 --> 00:04:17,610 Ces variables ne sont accessibles que des 69 00:04:17,810 --> 00:04:22,330 méthodes de classes et les variables commencent 70 00:04:23,000 --> 00:04:24,890 toujours par une lettre minuscule. 71 00:04:25,770 --> 00:04:27,000 Là, vous avez un exemple. 72 00:04:27,960 --> 00:04:32,350 La variable cash packages est définie dans la méta classe RPackageSet class. 73 00:04:35,330 --> 00:04:39,540 Ce qui signifie que la classe RPackageSet, qui est une 74 00:04:39,740 --> 00:04:44,670 instance de la méta classe, a une valeur associée à cette 75 00:04:44,870 --> 00:04:49,700 variable. De la même façon, toutes 76 00:04:49,900 --> 00:04:54,320 les instances des sous-classes de RPackageSet class ont 77 00:04:54,520 --> 00:04:58,550 une valeur dédiée pour cette variable, une valeur différente. 78 00:04:58,750 --> 00:05:00,090 Là, il n'y a aucun partage. 79 00:05:00,460 --> 00:05:04,000 Chaque instance de la classe RPackageSet class ou d'une 80 00:05:04,200 --> 00:05:07,150 de ses sous-classes va avoir sa propre valeur pour cette variable-là. 81 00:05:08,320 --> 00:05:12,000 On va bien distinguer les variables de classes et les 82 00:05:12,200 --> 00:05:15,030 variables d'instances côté classes grâce à un exemple. 83 00:05:15,230 --> 00:05:18,380 Là, on va implémenter le design pattern Singleton, dont 84 00:05:18,580 --> 00:05:23,230 le but c'est de garantir qu'on a une et une seule instance d'une classe. 85 00:05:25,140 --> 00:05:27,720 Une solution pour implémenter un Singleton, c'est de 86 00:05:27,920 --> 00:05:32,720 stocker dans une variable l'instance à laquelle 87 00:05:32,920 --> 00:05:35,350 tout le monde va accéder et de désactiver la construction 88 00:05:35,550 --> 00:05:37,820 de nouvelles instances. C'est exactement ce qu'on va 89 00:05:38,020 --> 00:05:39,080 faire dans cet exemple de webServer. 90 00:05:39,280 --> 00:05:43,900 Là, j'utilise une variable d'instance côté 91 00:05:44,100 --> 00:05:45,280 classes, ce qu'on vient de voir. 92 00:05:46,780 --> 00:05:51,050 Nom minuscule, c'est dans la définition de ma méta classe 93 00:05:51,250 --> 00:05:52,500 que je vais définir cette variable-là. 94 00:05:52,700 --> 00:05:56,740 Là, je désactive l'exécution de la méthode new, 95 00:05:57,890 --> 00:06:00,440 personne ne pourra envoyer le message new à la classe web 96 00:06:00,640 --> 00:06:02,130 serveur pour créer une nouvelle instance, il faudra 97 00:06:02,330 --> 00:06:06,290 absolument passer par uniqueInstance, qui renvoie soit 98 00:06:07,340 --> 00:06:09,550 la valeur de la variable si ce n'est pas vide, s'il y a 99 00:06:09,750 --> 00:06:12,370 déjà quelque chose dedans, soit qui met quelque chose 100 00:06:12,570 --> 00:06:16,380 dans cette variable, qui grâce à super new va créer une 101 00:06:16,580 --> 00:06:19,290 nouvelle instance de la classe web serveur et qui va 102 00:06:19,490 --> 00:06:21,880 mettre cette instance dans la variable unique instance. 103 00:06:22,670 --> 00:06:27,350 Le fait d'avoir utilisé des classes instance variable va 104 00:06:27,550 --> 00:06:30,350 faire qu'on a la conséquence suivante. 105 00:06:31,200 --> 00:06:35,470 Chaque sous-classe de la classe webServer va avoir sa 106 00:06:35,670 --> 00:06:38,340 propre valeur pour uniqueInstance. 107 00:06:38,540 --> 00:06:43,310 C'est-à-dire que si web serveur a 3 sous-classes, il va 108 00:06:43,510 --> 00:06:47,140 y avoir en tout 4 valeurs pour la variable 109 00:06:47,340 --> 00:06:49,030 uniqueInstance, donc une pour webServer et une pour 110 00:06:49,230 --> 00:06:50,000 chacune de ces sous-classes-là. 111 00:06:51,520 --> 00:06:54,440 Si maintenant, j'utilise une variable de classes. 112 00:06:55,100 --> 00:06:59,050 Là, on édite la classe côté 113 00:06:59,480 --> 00:07:03,680 instances et on ajoute UniqueInstance avec une majuscule. 114 00:07:06,960 --> 00:07:11,210 De la même façon, j'interdis l'envoi du message new et j'implémente 115 00:07:11,410 --> 00:07:13,680 UniqueInstance, la seule chose qui a changé c'est que j'ai 116 00:07:13,880 --> 00:07:16,110 mis un U majuscule plutôt qu'un u minuscule. 117 00:07:18,070 --> 00:07:22,930 Conséquence de choisir une variable de classe, on a un 118 00:07:23,130 --> 00:07:24,610 singleton pour l'ensemble de la hiérarchie. 119 00:07:24,960 --> 00:07:29,470 Si le webServer a 3 sous-classes, les 3 sous-classes plus 120 00:07:29,670 --> 00:07:32,360 la classe webServer vont partager le même singleton, donc 121 00:07:32,560 --> 00:07:36,920 on aura une instance qui sera partagée par tout le monde. 122 00:07:37,120 --> 00:07:39,120 Maintenant, on va parler d'initiation de classes parce qu'on 123 00:07:39,320 --> 00:07:41,170 peut avoir des variables qui sont partagées entre 124 00:07:41,370 --> 00:07:43,200 plusieurs instances, on peut avoir des variables de 125 00:07:43,400 --> 00:07:45,200 classes, mais à un moment il va bien falloir mettre une 126 00:07:45,400 --> 00:07:49,000 valeur dans ces variables-là. En général, on fait ça au 127 00:07:49,200 --> 00:07:50,000 moment de l'initialisation de la classe. 128 00:07:51,110 --> 00:07:55,040 Les objets sont initialisés lorsque est envoyé le message initialize dessus. 129 00:07:55,380 --> 00:07:57,760 Les classes, c'est pareil, on peut envoyer le message 130 00:07:57,960 --> 00:08:00,110 initialize à une classe et c'est dans le code de la 131 00:08:00,310 --> 00:08:03,950 méthode initialize qu'on va décider comment les variables sont initialisées. 132 00:08:06,000 --> 00:08:09,800 Si je veux initialiser la classe couleurs, j'envoie le 133 00:08:10,000 --> 00:08:11,800 message initialize à la classe Color. 134 00:08:12,730 --> 00:08:16,130 En général, lorsque une classe est chargée dans le 135 00:08:16,330 --> 00:08:19,820 système, grâce au gestionnaire de versions, le message 136 00:08:20,020 --> 00:08:23,660 initialize est automatiquement envoyé à toutes les classes au bon moment. 137 00:08:23,860 --> 00:08:25,460 Donc, il n'y a pas besoin de se préoccuper d'envoyer le 138 00:08:25,660 --> 00:08:28,940 message initialize manuellement à toutes les classes qu'on recherche. 139 00:08:29,140 --> 00:08:31,670 Par contre, si on implémente une classe, le développeur 140 00:08:31,870 --> 00:08:34,580 qui crée une nouvelle classe avec une méthode initialize, 141 00:08:34,780 --> 00:08:37,000 va devoir envoyer ses messages initialize lui-même. 142 00:08:38,630 --> 00:08:40,590 Là, on a un exemple dans la classe Color. 143 00:08:41,680 --> 00:08:44,870 On voit qu'ici on est bien du côté de la méta classe et 144 00:08:45,070 --> 00:08:49,020 on initialise quelques variables de classes ou variables 145 00:08:51,570 --> 00:08:52,730 d'instances côté classes. 146 00:08:53,250 --> 00:08:55,050 Là, il y a les 2 types de variables. 147 00:08:58,000 --> 00:09:01,400 Dans les méthodes initialize, côté classes il ne faut 148 00:09:01,600 --> 00:09:03,160 jamais utiliser super initialize. 149 00:09:03,690 --> 00:09:06,520 On vous a dit que côté instances quand on ajoutait une 150 00:09:06,720 --> 00:09:10,620 méthode initialize, on appelait systématiquement super 151 00:09:10,820 --> 00:09:13,830 initialize pour initialiser toutes les variables d'instances 152 00:09:14,030 --> 00:09:14,900 d'un nouvel objet qui est crée. 153 00:09:15,400 --> 00:09:17,860 Pour les classes par contre, comme les classes existent 154 00:09:18,240 --> 00:09:20,180 dans le système et les super classes existent déjà dans 155 00:09:20,380 --> 00:09:22,490 le système au moment où on envoie initialize, on 156 00:09:22,690 --> 00:09:24,950 n'utilise pas super initialize dans une méthode 157 00:09:25,150 --> 00:09:28,340 initialize côté classes, pour ne pas réinitialiser des 158 00:09:28,540 --> 00:09:29,330 classes qui auraient été déjà initialisées. 159 00:09:29,530 --> 00:09:34,250 Ce que vous devez retenir, c'est que pour partager de l'état 160 00:09:34,450 --> 00:09:35,570 on utilise les variables de classes. 161 00:09:37,310 --> 00:09:39,150 Les classes sont des objets comme les autres qui peuvent 162 00:09:39,350 --> 00:09:42,190 avoir leurs propres variables, et dans ces cas-là on 163 00:09:42,390 --> 00:09:43,700 utilise des variables d'instances côté classes. 164 00:09:45,330 --> 00:09:47,620 Une classe est initialisée en envoyant un message 165 00:09:47,820 --> 00:09:50,090 initialize à la classe, et en implémentant une méthode 166 00:09:50,290 --> 00:09:51,050 initialize côté classes.