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
+31-31Lines changed: 31 additions & 31 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,11 +7,11 @@ Questa pratica è un "must" nello sviluppo di una qualsiasi applicazione che sia
7
7
8
8
Per comprenderla, usciamo dal mondo dello sviluppo e guardiamo al mondo reale.
9
9
10
-
Solitamente, i dispositivi che utilizziamo sono piuttosto complessi. Ma poter delimitare la loro interfaccia interna da quelal esterna, ci consente di utilizzarli senza grossi problemi.
10
+
Solitamente, i dispositivi che utilizziamo sono piuttosto complessi. Poter delimitare la loro interfaccia interna da quella esterna, ci consente di utilizzarli senza grossi problemi.
11
11
12
-
## Un esempio nel mondo reale
12
+
## Un esempio del mondo reale
13
13
14
-
Ad esempio, una macchina del caffe. Semplice all'esterno: un bottone, un dispaly, un paio di fori... E, ovviamente, il risultato -- un ottimo caffe! :)
14
+
Ad esempio, una macchina del caffè. Semplice all'esterno: un bottone, un dispaly, un paio di fori... E, ovviamente, il risultato -- un ottimo caffè! :)
15
15
16
16

17
17
@@ -21,15 +21,15 @@ Ma internamente... (una rappresentazione dei suoi componenti)
21
21
22
22
Ci sono molti dettagli. Ma riusciamo comunque ad utilizzarla anche senza conoscerli.
23
23
24
-
Le macchine del caffe sono piuttosto affidabili, giusto? Possono durare per anni, e solamente nel caso in cui qualcosa smetta di funzionare -- la portiamo a riparare.
24
+
Le macchine del caffè sono piuttosto affidabili, giusto? Possono durare per anni, e solamente nel caso in cui qualcosa smetta di funzionare -- le portiamo a riparare.
25
25
26
-
Il segreto dietro all'affidabilità e alla semplicità di una macchina del caffe -- tutti i dettagli sono ottimizzati e *nascosti*.
26
+
Il segreto dietro all'affidabilità e alla semplicità di una macchina del caffè -- tutti i dettagli sono ottimizzati e *nascosti*.
27
27
28
-
Se rimuovessimo la copertura della macchina del caffe, allora il suo utilizzo sarebbe molto più complesso (dove dovremmo premere?), e pericoloso (potremmo prendere la scossa).
28
+
Se rimuovessimo la copertura della macchina del caffè, allora il suo utilizzo sarebbe molto più complesso (dove dovremmo premere?), e pericoloso (potremmo prendere la scossa).
29
29
30
-
Come vedremo in seguito, nella programmazione, gli oggetti, sono come le macchine del caffe.
30
+
Come vedremo in seguito, nella programmazione gli oggetti sono come le macchine del caffè.
31
31
32
-
Ma per poter nascondere i loro dettagli interni, non utilizzeremo una copertura di sicurezza, ma piuttosto un speciale sintassi del linguaggio ed alcune convenzioni.
32
+
Ma per poter nascondere i loro dettagli interni, non utilizzeremo una copertura di sicurezza, ma piuttosto una speciale sintassi del linguaggio ed alcune convenzioni.
33
33
34
34
## Interfaccia interna ed esterna
35
35
@@ -38,13 +38,13 @@ Nella programmazione orientata agli oggetti, le proprietà ed i metodi sono divi
38
38
-*Interfaccia interna* -- metodi e proprietà, accessibili dagli altri metodi della classe, ma non dall'esterno.
39
39
-*Interfaccia esterna* -- metodi e proprietà, accessibili dall'esterno della classe.
40
40
41
-
Continuando con l'analogia della macchina del caffe -- ciò che è nascosto internamente: una pompa, un meccanismo di riscaldamento e cosi via -- al sua interfaccia interna.
41
+
Continuando con l'analogia della macchina del caffè -- ciò che è nascosto internamente: una pompa, un meccanismo di riscaldamento e così via -- è la sua interfaccia interna.
42
42
43
43
L'interfaccia interna viene utilizzata per far funzionare l'oggetto, ogni dettaglio viene utilizzato da altri elementi. Ad esempio, la pompa è collegata al meccanismo di riscaldamento.
44
44
45
45
Ma vista dall'esterno, la macchina del caffe è protetta da una copertura, in modo che nessuno possa accedervi. I dettagli sono nascosti ed inaccesibili. Possiamo sfruttarne le caratteristiche tramite la sua interfaccia esterna.
46
46
47
-
Quindi, tutto ciò di cui abbiamo bisogno per utilizzare un oggetto è la sua interfaccia esterna. Potremmo essere completamente inconsapevoli del suo funzionamento interno, ciò sarebbe la situazione ottimale.
47
+
Quindi, tutto ciò di cui abbiamo bisogno per utilizzare un oggetto è la sua interfaccia esterna. Potremmo essere completamente inconsapevoli del suo funzionamento interno; e ciò andrebbe bene.
48
48
49
49
Questa era un'introduzione generale.
50
50
@@ -53,15 +53,15 @@ In JavaScript, esistono due tipi di campi per un oggetto (proprietà e metodi):
53
53
- Pubblici: accessibili ovunque. Questi ne definiscono l'interfaccia esterna. Finora abbiamo sempre utilizzato proprietà e metodi pubblici.
54
54
- Privati: accessibili solamente dall'interno della classe. Questi ne definiscono l'interfaccia interna.
55
55
56
-
In molti altri linguaggi di programmazione esiste anche il concetto di campo "protected" (protetto): accessibile solamente dall'interno della classe e da quelle che al estendono (come i campi privati, ma in aggiunta sono accessibili anche dalle classi che ereditano). Questi sono altrettanto utili per la definizione dell'interfaccia interna. Generalmente sono più diffusi dei campi privati, poiché solitamente la nostra intenzione è quella di renderli accessibili anche nelle sotto-classi.
56
+
In molti altri linguaggi di programmazione esiste anche il concetto di campo "protected" (protetto): accessibile solamente dall'interno della classe e da quelle che la estendono (come i campi privati, ma in aggiunta sono accessibili anche dalle classi che ereditano). Questi sono altrettanto utili per la definizione dell'interfaccia interna. Generalmente sono più diffusi dei campi privati, poiché solitamente la nostra intenzione è quella di renderli accessibili anche nelle sotto-classi.
57
57
58
-
I campi protetti non sono implementati in JavaScript a livello di linguaggio, ma nella pratica risultano essere molto comodi, per questo vengono spesso emulati.
58
+
I campi protetti non sono implementati in JavaScript a livello del linguaggio, ma nella pratica risultano essere molto comodi, per questo vengono spesso emulati.
59
59
60
-
Ora costruiremo una macchina del caffe in JavaScript con tutti i tipi di proprietà descritti. Una macchina del caffe è composta da molti dettagli, non la modelleremo per intero, in modo da tenere l'esempio semplice (anche se potremo).
60
+
Ora costruiremo una macchina del caffè in JavaScript, con tutti i tipi di proprietà descritti. Una macchina del caffè è composta da molti dettagli; non la modelleremo per intero, in modo da mantenere l'esempio semplice (anche se potremmo).
61
61
62
62
## Protecting "waterAmount"
63
63
64
-
Come prima cosa creiamo una semplice classe per modellare una macchina del caffe:
64
+
Come prima cosa creiamo una semplice classe per modellare una macchina del caffè:
65
65
66
66
```js run
67
67
classCoffeeMachine {
@@ -74,7 +74,7 @@ class CoffeeMachine {
74
74
75
75
}
76
76
77
-
// creiamo la macchina del caffe
77
+
// creiamo la macchina del caffè
78
78
let coffeeMachine =newCoffeeMachine(100);
79
79
80
80
// aggiungiamo acqua
@@ -87,7 +87,7 @@ Proviamo a modificare la proprietà `waterAmount` rendendola protetta, in modo d
87
87
88
88
**Le proprietà protette, solitamente, vengono prefissate con un underscore `_`.**
89
89
90
-
Questa non è una forzatura del linguaggio, ma piuttosto una convenzione piuttosto diffusa tra i programmatori, che specifica che queste proprietà e metodi non dovrebbero essere accedute dall'esterno.
90
+
Questa non è una forzatura del linguaggio, ma piuttosto una convenzione diffusa tra i programmatori, che specifica che queste proprietà e metodi non dovrebbero essere accessibili dall'esterno.
91
91
92
92
Quindi la nostra proprietà diventa `_waterAmount`:
93
93
@@ -112,7 +112,7 @@ class CoffeeMachine {
112
112
113
113
}
114
114
115
-
// creiamo la macchina del caffe
115
+
// creiamo la macchina del caffè
116
116
let coffeeMachine =newCoffeeMachine(100);
117
117
118
118
// aggiungiamo acqua
@@ -125,7 +125,7 @@ Ora l'accesso è sotto controllo, quindi non è più possibile impostare la quan
125
125
126
126
Proviamo a rendere la proprietà `power` come read-only (sola lettura). In alcuni casi, potremmo aver bisogno di definire una proprietà in fase di costruzione, e non volerla più modificare in seguito.
127
127
128
-
Questo è esattamente il caso per un macchina del caffe: la potenza non può variare.
128
+
Questo è esattamente il caso per un macchina del caffè: la potenza non può variare.
129
129
130
130
Per farlo, possiamo semplicemente definire un getter, e nessun setter:
131
131
@@ -143,7 +143,7 @@ class CoffeeMachine {
143
143
144
144
}
145
145
146
-
// creiamo la macchina del caffe
146
+
// creiamo la macchina del caffè
147
147
let coffeeMachine =newCoffeeMachine(100);
148
148
149
149
alert(`Power is: ${coffeeMachine.power}W`); // Power is: 100W
Ma nella maggior parte dei casi, le funzioni `get.../set...`, si preferisce definirle in questo modo:
157
+
Ma nella maggior parte dei casi, le funzioni `get.../set...` si preferisce definirle in questo modo:
158
158
159
159
```js
160
160
class CoffeeMachine {
161
161
_waterAmount = 0;
162
162
163
163
*!*setWaterAmount(value)*/!* {
164
-
i (value < 0) value = 0;
164
+
if (value < 0) value = 0;
165
165
this._waterAmount = value;
166
166
}
167
167
@@ -226,7 +226,7 @@ A livello di linguaggio, `#` è un carattere speciale per indicare che quel camp
226
226
227
227
Inoltre i campi privati non entrano in conflitto con quelli pubblici. Possiamo avere sia un campo privato `#waterAmount` che uno pubblico `waterAmount`.
228
228
229
-
Ad esempio, facciamo si che `waterAmount` sia una proprietà per accedere a `#waterAmount`:
229
+
Ad esempio, facciamo sì che `waterAmount` sia una proprietà per accedere a `#waterAmount`:
A differenza di quelli protetti, i campi privati sono forzati dal linguaggio stesso. E questa è una buona cosa.
253
253
254
-
Nel caso in cui stessimo ereditando da `CoffeeMachine`, allora non avremo accesso diretto a `#waterAmount`. Dovremo affidarci al getter/setter `waterAmount`:
254
+
Nel caso in cui stessimo ereditando da `CoffeeMachine`, allora non avremmo accesso diretto a `#waterAmount`. Dovremmo affidarci al getter/setter `waterAmount`:
255
255
256
256
```js
257
257
classMegaCoffeeMachineextendsCoffeeMachine {
@@ -285,30 +285,30 @@ Con i campi privati questo è impossibile: `this['#name']` non funzionerebbe. Qu
285
285
286
286
## Riepilogo
287
287
288
-
In termini di OOP (Programmazione Orientata agli Oggetti), la delimitazione dell'interfaccia interna da quella esterna, si chiama [incapsulamento](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)).
288
+
In termini di OOP (Programmazione Orientata agli Oggetti), la delimitazione dell'interfaccia interna da quella esterna si chiama [incapsulamento](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)).
289
289
290
290
Fornisce diversi vantaggi:
291
291
292
292
Protezione per gli utenti, in modo che questi non possano spararsi ai piedi
293
-
: Immaginiamo ci sia un team di sviluppatori che utilizzano una macchina del caffe. Costruita dall'azienda "Best CoffeeMachine", che funziona correttamente, ma la protezione viene rimossa. In questo modo, la sua interfaccia interna viene esposta.
293
+
: Immaginiamo un team di sviluppatori che utilizzano una macchina del caffè costruita dall'azienda "Best CoffeeMachine", che funziona correttamente, ma la cui protezione viene rimossa. In questo modo, la sua interfaccia interna viene esposta.
294
294
295
-
Tutti gli sviluppatori sono civilizzati -- utilizzano la macchina del caffe come previsto. Ma uno di loro, Jhon, che crede di essere il più intelligente, ed effettua alcune modifiche ai componenti della macchina. La macchina del caffe si rompe due giorni dopo.
295
+
Tutti gli sviluppatori sono civilizzati -- utilizzano la macchina del caffè come previsto. Ma uno di loro, John, che crede di essere il più intelligente, effettua alcune modifiche alla macchina. Che si rompe due giorni dopo.
296
296
297
-
Questa non è sicuramente colpa di Jhon, ma piuttosto della persona che ha rimosso la protezione e ha permesso a Jhon di manometterla.
297
+
Questa non è sicuramente colpa di John, ma piuttosto della persona che ha rimosso la protezione e ha permesso a John di manometterla.
298
298
299
299
Lo stesso vale nella programmazione. Se un utente prova a cambiare campi che non dovrebbero essere modificati dall'esterno -- le conseguenze sono imprevedibili.
300
300
301
-
Manutenibili
302
-
: La situazione nella programmazione rispetto ad una macchina del caffe, poiché non la compriamo solamente una volta. Il codice è costantemente sotto sviluppo e miglioramenti.
301
+
Sostenibile
302
+
: La situazione, nella programmazione, è più complessa rispetto ad una macchina del caffe, poiché non la compriamo solamente una volta. Il codice è costantemente sotto sviluppo e miglioramenti.
303
303
304
304
**Se limitiamo l'accesso all'interfaccia interna, allora lo sviluppatore della classe ha la possibilità di modificarla, anche senza dover informare gli utenti.**
305
305
306
-
Se sei lo sviluppatore di una classe di questo tipo, è ottimo sapere che i metodi privati possono essere rinominati in totale sicurezza, i parametri possono essere modificati, o addirittura rimossi, poiché nessun codice esterno dipende da questi.
306
+
Se sei lo sviluppatore di una classe di questo tipo, è ottimo sapere che i metodi privati possono essere rinominati in totale sicurezza; i parametri possono essere modificati, o addirittura rimossi, poiché nessun codice esterno dipende da questi.
307
307
308
308
Per gli utenti, quando esce una nuova versione, questa potrebbe essere cambiata completamente al suo interno, ma l'aggiornamento rimane comunque un'operazione semplice se la sua interfaccia esterna è rimasta la stessa.
309
309
310
310
Nasconde la complessità
311
-
: Le persone adorano utilizzare cose semplici. Almeno esternamente. Ciò che è internamente è una questione diversa.
311
+
: Le persone adorano utilizzare cose semplici. Almeno esternamente. Ciò che è interno è una questione diversa.
0 commit comments