Qual è la differenza tra "data hiding" e "incapsulamento"?

27

Sto leggendo "Concurrency Java in pratica" e viene detto: "Fortunatamente, le stesse tecniche orientate agli oggetti che aiutano a scrivere classi ben organizzate e mantenibili, come incapsulamento e nascondimento dei dati, possono anche aiutare a creare classi thread-safe. "

Il problema n. 1 - Non ho mai sentito parlare di dati nascosti e non so cosa sia.

Il problema n. 2 - Ho sempre pensato che l'incapsulamento stia usando private vs public, e in realtà è il nascondiglio dei dati.

Puoi spiegare quali sono i dati nascosti e in che modo differisce dall'incapsulazione?

    
posta dhblah 04.11.2012 - 11:05
fonte

7 risposte

19

Nascondere dati e informazioni sono nozioni più ampie, trovate in informatica e in inglese; Ingegneria 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.

L'incapsulamento è un termine che si trova nel paradigma orientato agli oggetti e si riferisce al mantenimento dei dati nei campi privati e alla modifica solo attraverso i metodi.

Quindi l'incapsulamento può essere visto come un modo per ottenere l'occultamento dei dati nei sistemi orientati agli oggetti .

    
risposta data 04.11.2012 - 11:23
fonte
5

Incapsulamento e occultamento dei dati sono termini correlati. È importante capire che si presentano in relazione a Astrazione . Booch et. al. in Analisi orientata agli oggetti e progettazione con applicazioni spiega,

Abstraction and encapsulation are complementary concepts: Abstraction focuses on the observable behavior of an object, whereas encapsulation focuses on the implementation that gives rise to this behavior. Encapsulation is most often achieved through information hiding (not just data hiding), which is the process of hiding all the secrets of an object that do not contribute to its essential characteristics; typically, the structure of an object is hidden, as well as the implementation of its methods.

    
risposta data 04.11.2012 - 17:41
fonte
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 noi chiamiamo oggetto. Quindi l'occultamento dei dati è parte dell'incapsulamento.

    
risposta data 10.04.2013 - 00:29
fonte
4

Da Wikipedia :

In a programming language, encapsulation is used to refer to one of two related but distinct notions, and sometimes to the combination thereof:

  • A language mechanism for restricting access to some of the object's components.
  • A language construct that facilitates the bundling of data with the methods (or other functions) operating on that data.

Some programming language researchers and academics use the first meaning alone or in combination with the second as a distinguishing feature of object oriented programming, while other programming languages which provide lexical closures view encapsulation as a feature of the language orthogonal to object orientation.

The second definition is motivated by the fact that in many OOP languages hiding of components is not automatic or can be overridden; thus, information hiding is defined as a separate notion by those who prefer the second definition.

    
risposta data 04.11.2012 - 11:23
fonte
2

Spesso sono usati in modo intercambiabile nella discussione, e spesso penso che lavorino insieme per raggiungere lo stesso scopo, e mentre i seguenti potrebbero non essere completamente accurati, può fornire una distinzione significativa, se è necessario fare una distinzione:

Quando si parla di incapsulamento, spesso è implementato come un meccanismo procedurale / funzionale. C'è un tipo di guardia per lo stato sottostante, e l'accesso attraverso la guardia richiede che vengano seguiti alcuni protocolli per poter accedere (leggere o modificare lo stato desiderato). L'incapsulamento offre anche la possibilità che si verifichino effetti collaterali dovuti all'accesso (come cambiamento dello stato a cascata o notifica / innalzamento di un evento / emissione di un segnale quando la cosa di interesse viene letta o cambiata) in modo da poter avviare azioni di follow-up. Di nuovo, penso spesso all'incapsulamento come a un concetto che è implementato come una procedura.

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

    
risposta data 05.11.2012 - 20:40
fonte
0

Sono spesso, forse di solito, usati in modo intercambiabile. Ma nota la citazione di Booch sopra riportata, "L'incapsulamento è più spesso raggiunto attraverso l'occultamento delle informazioni ..." più spesso, ma non sempre in ogni caso.

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

Potresti fare la stessa cosa in Java rendendo tutte le tue variabili membro public , ma oltre a dare a tutti un attacco di cuore, perderai il beneficio dell'occultamento dei dati ... cioè preservando la semantica di un oggetto di limitando l'accesso al suo stato.

    
risposta data 06.01.2015 - 05:30
fonte
0

In O-O, Incapsulamento è dove le informazioni sono contenute in un oggetto. Ad esempio, un Person ha un name e i clienti di Person (cioè tu) conosci che Person detiene un nome, sia tramite campi pubblici che metodi di accesso. E, si spera, non è necessario tenere i nomi anche in una serie globale di nomi, ecc. Quindi questo è un grande passo per evitare il codice spaghetti ingestibile. Ma il cliente deve ancora sapere qualcosa su come Person gestisce i nomi: ad es. spazio o virgola delimitata?

Nascondere dati è dove Person ha un campo nome, ma, almeno in teoria, nessuno lo sa . Il campo è privato senza metodi di accesso pubblici. I client possono passare un nome da un record di database, XML, HTTP POST, qualunque cosa, ma il funzionamento interno di come Person gestisce il nome è una "scatola nera". Le implementazioni future di Person sono libere di cambiare, ad esempio, per passare a firstName e a lastName .

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

    
risposta data 06.01.2015 - 05:56
fonte

Leggi altre domande sui tag