Qual è la differenza tra "nascondere i dati" e "incapsulamento"?


29

Sto leggendo "Concorrenza Java in pratica" e si dice: "Fortunatamente, le stesse tecniche orientate agli oggetti che ti aiutano a scrivere classi ben organizzate e gestibili - come l'incapsulamento e il nascondimento dei dati - possono anche aiutarti a creare thread-safe classi."

Il problema n. 1: non ho mai sentito parlare del nascondere i dati e non so di cosa si tratti.

Il problema n. 2: ho sempre pensato che l'incapsulamento stesse usando il privato rispetto al pubblico, e in realtà sta nascondendo i dati.

Puoi spiegarci quali sono i dati nascosti e in che modo differiscono dall'incapsulamento?


2
Leggi il codice completo 2a edizione . Risponderà a molte delle tue domande.
Shiplu Mokaddim,

Per quanto riguarda il nascondimento delle informazioni, consultare: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis,

Questo collegamento ha utili intuizioni su queste informazioni. Nascondendo un principio di progettazione, si specifica che una decisione di progettazione dovrebbe essere nascosta dal resto del sistema per evitare accoppiamenti involontari. Dovrebbe informare il modo in cui incapsuli le cose, ma ovviamente non è necessario. L'incapsulamento è una funzione del linguaggio di programmazione.
Abhijeet,

Risposte:


19

Nascondere dati e informazioni è una nozione più ampia, che si trova nell'informatica e nell'ingegneria del software. Si riferisce al fatto che quelle parti di un programma per computer che possono cambiare non devono essere accessibili da altri moduli / dai client.

Incapsulamento è un termine che si trova nel paradigma orientato agli oggetti e si riferisce al mantenimento dei dati in campi privati ​​e alla loro modifica solo attraverso metodi.

Pertanto l' incapsulamento può essere visto come un modo per ottenere il nascondimento dei dati in sistemi orientati agli oggetti .


1
Grazie per la risposta. Ancora non capisco, perché se nascondere i dati è lo stesso ma solo un po 'più ampio dell'incapsulamento, nel libro si fa riferimento come se fossero di ampiezza simile e non uno incluso l'altro.
dhblah,

Gli autori probabilmente fanno la differenza dal nascondere i dati e dal nascondere le informazioni, nel senso che il nascondersi dei dati nasconde solo le strutture dei dati - i campi privati ​​- mentre il nascondimento delle informazioni può riferirsi a incapsulare dettagli di implementazione (algoritmi usati ad esempio) che la comunicazione avviene solo attraverso interfacce.
m3th0dman,

2
Puoi averne uno senza avere l'altro - guarda Python, dove non ci sono affatto dati nascosti (niente come un attributo privato o protetto).
Latty,

Il punto di @Lattyware è molto vero e importante. Si può anche avere incapsulamento (secondo la vostra definizione, a cui mi oppongo a causa di ciò che sto descrivendo qui) senza nascondere nulla, vale a dire esponendo ciecamente un getter banale e setter per ogni membro. Ciò non nasconde nulla e non impedisce nulla, ma soddisfa la definizione comune di incapsulamento della lettera.

1
L'incapsulamento non mantiene i dati in campo privato, ciò significa nascondere più informazioni. L'incapsulamento, in generale, è il concetto di mettere insieme (incapsulare) informazioni / dati e metodi in una classe.
nbro,

6

Incapsulamento e occultamento dei dati sono termini correlati. È importante capire che sorgono in relazione all'astrazione . Booch et. al. in Object-Oriented Analysis and Design con le applicazioni , spiega,

Astrazione e incapsulamento sono concetti complementari: l'astrazione si concentra sul comportamento osservabile di un oggetto, mentre l'incapsulamento si concentra sull'implementazione che dà origine a questo comportamento. L'incapsulamento si ottiene più spesso attraverso il nascondimento delle informazioni (non solo il nascondimento dei dati), che è il processo per nascondere tutti i segreti di un oggetto che non contribuiscono alle sue caratteristiche essenziali; in genere, la struttura di un oggetto è nascosta, così come l'implementazione dei suoi metodi.


5

La creazione di una classe include il concetto di incapsulamento. Quando crei una classe inserisci dati e comportamenti all'interno della classe e la classe diventa un'unità che chiamiamo oggetto. Quindi nascondere i dati fa parte dell'incapsulamento.


4

Da Wikipedia :

In un linguaggio di programmazione, l' incapsulamento è usato per riferirsi a una di due nozioni correlate ma distinte, e talvolta alla loro combinazione:

  • Un meccanismo linguistico per limitare l'accesso ad alcuni componenti dell'oggetto.
  • Un costrutto linguistico che facilita il raggruppamento di dati con i metodi (o altre funzioni) che operano su tali dati.

