Per quello che so, l'incapsulamento è utile perché:
- se si utilizza direttamente un attributo e si cambia il suo tipo in un linguaggio tipizzato statico, è necessario modificare tutto il codice che utilizza la classe. Al contrario, se hai dichiarato getter e setter per quell'attributo, non devi farlo
- nasconde il funzionamento interno della tua classe, utile se, ad esempio, stai offrendo un'API
- evita che un'altra classe che eredita la tua classe sovrascriva attributi o metodi
Le mie considerazioni sul linguaggio di programmazione dinamico digitato e interpretato sono:
- poiché i tipi sono dinamici, non è necessario incapsulare la classe per questo motivo
- puoi vedere il codice di un linguaggio interpretato, quindi penso che non ci sia un modo per nascondere realmente la tua API
- questo potrebbe essere un problema quando questo non è intenzionale, ma la mia opinione è che dovrebbe essere meglio fare attenzione alla sovrascrittura involontaria invece di limitare di default questa possibilità. Python è un buon esempio: se dichiari, ad esempio, il nome di un attributo o metodo che lo avvia con un doppio trattino basso, puoi dichiararlo anche in una classe ereditata, ma sono minacciati come due variabili distinte anche se hanno lo stesso nome (grazie delnan)
un nome di metodo che inizia con un carattere "_" genera un avviso se sovrascritto da un metodo di una classe ereditaria.
Mi manca qualcosa di importante?