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
+23-23Lines changed: 23 additions & 23 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
2
2
# Proprietà e metodi privati e protetti
3
3
4
-
Uno dei concetti più importanti della programmazione ad oggetti -- l'incapsulamento, ovvero la delimitazione delle interfacce interne da quelle esterne.
4
+
Uno dei concetti più importanti della programmazione ad oggetti è l'incapsulamento, ovvero la delimitazione delle interfacce interne da quelle esterne.
5
5
6
6
Questa pratica è un "must" nello sviluppo di una qualsiasi applicazione che sia più complessa di "hello world" .
7
7
@@ -11,7 +11,7 @@ Solitamente, i dispositivi che utilizziamo sono piuttosto complessi. Poter delim
11
11
12
12
## Un esempio del mondo reale
13
13
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è! :)
14
+
Prendiamo l'esempio di 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,9 +21,9 @@ 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 caffè sono piuttosto affidabili, giusto? Possono durare per anni, e solamente nel caso in cui qualcosa smetta di funzionare -- le 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 caffè -- tutti i dettagli sono ottimizzati e *nascosti*.
26
+
Il segreto dietro all'affidabilità e alla semplicità di una macchina del caffè è che tutti i dettagli sono ottimizzati e *nascosti*.
27
27
28
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
@@ -36,13 +36,13 @@ Ma per poter nascondere i loro dettagli interni, non utilizzeremo una copertura
36
36
Nella programmazione orientata agli oggetti, le proprietà ed i metodi sono divisi in due gruppi:
37
37
38
38
-*Interfaccia interna* -- metodi e proprietà, accessibili dagli altri metodi della classe, ma non dall'esterno.
39
-
-*Interfaccia esterna* -- metodi e proprietà, accessibili dall'esterno della classe.
39
+
-*Interfaccia esterna* -- metodi e proprietà, accessibili anche dall'esterno della classe.
40
40
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.
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
-
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.
43
+
L'interfaccia interna viene utilizzata per far funzionare l'oggetto, i suoi elementi interagiscono gli uni con gli altri. Ad esempio, la pompa è collegata al meccanismo di riscaldamento.
44
44
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.
45
+
Ma vista dall'esterno, la macchina del caffè è protetta da una copertura, in modo che nessuno possa accedervi. I dettagli sono nascosti ed inaccessibili, ma possiamo sfruttarne le caratteristiche tramite la sua interfaccia esterna.
46
46
47
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
@@ -55,13 +55,13 @@ In JavaScript, esistono due tipi di campi per un oggetto (proprietà e metodi):
55
55
56
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 del linguaggio, ma nella pratica risultano essere molto comodi, per questo vengono spesso emulati.
58
+
I campi protetti non sono implementati in JavaScript a livello di linguaggio, ma nella pratica risultano essere molto utili, per questo vengono spesso emulati.
59
59
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).
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 (anche se potremmo), in modo da mantenere l'esempio semplice.
61
61
62
62
## Protecting "waterAmount"
63
63
64
-
Come prima cosa creiamo una semplice classe per modellare una macchina del caffè:
64
+
Come prima cosa creiamo una semplice classe sul modello di una macchina del caffè:
65
65
66
66
```js run
67
67
classCoffeeMachine {
@@ -81,7 +81,7 @@ let coffeeMachine = new CoffeeMachine(100);
81
81
coffeeMachine.waterAmount=200;
82
82
```
83
83
84
-
Attualmente le proprietà `waterAmount` e `power` sono pubbliche. Possiamo leggerle/modificarle dall'esterno con un qualsiasi valore.
84
+
Per ora le proprietà `waterAmount` e `power` sono pubbliche. Possiamo leggerle/modificarle dall'esterno con un qualsiasi valore.
85
85
86
86
Proviamo a modificare la proprietà `waterAmount` rendendola protetta, in modo da avere un maggior controllo su di essa. Ad esempio, non vorremmo che qualcuno possa impostarla con un valore negativo.
87
87
@@ -188,7 +188,7 @@ Quindi, i metodi protetti vengono ereditati. A differenza di quelli privati, che
188
188
189
189
[recent browser=none]
190
190
191
-
Esiste una proposta JavaScript, quasi standard, che fornisce il supporto per le proprietà ed i metodi privati.
191
+
Esiste una proposta JavaScript in via di approvazione, che fornisce il supporto per le proprietà ed i metodi privati.
192
192
193
193
I campi privati dovrebbero essere preceduti da `#`. Questi saranno accessibili solamente dall'interno della classe.
194
194
@@ -249,7 +249,7 @@ machine.waterAmount = 100;
249
249
alert(machine.#waterAmount); // Errore
250
250
```
251
251
252
-
A differenza di quelli protetti, i campi privati sono forzati dal linguaggio stesso. E questa è una buona cosa.
252
+
A differenza di quelli protetti, i campi privati sono forniti dal linguaggio stesso. E questa è una buona cosa.
253
253
254
254
Nel caso in cui stessimo ereditando da `CoffeeMachine`, allora non avremmo accesso diretto a `#waterAmount`. Dovremmo affidarci al getter/setter `waterAmount`:
255
255
@@ -263,7 +263,7 @@ class MegaCoffeeMachine extends CoffeeMachine {
263
263
}
264
264
```
265
265
266
-
In molti casi, una limitazione del genere è troppo severa. Se estendiamo una `CoffeeMachine`, potremmo giustamente voler accedere ai suoi campi interni. Questo è il motivo per cui i campi protetti vengono usati più spesso, anche se non sono realmente supportati dalla sintassi del linguaggio.
266
+
In molti casi, una limitazione del genere è troppo severa. Se estendiamo una `CoffeeMachine`, potremmo giustamente voler accedere ai suoi campi interni. Questo è il motivo per cui i campi protetti vengono usati più spesso, anche se non sono realmente supportati dalla sintassi del linguaggio.
267
267
268
268
````warn header="I campi privati non sono accessibili come this[name]"
269
269
I campi privati sono speciali.
@@ -290,20 +290,20 @@ In termini di OOP (Programmazione Orientata agli Oggetti), la delimitazione dell
290
290
Fornisce diversi vantaggi:
291
291
292
292
Protezione per gli utenti, in modo che questi non possano spararsi ai piedi
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.
293
+
: Immaginiamo un team di sviluppatori che utilizzi 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 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.
295
+
Tutti gli sviluppatori sono educati, ed utilizzano la macchina del caffè come previsto. Ma uno di loro, John, che crede di essere il più intelligente, effettua alcune modifiche alla macchina, la quale si rompe due giorni dopo.
296
296
297
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
-
Lo stesso vale nella programmazione. Se un utente prova a cambiare campi che non dovrebbero essere modificati dall'esterno -- le conseguenze sono imprevedibili.
299
+
Lo stesso vale nella programmazione. Se un utente prova a cambiare campi che non dovrebbero essere modificati dall'esterno, le conseguenze saranno imprevedibili.
300
300
301
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.
302
+
: La situazione, nella programmazione, è più complessa rispetto ad una macchina del caffè reale, la quale viene semplicemente comprata ed utilizzata. Il codice è costantemente soggetto a 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, ti farà piacere 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
@@ -312,11 +312,11 @@ Nasconde la complessità
312
312
313
313
I programmatori non fanno eccezione.
314
314
315
-
**E' sempre molto conveniente quando i dettagli dell'implementazione sono nascosti. Una semplice documentazione dell'interfaccia esterna è molto più comoda.**
315
+
**E' sempre preferibile nascondere i dettagli implementativi e fornire una semplice e ben documentata interfaccia esterna.**
316
316
317
-
Per nasconde i componenti interni di uninterfaccia posiamo utilizzare le proprietà protette o private:
317
+
Per nasconde i componenti interni di un'interfaccia possiamo utilizzare le proprietà protette o private:
318
318
319
-
- I campi protetti vengono preceduti da `_`. Questa è una convenzione piuttosto diffusa, non forzata a livello di linguaggio. I programmatori dovrebbero sempre accedere ai campi preceduti da `_` solamente dalla classe o dalle sue sotto-clasi.
319
+
- I campi protetti vengono preceduti da `_`. Questa è una convenzione ben conosciuta, non implementata a livello di linguaggio. I programmatori dovrebbero sempre accedere ai campi preceduti da `_` solamente dalla classe stessa o dalle sue sotto-classi.
320
320
- I campi privati vengono preceduti da `#`. JavaScript si assicura che questi siano accessibili solamente dalla loro classe.
321
321
322
322
Attualmente, i campi privati non sono completamente supportati dai browser, ma esistono dei polyfill.
0 commit comments