Alcuni ricercatori e accademici del linguaggio di programmazione usano il primo significato da solo o in combinazione con il secondo come caratteristica distintiva della programmazione orientata agli oggetti, mentre altri linguaggi di programmazione che forniscono chiusure lessicali vedono l'incapsulamento come una caratteristica del linguaggio ortogonale all'orientamento agli oggetti.

La seconda definizione è motivata dal fatto che in molte lingue OOP il nascondersi dei componenti non è automatico o può essere ignorato; quindi, nascondere le informazioni è definito come una nozione separata da coloro che preferiscono la seconda definizione.


Grazie per la tua risposta. A domande di follow-up: 1) il linguaggio di programmazione Java ha strutture a cui fa riferimento la seconda nozione relativa all'incapsulamento? 2) Non capisco perché l'override dei dati nascosti sia importante. Ad esempio in Java puoi accedere a qualsiasi campo (pubblico o privato) tramite la riflessione.
dhblah,

@Software Engeneering Learner: le classi come costrutti del codice sorgente rappresentano la seconda nozione. Per quanto riguarda il nascondere le informazioni, il punto è che limitare la portata dei dati si basa spesso su meccanismi linguistici specifici e separati.
Michael Borgwardt,

2

Spesso sono usati in modo intercambiabile nella discussione, e spesso penso che lavorino insieme per raggiungere lo stesso scopo e, sebbene ciò che segue potrebbe non essere completamente accurato, può fornire una distinzione significativa, se è necessario fare una distinzione:

Quando si parla di incapsulamento, spesso viene implementato come meccanismo procedurale / funzionale. Esiste un tipo di protezione per lo stato sottostante e l'accesso attraverso la protezione richiede che alcuni protocolli vengano seguiti per ottenere l'accesso (leggere o modificare lo stato desiderato). L'incapsulamento offre anche la possibilità che si verifichino effetti collaterali a causa dell'accesso (come il cambiamento dello stato in cascata, o la notifica / l'inoltro di un evento / l'emissione di un segnale quando la cosa di interesse viene letta o modificata) in modo da poter avviare azioni di follow-up. Ancora una volta, penso spesso all'incapsulamento come a un concetto che viene implementato come una procedura.

Vedo che il concetto di nascondere i dati è simile allo scopo dell'incapsulamento; tuttavia, il meccanismo è strutturale e funziona a un livello diverso. In pratica, invece di fornire un meccanismo di protezione e di effetti collaterali attraverso la procedura, lo stato è protetto e influenzato attraverso meccanismi strutturali del linguaggio e del tempo di esecuzione. Questi tipi di guardie sarebbero clausole di visibilità, definizioni di tipi, ereditarietà e simili. Gli effetti collaterali che puoi sfruttare dagli oggetti strutturalmente custoditi sono di nuovo qualcosa che dipende dal linguaggio e dal runtime: forse l'attivazione degli oggetti, il conteggio dei riferimenti o qualcosa del genere.


0

Sono spesso, forse di solito, usati in modo intercambiabile. Ma nota la citazione di Booch sopra riportata, "L'incapsulamento si ottiene più spesso nascondendo le informazioni ..." cioè il più delle volte, ma non sempre in tutti i casi.

Si noti che Python consente il rollup dei dati nelle classi, ma non consente le variabili private. Quindi si potrebbe dire che Python fornisce l'incapsulamento senza nascondere i dati.

Potresti fare la stessa cosa in Java creando tutte le variabili del tuo membro public, ma oltre a dare a tutti un attacco di cuore, perderesti il ​​vantaggio di nascondere i dati ... vale a dire preservare la semantica di un oggetto limitando l'accesso al suo stato.


0

In OO, l' incapsulamento è dove le informazioni sono contenute all'interno di un oggetto. Ad esempio, a Personha nameae i clienti di Persona (cioè tu) sanno che Persona ha un nome, tramite campi pubblici o metodi di accesso. E, si spera, non è necessario conservare anche i nomi in una serie globale di nomi, ecc. Quindi questo è un grande passo per evitare un codice spaghetti ingestibile. Ma il cliente deve ancora sapere qualcosa su come la persona gestisce i nomi: ad esempio spazio o delimitato da virgole?

Nascondersi ai dati è dove Personha un campo nome, ma, almeno in teoria, nessuno lo sa . Il campo è privato senza metodi di accesso pubblico. I clienti possono passare un nome da un record di database, XML, HTTP POST, qualunque cosa, ma il funzionamento interno di come la persona gestisce il nome è una "scatola nera". Le future implementazioni di Person sono libere di cambiare, ad esempio, per passare ad avere a firstNamee a lastName.

In un mondo ideale il Data Hiding è superiore all'incapsulamento, ma non tutti i mondi sono ideali. :-)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.