You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/09-classes/04-private-protected-properties-methods/article.md
+27-28Lines changed: 27 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,34 +11,34 @@ Habituellement, les appareils que nous utilisons sont assez complexes. Mais dél
11
11
12
12
## Un exemple concret
13
13
14
-
Par exemple, une machine à café. Simple de l'extérieur: un bouton, un écran, quelques trous... Et le résultat: un café génial! :)
14
+
Par exemple, une machine à café. Simple de l'extérieur: un bouton, un écran, quelques trous... Et le résultat : du bon café ! :)
15
15
16
16

17
17
18
-
Mais à l'intérieur... (une image du manuel de réparation)
18
+
Mais à l'intérieur... (une image du manuel de réparation)
19
19
20
20

21
21
22
22
Beaucoup de détails. Mais on peut l'utiliser sans rien savoir.
23
23
24
-
Les machines à café sont assez fiables, n'est-ce pas? Nous pouvons en utiliser une pendant des années, et seulement en cas de problème, la faire réparer.
24
+
Les machines à café sont assez fiables, n'est-ce pas? Nous pouvons en utiliser une pendant des années, et seulement en cas de problème, la faire réparer.
25
25
26
26
Le secret de la fiabilité et de la simplicité d'une machine à café - tous les détails sont bien réglés et cachés à l'intérieur.
27
27
28
-
Si nous retirons le capot de protection de la machine à café, son utilisation sera beaucoup plus complexe (où appuyer?) et dangereuse (elle peut électrocuter).
28
+
Si nous retirons le capot de protection de la machine à café, son utilisation sera beaucoup plus complexe (où appuyer?) et dangereuse (elle peut électrocuter).
29
29
30
30
Comme nous le verrons, les objets de programmation ressemblent à des machines à café.
31
31
32
32
Mais pour masquer les détails intérieurs, nous n'utiliserons pas une couverture de protection, mais une syntaxe spéciale du langage et des conventions.
33
33
34
34
## Interface interne et externe
35
35
36
-
En programmation orientée objet, les propriétés et les méthodes sont divisées en deux groupes:
36
+
En programmation orientée objet, les propriétés et les méthodes sont divisées en deux groupes:
37
37
38
38
-*Interface interne* - méthodes et propriétés, accessibles à partir d'autres méthodes de la classe, mais pas de l'extérieur.
39
39
-*Interface externe* - méthodes et propriétés, accessibles aussi de l'extérieur de la classe.
40
40
41
-
Si nous continuons l'analogie avec la machine à café - ce qui est caché à l'intérieur: un tube de chaudière, un élément chauffant, etc. -, c'est son interface interne.
41
+
Si nous continuons l'analogie avec la machine à café - ce qui est caché à l'intérieur: un tube de chaudière, un élément chauffant, etc. -, c'est son interface interne.
42
42
43
43
Une interface interne est utilisée pour que l’objet fonctionne, ses détails s’utilisent les uns les autres. Par exemple, un tube de chaudière est attaché à l'élément chauffant.
44
44
@@ -48,20 +48,20 @@ Il suffit donc de connaître son interface externe pour utiliser un objet. Nous
48
48
49
49
C'était une introduction générale.
50
50
51
-
En JavaScript, il existe deux types de champs d’objet (propriétés et méthodes):
51
+
En JavaScript, il existe deux types de champs d’objet (propriétés et méthodes):
52
52
53
53
- Publique : accessible de n'importe où. Ils comprennent l'interface externe. Jusqu'à présent, nous utilisions uniquement des propriétés et méthodes publiques.
54
54
- Privée : accessible uniquement de l'intérieur de la classe. Ce sont pour l'interface interne.
55
55
56
-
Dans de nombreuses autres langues, il existe également des champs "protégés": accessibles uniquement de l'intérieur de la classe et de ceux qui l'étendent (comme privé, mais avec accès des classes héritées). Ils sont également utiles pour l'interface interne. En un sens, elles sont plus répandues que les méthodes privées, car nous souhaitons généralement que les classes héritées puissent y accéder.
56
+
Dans de nombreux autres langages, il existe également des champs "protégés": accessibles uniquement de l'intérieur de la classe et de ceux qui l'étendent (comme privé, mais avec accès des classes héritées). Ils sont également utiles pour l'interface interne. En un sens, elles sont plus répandues que les méthodes privées, car nous souhaitons généralement que les classes héritées puissent y accéder.
57
57
58
-
Les champs protégés ne sont pas implémentés en JavaScript au niveau de la langue, mais dans la pratique, ils sont très pratiques, ils sont donc imités.
58
+
Les champs protégés ne sont pas implémentés en JavaScript au niveau du langage, mais dans la pratique, ils sont très pratiques, ils sont donc imités.
59
59
60
60
Nous allons maintenant créer une machine à café en JavaScript avec tous ces types de propriétés. Une machine à café a beaucoup de détails, nous ne les modéliserons pas pour rester simples (bien que nous puissions).
61
61
62
62
## Protection de "waterAmount"
63
63
64
-
Faisons d'abord une classe de machine à café simple:
64
+
Faisons d'abord une classe de machine à café simple:
65
65
66
66
```js run
67
67
classCoffeeMachine {
@@ -87,9 +87,9 @@ Changeons la propriété `waterAmount` en protégée pour avoir plus de contrôl
87
87
88
88
**Les propriétés protégées sont généralement précédées d'un trait de soulignement `_`.**
89
89
90
-
Cela n'est pas appliqué au niveau de la langue, mais il existe une convention bien connue entre les programmeurs selon laquelle ces propriétés et méthodes ne doivent pas être accessibles de l'extérieur.
90
+
Cela n'est pas appliqué au niveau du langage, mais il existe une convention bien connue entre les programmeurs selon laquelle ces propriétés et méthodes ne doivent pas être accessibles de l'extérieur.
91
91
92
-
Donc notre propriété s'appellera `_waterAmount`:
92
+
Donc notre propriété s'appellera `_waterAmount`:
93
93
94
94
```js run
95
95
classCoffeeMachine {
@@ -123,11 +123,11 @@ Maintenant, l'accès est sous contrôle, donc le réglage de l'eau en dessous de
123
123
124
124
## "power" en lecture seule
125
125
126
-
Pour la propriété `power`, rendons-le en lecture seule. Il arrive parfois qu'une propriété doit être définie au moment de la création, puis ne jamais être modifiée.
126
+
Pour la propriété `power`, rendons-la en lecture seule. Il arrive parfois qu'une propriété doit être définie au moment de la création, puis ne jamais être modifiée.
127
127
128
-
C'est exactement le cas pour une machine à café: la puissance ne change jamais.
128
+
C'est exactement le cas pour une machine à café: la puissance ne change jamais.
129
129
130
-
Pour ce faire, il suffit de définir l'accésseur, mais pas le mutateur:
130
+
Pour ce faire, il suffit de définir l'accésseur, mais pas le mutateur:
Ici, nous avons utilisé la syntaxe accesseur/mutateur.
156
156
157
-
Mais la plupart du temps, les fonctions `get... / set...` sont préférées, comme ceci:
157
+
Mais la plupart du temps, les fonctions `get...` / `set...` sont préférées, comme ceci:
158
158
159
159
```js
160
160
class CoffeeMachine {
@@ -179,7 +179,7 @@ D'un autre côté, la syntaxe accesseur/mutateur est plus courte, donc il n'y a
179
179
````
180
180
181
181
```smart header="Les champs protégés sont hérités"
182
-
Si nous héritons de `classe MegaMachine extends CoffeeMachine`, rien ne nous empêche d'accéder à` this._waterAmount` ou `this._power` à partir des méthodes de la nouvelle classe.
182
+
Si nous héritons de `classe MegaMachine extends CoffeeMachine`, rien ne nous empêche d'accéder à `this._waterAmount` ou `this._power` à partir des méthodes de la nouvelle classe.
183
183
184
184
Les champs protégés sont donc naturellement héritables. Contrairement aux champs privés que nous verrons ci-dessous.
185
185
```
@@ -188,9 +188,9 @@ Les champs protégés sont donc naturellement héritables. Contrairement aux cha
188
188
189
189
[recent browser=none]
190
190
191
-
Il existe une proposition JavaScript finie, presque dans la norme, qui fournit une prise en charge au niveau de la langue pour les propriétés et méthodes privées.
191
+
Il existe une proposition JavaScript finie, presque dans la norme, qui fournit une prise en charge au niveau du langage pour les propriétés et méthodes privées.
192
192
193
-
Les propriétés privées devraient commencer par `#`. Ils ne sont accessibles que de l'intérieur de la classe.
193
+
Les propriétés privées devraient commencer par `#`. Elles ne sont accessibles que de l'intérieur de la classe.
194
194
195
195
Par exemple, voici une propriété privée `#waterLimit` et la méthode privée de vérification du niveau de l'eau `#fixWaterAmount` :
Au niveau de la langue, `#` est un signe spécial que le champ est privé. Nous ne pouvons pas y accéder de l'extérieur ou des classes héritées.
225
+
Au niveau du langage, `#` est un signe spécial spécifiant que le champ est privé. Nous ne pouvons pas y accéder de l'extérieur ou des classes héritées.
226
226
227
227
Les champs privés n'entrent pas en conflit avec les champs publics. Nous pouvons avoir les champs privés `#waterAmount` et publics `waterAmount` en même temps.
228
-
Pour l'exemple, faisons de `waterAmount` un accesseur pour `#waterAmount`:
228
+
Pour l'exemple, faisons de `waterAmount` un accesseur pour `#waterAmount`:
Contrairement aux champs protégés, les champs privés sont imposés par le langage lui-même. C'est une bonne chose.
252
252
253
-
Mais si nous héritons de `CoffeeMachine`, nous n’aurons aucun accès direct à `#waterAmount`. Nous aurons besoin de compter sur l'accesseur/mutateur `waterAmount`:
253
+
Mais si nous héritons de `CoffeeMachine`, nous n’aurons aucun accès direct à `#waterAmount`. Nous aurons besoin de compter sur l'accesseur/mutateur `waterAmount`:
254
254
255
255
```js
256
256
classMegaCoffeeMachineextendsCoffeeMachine {
@@ -267,7 +267,7 @@ Dans de nombreux scénarios, une telle limitation est trop sévère. Si nous ét
267
267
````warn header="Les champs privés ne sont pas disponibles par this[nom]"
268
268
Les champs privés sont spéciaux.
269
269
270
-
Comme nous le savons, nous pouvons généralement accéder aux champs en utilisant `this[name]`:
270
+
Comme nous le savons, nous pouvons généralement accéder aux champs en utilisant `this[name]`:
271
271
272
272
```js
273
273
class User {
@@ -279,23 +279,22 @@ class User {
279
279
}
280
280
```
281
281
282
-
C'est impossible avec les champs privés: `this['#name']` ne fonctionne pas. C'est une limitation de syntaxe pour assurer la confidentialité.
282
+
C'est impossible avec les champs privés: `this['#name']` ne fonctionne pas. C'est une limitation de syntaxe pour assurer la confidentialité.
283
283
````
284
284
285
285
## Résumé
286
286
287
287
En termes de POO, la délimitation de l'interface interne de l'interface externe est appelée [encapsulation]("https://fr.wikipedia.org/wiki/Encapsulation_(programmation)").
288
288
289
-
Cela offre les avantages suivants:
289
+
Cela offre les avantages suivants:
290
290
291
291
Protection des utilisateurs pour qu'ils ne se tirent pas une balle dans le pied
292
292
: Imaginez, il y a une équipe de développeurs utilisant une machine à café. Elle a été fabriquée par la société "Best CoffeeMachine" et fonctionne parfaitement, mais une coque de protection a été retirée. Donc, l'interface interne est exposée.
293
293
294
-
295
294
Tous les développeurs sont civilisés - ils utilisent la machine à café comme prévu. Mais l'un d'entre eux, John, a décidé qu'il était le plus intelligent et a apporté quelques modifications aux éléments internes de la machine à café. La machine à café a donc échoué deux jours plus tard.
296
-
295
+
297
296
Ce n’est sûrement pas la faute de John, mais bien de la personne qui a enlevé le capot de protection et laissé John manipuler.
298
-
297
+
299
298
La même chose en programmation. Si un utilisateur d'une classe va changer des choses qui ne sont pas destinées à être modifiées de l'extérieur, les conséquences sont imprévisibles.
0 commit comments