Perché l’incapsulamento è una caratteristica importante dei linguaggi OOP?

Mi sono imbattuto in interviste diverse in cui mi è stato chiesto di sapere perché viene utilizzato l’incapsulamento? Il cui requisito è in realtà l’incapsulamento? È per gli utenti del programma? O è per i colleghi? O è per proteggere il codice dagli hacker?

L’incapsulamento aiuta a isolare i dettagli dell’implementazione dal comportamento esposto ai client di una class (altre classi / funzioni che utilizzano questa class) e offre un maggiore controllo sull’accoppiamento nel codice. Considera questo esempio, simile a quello del libro Clean Code di Robert Martin:

public class Car { //... public float GetFuelPercentage() { /* ... */ }; //... private float gasoline; //... } 

Si noti che il cliente che utilizza la funzione che fornisce la quantità di carburante nell’auto non si preoccupa del tipo di carburante utilizzato dall’auto. Questa astrazione separa la preoccupazione (Quantità di carburante) dal dettaglio non importante (in questo contesto): se si tratta di gas, petrolio o altro.

La seconda cosa è che l’autore della class è libero di fare tutto ciò che vuole con gli interni della class, ad esempio cambiando benzina al petrolio, e altre cose, purché non cambino il suo comportamento. Questo è dovuto al fatto che possono essere sicuri che nessuno dipende da questi dettagli, perché sono privati. Meno dipendenze ci sono nel codice più flessibile e più facile da mantenere.

Un’altra cosa, correttamente annotata nella risposta sottovalutata da utnapistim : l’accoppiamento basso aiuta anche a testare il codice e a mantenere quei test. L’interfaccia della class meno complicata è, più facile da testarla. Senza incapsulamento, con tutto ciò che è stato esposto sarebbe difficile comprendere cosa testare e come.

Per ribadire alcune discussioni nei commenti:

  • No, l’incapsulamento non è la cosa più importante in OOP. Oserei anche dire che non è molto importante. Le cose importanti sono incoraggiate dall’incapsulamento, come l’accoppiamento libero. Ma non è essenziale – uno sviluppatore attento può mantenere un accoppiamento libero senza incapsulare variabili ecc. Come sottolineato da vlastachu , Python è un buon esempio di un linguaggio che non ha meccanismi per forzare l’incapsulamento, tuttavia è ancora fattibile per OOP.

  • No, hide i tuoi campi dietro gli accessor non è incapsulamento . Se l’unica cosa che hai fatto è scrivere “privato” davanti alle variabili e poi fornire irrispettosamente coppia get / set per ognuna di esse, quindi in realtà non sono incapsulate. Qualcuno in un luogo distante nel codice può ancora interferire con gli interni della tua class, e può ancora dipendere da loro (beh, ovviamente è un po ‘ meglio che dipendono da un metodo, non da un campo).

  • No, l’objective principale dell’incapsulamento non è quello di evitare errori. Gli obiettivi primari sono almeno simili a quelli sopra elencati e pensare che l’incapsulamento ti difenda dal commettere errori è ingenuo. Ci sono solo molti altri modi per commettere un errore oltre a modificare una variabile privata. E modificare una variabile privata non è così difficile da trovare e correggere. Ancora una volta – Python è un buon esempio per il gusto di questo argomento, in quanto può avere l’incapsulamento senza imporlo.

L’incapsulamento impedisce alle persone che lavorano sul tuo codice di commettere errori, assicurandosi che accedano solo alle cose a cui dovrebbero accedere.

L’incapsulamento consente di formalizzare le interfacce, separando i livelli di astrazione (ad esempio “la logica dell’applicazione accede al codice IO solo in questo e in questo modo”).

Ciò a sua volta, consente di modificare l’implementazione di un modulo (i dati e gli algoritmi all’interno del modulo) senza modificare l’interfaccia (e influire sul codice client).

Questa capacità di modificare i moduli indipendentemente l’uno dall’altro migliora la capacità di misurare le prestazioni e fare previsioni nelle scadenze di un progetto.

Consente inoltre di testare separatamente i moduli e riutilizzarli in altri progetti (poiché l’incapsulamento riduce anche l’interdipendenza e migliora la modularità del codice).

Non imporre l’incapsulamento tende a portare al fallimento di un progetto (il problema cresce con la complessità del progetto).

Almeno nella maggior parte delle lingue OO, l’incapsulamento è approssimativamente equivalente alla serratura della porta di un bagno.

Non è destinato a tenere nessuno fuori se davvero insistono a entrare.

È inteso come una cortesia per far sapere che l’ingresso porterà principalmente a:

  1. imbarazzo, e
  2. un pasticcio puzzolente.

Ho architettato un progetto accelerato. L’incapsulamento riduce la propagazione del cambiamento attraverso il sistema. Le modifiche costano tempo e denaro.

Quando il codice non è incapsulato, una persona deve cercare molti file per trovare dove apportare le modifiche. Al contrario, c’è la domanda “Ho trovato tutti i posti?” e l’altro punto “quale effetto ha l’intero sistema per fare tutti questi cambiamenti di dispersione?”

Sto lavorando su un dispositivo medico incorporato e la qualità è imperativa. Inoltre, tutte le modifiche devono essere documentate, revisionate, testate unitamente e infine eseguite un test di sistema. Utilizzando l’incapsulamento, possiamo ridurre il numero di modifiche e la loro localizzazione, riducendo il numero di file che devono essere ripetuti.