Certo, uno sviluppatore con accesso al codice sorgente potrebbe iniziare a manipolare ciò che vuole. E nel processo rende qualcosa di molto fragile e non gestibile.
Rendendo il più privato possibile, rispettando questo, e mostrando solo interfacce ben definite, puoi semplificare il cambiamento delle cose dietro la scena, per esempio, correggere bug o migliorare le prestazioni. Se un altro codice fa casino con le variabili, allora le modifiche sono piuttosto difficili, perché causeranno l'interruzione dell'altro codice.
Non sono sicuro di come Javascript gestisca la privacy, ma in linguaggi come Java e C ++ c'è un supporto per il compilatore per rafforzare la privacy.
Considera una classe che rappresenta un indirizzo IP:
public class IpAddress {
public string ipAddress;
}
Al momento, chiunque può inserire qualsiasi cosa in ipAddress (è un campo pubblico).
IpAddress ia = new IpAddress();
ia.ipAddress = "weeeee!";
Ultimo controllo, weeeee!
non era un indirizzo IP valido. Ma, rendendolo privato, possiamo assicurarci che gli indirizzi non validi vengano buttati fuori. Naturalmente, avremo ancora bisogno di un modo per accedervi e aggiornarlo. Quindi creiamo metodi pubblici:
public class IpAddress {
private string ipAddress;
public string toString() {
return ipAddress;
}
public boolean setipAddress(string newIp) {
if (isValid(newIp)) {
ipAddress = newIp;
return true;
} else {
return false;
}
}
}
Nota che ora abbiamo ancora accesso al valore dell'indirizzo IP e possiamo aggiornarlo, ma ora possiamo essere sicuri che quando viene aggiornato, il nuovo valore è un valore valido, invece di qualcosa come weeeee!
.
ia.ipAddress = "this won't compile";
ia.setipAddress("This won't update the address");
ia.setipAddress("192.168.0.1"); // works
Allo stesso modo, se decidessimo che string
è un modo scadente di memorizzare un indirizzo IP? Forse un quartetto di int
s sarebbe meglio. Prima, quando il campo ipAddress
era pubblico, qualsiasi codice che lo utilizzava, o semplicemente per visualizzarlo o per modificarlo, si interrompeva se provassimo a modificare il nostro schema di archiviazione. Ma dal momento che stiamo usando metodi pubblici per l'accesso invece di accedere direttamente al campo, possiamo farlo senza rompere nulla:
public class IpAddress {
private int part1;
private int part2;
private int part3;
private int part4;
public string toString() {
return "" + part1 "." + part2 + "." + part3 + "." + part4;
}
public boolean setipAddress(string newIp) {
if (isValid(newIp)) {
part1 = extractOct(newIp,1);
part2 = extractOct(newIp,2);
part3 = extractOct(newIp,3);
part4 = extractOct(newIp,4);
return true;
} else {
return false;
}
}
}
Dal punto di vista di chiunque usi questa classe, sembra che questo stia memorizzando l'indirizzo IP come string
o quattro int
s:
public class IpAddress {
public string toString()
public boolean setIpAddress(string newIp)
}
e non hanno bisogno di sapere, o si preoccupano che le cose siano cambiate dietro le quinte. *
* In generale. Alcuni casi rari potrebbero interessare. Per esempio. i sistemi in tempo reale possono essere sensibili ai cambiamenti delle prestazioni, sia più veloci che più lenti.