Incapsulamento vs astrazione?


137

Ecco le brevi definizioni di incapsulamento e astrazione.

Astrazione:

Il processo di astrazione in Java viene utilizzato per nascondere alcuni dettagli e mostrare solo le caratteristiche essenziali dell'oggetto. In altre parole, si occupa della vista esterna di un oggetto (interfaccia). L'unico buon esempio che vedo per questo su diversi siti è l'interfaccia.

incapsulamento:

Fondamentalmente si tratta di nascondere lo stato dell'oggetto con l'aiuto di modificatori come privati, pubblici, protetti ecc. Esponiamo lo stato attraverso metodi pubblici solo se necessario.

Ciò che otteniamo con modificatori come private, publicnasconde anche dettagli inutili dal mondo esterno che non è altro che un concetto di astrazione

Quindi, da sopra la spiegazione sembra che l'incapsulamento sia una parte dell'astrazione o possiamo dire che è un sottoinsieme dell'astrazione. Ma allora perché viene inventato il termine incapsulamento quando potremmo affrontarlo solo con l'astrazione? Sono sicuro che ci dovrebbe essere qualche differenza sostanziale che li distingue, ma la maggior parte del materiale in rete dice quasi la stessa cosa per entrambi.

Anche se questa domanda è stata sollevata anche su questo forum in precedenza, ma la sto pubblicando di nuovo con dubbi specifici. Alcune risposte affermano anche che l'astrazione è un concetto e l'incapsulamento è implementazione. Ma non lo compro - Se è vero, allora posso pensare che questi due diversi concetti siano forniti per confonderci.

Aggiornamento: - Dopo 5 anni ho trovato la mia risposta, che è l'essenza basata sulle risposte in questo post e sotto quelle

  1. differenza tra astrazione e incapsulamento?
  2. incapsulamento vs astrazione esempio del mondo reale

l'incapsulamento come definito sopra è uno strumento di astrazione, tuttavia tendo a pensarlo in termini di ciò che una classe incapsula (funzionalità / dati indipendentemente dall'accesso) dove come astrazione è più un senso di allontanarti dalle preoccupazioni di implementazioni concrete, cioè indipendentemente da come è fatto e ciò che è esattamente fatto è fattibile da WikipediaAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

L'incapsulamento consiste più nel vincolare i dettagli rilevanti (dati e comportamenti che operano sui dati) relativi al contesto. Può anche essere ottenuto senza specificatori di accesso come private public, in quanto forniscono solo informazioni / nascondimenti che lo facciamo perché è una buona pratica proteggere i dati dell'istanza.
user3227986,

Risposte:


98

L'incapsulamento è una strategia utilizzata come parte dell'astrazione. L'incapsulamento si riferisce allo stato degli oggetti - gli oggetti incapsulano il loro stato e lo nascondono dall'esterno; gli utenti esterni della classe interagiscono con essa attraverso i suoi metodi, ma non possono accedere direttamente allo stato delle classi. Quindi la classe estrae i dettagli di implementazione relativi al suo stato.

Astrazione è un termine più generico, che può anche essere ottenuto (tra gli altri) dalla sottoclasse. Ad esempio, l'interfaccia Listnella libreria standard è un'astrazione per una sequenza di elementi, indicizzata dalla loro posizione, esempi concreti di a Listsono an ArrayListo a LinkedList. Codice che interagisce con un Listabstract sul dettaglio di quale tipo di elenco sta utilizzando.

L'astrazione spesso non è possibile senza nascondere lo stato sottostante mediante l'incapsulamento: se una classe espone il suo stato interno, non può cambiare i suoi meccanismi interni e quindi non può essere astratta.


8
Incapsulamento significa che un gruppo di proprietà, metodi e altri membri correlati vengono trattati come una singola unità o oggetto. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana

1
L'incapsulamento porta all'astrazione.
Martin,

124

L'astrazione è il concetto di descrivere qualcosa in termini più semplici, ovvero sottrarre i dettagli, al fine di concentrarsi su ciò che è importante (questo è anche visto nell'arte astratta, ad esempio, dove l'artista si concentra sui mattoni delle immagini, come colore o forme). La stessa idea si traduce in OOP usando una gerarchia ereditaria, in cui concetti più astratti sono in cima e idee più concrete, in fondo, si basano sulle loro astrazioni. Al suo livello più astratto non ci sono affatto dettagli di implementazione e forse pochissimi elementi in comune, che vengono aggiunti quando l'astrazione diminuisce.

Ad esempio, nella parte superiore potrebbe essere un'interfaccia con un singolo metodo, quindi il livello successivo, fornisce diverse classi astratte, che possono o meno inserire alcuni dettagli sul livello superiore, ma si ramificano aggiungendo i propri metodi astratti , quindi per ciascuna di queste classi astratte sono classi concrete che forniscono implementazioni di tutti i metodi rimanenti.

L'incapsulamento è una tecnica . Può essere o meno per aiutare nell'astrazione, ma si tratta certamente di nascondere informazioni e / o organizzazione. Richiede che i dati e le funzioni siano raggruppati in qualche modo - ovviamente una buona pratica OOP richiede che debbano essere raggruppati per astrazione. Tuttavia, ci sono altri usi che aiutano solo nella manutenibilità ecc.


13
La tua definizione di Astrazione è la migliore che abbia mai visto, e mi sento per la prima volta in assoluto, mi è scattato in testa e aveva un senso. So che sono passati più di 3 anni da quando l'hai pubblicato, ma grazie.
Casey Crookston,

1
Caspita .... Astrazione .... espressa in termini di arte ... il rosso potrebbe essere rabbia, questo è tutto ciò che dovevamo sapere! Grazie per questa visione del concetto :-)
SlowLearner,

L'incapsulamento viene utilizzato per ottenere "accoppiamento allentato e alta coesione".
Sorter

28

l'incapsulamento fa parte dell'astrazione o possiamo dire che è un sottoinsieme dell'astrazione

Sono concetti diversi.

  • L'astrazione è il processo di raffinamento di tutti gli attributi non necessari / non importanti di un oggetto e mantenere solo le caratteristiche più adatte al tuo dominio.

    Ad esempio per una persona: decidi di conservare nome e cognome e SSN. Età, altezza, peso ecc. Sono ignorati come irrilevanti.

    L'astrazione è dove inizia il tuo design.

  • L'incapsulamento è il passaggio successivo in cui riconosce le operazioni adatte agli attributi che hai accettato di conservare durante il processo di astrazione. È l'associazione dei dati con l'operazione che agisce su di essi.
    Vale a dire dati e metodi sono raggruppati insieme.

Possiamo dire che l'astrazione è una sorta di concetto di design e l'incapsulamento riguarda principalmente l'implementazione del design concordato durante l'astrazione?
M Sach,

1
Nell'incapsulamento definisci le operazioni che possono / devono essere applicate ai tuoi dati. Anche questo può far parte del progetto. Recupera SSN, ma non modificalo
Cratylus

25

L'incapsulamento nasconde i dati non necessari in una capsula o unità

L'astrazione sta mostrando la caratteristica essenziale di un oggetto

L'incapsulamento viene utilizzato per nascondere il proprio membro da classi e interfacce esterne. Utilizzando i modificatori di accesso forniti in c # .come esempio pubblico, privato, protetto ecc.:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Qui abbiamo dati a capo in un'unità o capsula cioè Classe.

L'astrazione è esattamente l'opposto dell'incapsulamento.

L'astrazione viene utilizzata per mostrare all'utente dati importanti e pertinenti. miglior esempio del mondo reale In un telefono cellulare, vedi i loro diversi tipi di funzionalità come fotocamera, lettore mp3, funzione di chiamata, funzione di registrazione, multimedia ecc. È un'astrazione, perché stai vedendo solo informazioni rilevanti invece della loro ingegneria interna.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }

sono d'accordo. questi ragazzi sono una specie di opposti. il buon senso tende ad astrarre le cose che non cambiano e a [incapsulare le sfumature che cambiano] [1]. [1]: Principi-wiki.net/…
Ray Tayek

15

Astrazione è un termine molto generale e l'astrazione nel software non si limita ai linguaggi orientati agli oggetti. Una definizione del dizionario: "l'atto di considerare qualcosa come una qualità o caratteristica generale, a parte realtà concrete, oggetti specifici o istanze reali".

Il linguaggio assembly può essere pensato come un'astrazione del codice macchina - assembly esprime i dettagli e la struttura essenziali del codice macchina, ma ti libera dal dover pensare agli opcode utilizzati, alla disposizione del codice in memoria, facendo saltare i salti a l'indirizzo giusto, ecc.

L'API del tuo sistema operativo è un'astrazione della macchina sottostante. Il compilatore fornisce uno strato di astrazione che ti protegge dai dettagli del linguaggio assembly. Lo stack TCP / IP integrato nel sistema operativo estrae i dettagli della trasmissione di bit su una rete. Se vai fino al silicio grezzo, le persone che hanno progettato la tua CPU lo hanno fatto usando schemi circuitali scritti in termini di "diodi" e "transistor", che sono astrazioni di come gli elettroni viaggiano attraverso i cristalli di semiconduttori.

Nel software, tutto è un'astrazione. Costruiamo programmi che simulano o modellano alcuni aspetti della realtà, ma per necessità i nostri modelli sottraggono sempre alcuni dettagli della "cosa reale". Costruiamo strato su strato su strato di astrazioni, perché è l'unico modo per fare qualcosa. (Immagina che stavi cercando di realizzare, per esempio, un solutore di sudoku e che dovevi progettarlo usando solo cristalli di semiconduttori. "OK, qui ho bisogno di un pezzo di silicio di tipo N ..."

In confronto, "incapsulamento" è un termine molto specifico e limitato. Alcune delle altre risposte a questa domanda hanno già dato buone definizioni per questo.


14

Rispondere alla mia domanda dopo 5 anni perché ritengo che abbia ancora bisogno di maggiori dettagli

Astrazione:

Definizione tecnica: - L' astrazione è un concetto per nascondere dettagli non necessari (complessi o semplici) e mostrare solo le caratteristiche essenziali dell'oggetto. Non c'è implementaion qui è solo un concetto

Cosa significa praticamente: - Quando dico che la mia azienda ha bisogno di un supporto / dispositivo in modo che i dipendenti possano connettersi al cliente. Questa è la forma più pura di astensione (come l'interfaccia in Java) in quanto quel dispositivo / mezzo può essere telefono o internet o skype o di persona o e-mail ecc.

Anche quando dico che la mia azienda ha bisogno di un mezzo / dispositivo in modo che i dipendenti possano connettersi al cliente tramite chiamata vocale. Quindi parlo anche in modo astratto, ma a un livello leggermente inferiore in quanto il dispositivo / supporto può essere telefono o skype o qualcos'altro ecc

Ora, quando dico che la mia azienda ha bisogno di un telefono in modo che i dipendenti possano connettersi al cliente tramite chiamata vocale. Poi parlo anche in modo astratto ma a un livello leggermente più basso in quanto il telefono può essere di qualsiasi azienda come iPhone o Samsung o Nokia ecc

Incapsulamento: - Fondamentalmente si tratta di nascondere lo stato (informazioni) dell'oggetto con l'aiuto di modificatori come privati, pubblici, protetti ecc. Esponiamo lo stato attraverso metodi pubblici solo se necessario.

Che cosa significa in pratica: - Ora, quando dico la mia azienda ha bisogno di un po 'di iPhone in modo che i dipendenti possano connettersi al cliente attraverso la voce call.Now sto parlando di qualche oggetto concreto (come iPhone). Anche se non ho intenzione di entrare in nitidezza di iPhone anche qui, ma iPhone ha alcune informazioni / implementazioni di stato / riconoscimento associate ad esso dove dispositivo / supporto non ha. Quando dico oggetto concreto, in realtà significa qualsiasi oggetto a cui sono associate alcune informazioni / implementazioni (non complete come java abstract class).

Quindi iPhone ha effettivamente usato qui l'incapsulamento come strategia per nascondere il suo stato / informazioni ed esporre solo quelli che pensa dovrebbero essere esposti. Quindi sia l'astrazione che l'incapsulamento nascondono alcuni dettagli non necessari ma l'astrazione a livello di concetto e l'incapsulamento effettivamente a livello di implementazione

Questa è la sostanza in base alle risposte in questo post e sotto quelle

  1. differenza tra astrazione e incapsulamento?
  2. incapsulamento vs astrazione esempio del mondo reale

5

Incapsulamento - il processo di nascondere i componenti della classe per impedire l'accesso diretto dall'esterno. Si ottiene utilizzando il modificatore "privato" per impedire l'accesso diretto ad alcuni membri della classe (campo o metodo di dati) da altre classi o oggetti fornendo nel frattempo l'accesso a questi membri privati ​​da parte di membri pubblici (interfaccia). Ciò rende i membri della classe protetti come organi umani nascosti / incapsulati sotto la pelle o alcuni scudi.

Astrazione - È necessario seguire un principio nella stesura del programma OOP che dice "è necessario includere nella classe solo componenti interessanti nel compito del programma". Ad esempio: l'oggetto studente ha molti personaggi come essere umano: nome, età, peso, colore dei capelli, colore degli occhi, ecc. Ma, quando crei una classe in OOP per lavorare con gli studenti, dovresti includere solo quei personaggi che in realtà importa per il database degli studenti: nome, età, specialità, livello, voti ... ecc. in C ++ puoi creare una classe astratta usando il modificatore "virtuale" con qualsiasi metodo nella classe e questo lo renderà inutilizzabile in diretta ma puoi derivarne altre classi e creare l'implementazione per i suoi membri con l'aggiunta dei membri richiesti in base all'attività.


4

Ecco come l'ho capito:

Nella programmazione orientata agli oggetti, abbiamo qualcosa chiamato classi . A cosa servono? Devono memorizzare un certo stato e memorizzare alcuni metodi per cambiare quello stato, cioè incapsulano lo stato e i suoi metodi.

A (classe) non interessa la visibilità propria o dei suoi contenuti. Se scegliamo di nascondere lo stato o alcuni metodi, si tratta di nascondere le informazioni .

Ora, prendi lo scenario di un'eredità . Abbiamo una classe base e un paio di classi derivate (ereditate). Quindi, cosa ci fa qui la classe base? E ' astrazione alcune cose dalle classi derivate.

Sono tutti diversi, vero? Ma li mescoliamo per scrivere buoni programmi orientati agli oggetti. Spero che sia d'aiuto :)


3

L'astrazione delinea una rappresentazione semplificata specifica per il contesto di qualcosa; ignora i dettagli contestualmente irrilevanti e include i dettagli contestualmente importanti.

L'incapsulamento limita l' accesso esterno alle parti di qualcosa e raggruppa lo stato di quella cosa con le procedure che usano lo stato.


Prendi le persone, per esempio. Nel contesto dell'intervento chirurgico un'astrazione utile ignora le credenze religiose di una persona e include il corpo della persona. Inoltre, le persone incapsulano i loro ricordi con i processi di pensiero che usano quei ricordi. Un'astrazione non deve avere incapsulamento; per esempio, un dipinto di una persona non nasconde le sue parti né raggruppa le procedure con il suo stato. E l'incapsulamento non deve necessariamente avere un'astrazione associata; per esempio, le persone reali (non quelle astratte) incapsulano i loro organi con il loro metabolismo.


1

NOTA: sto condividendo questo. Non significa che qui non c'è una buona risposta, ma perché ho capito facilmente.

Risposta:

Quando una classe viene concettualizzata, quali sono le proprietà che possiamo avere in essa dato il contesto. Se stiamo progettando un animale di classe nel contesto di uno zoo, è importante disporre di un attributo come animalType per descrivere domestico o selvaggio. Questo attributo potrebbe non avere senso quando progettiamo la classe in un contesto diverso.

Allo stesso modo, quali sono i comportamenti che avremo in classe? Anche l'astrazione viene applicata qui. Cosa è necessario avere qui e quale sarà un'overdose? Quindi tagliamo alcune informazioni dalla classe. Questo processo sta applicando l'astrazione.

Quando chiediamo la differenza tra incapsulamento e astrazione, direi, l' incapsulamento usa l'astrazione come concetto. Quindi, è solo incapsulamento. No, l'astrazione è persino un concetto applicato come parte dell'eredità e del polimorfismo.

Vai qui per ulteriori spiegazioni su questo argomento.


1

Proviamo a capire in modo diverso.

Cosa può succedere se l'astrazione non c'è e cosa può succedere se l'incapsulamento non c'è.

Se l'astrazione non è presente, allora puoi dire che l'oggetto usa meno. Non è possibile identificare l'oggetto né accedere ad alcuna funzionalità di esso. Prendi un esempio di TV, se non hai un'opzione per accendere, cambiare canale, aumentare o diminuire il volume ecc., Allora a che cosa serve la TV e come la usi?

Se l'incapsulamento non è presente o non viene implementato correttamente, è possibile utilizzare in modo improprio l'oggetto. Lì da dati / componenti potrebbero essere utilizzati in modo improprio. Prendiamo lo stesso esempio di TV, se non viene eseguito l'incapsulamento sul volume della TV, è possibile che il controller del volume venga utilizzato in modo improprio facendolo scendere o andare oltre il limite (0-40 / 50).


1

L'incapsulamento protegge il collasso del comportamento interno di oggetto / istanza da entità esterna. Quindi, dovrebbe essere fornito un controllo per confermare che i dati forniti non danneggeranno il sistema interno di istanza / oggetto per sopravvivere alla sua esistenza.

Un buon esempio, Divider è una classe che ha un dividendo e un divisore variabili di due istanze e un metodo getDividedValue.

Puoi pensare, se il divisore è impostato su 0, il sistema / comportamento interno (getDivided) si romperà.

Pertanto, il comportamento interno dell'oggetto potrebbe essere protetto generando un'eccezione tramite un metodo.


0

in una semplice frase, posso dire: l'essenza dell'astrazione è estrarre le proprietà essenziali omettendo dettagli inessenziali. Ma perché dovremmo omettere i dettagli inessenziali? Il motivatore chiave è prevenire il rischio di cambiamento. Potresti considerare l'astrazione uguale all'incapsulamento. Ma incapsulamento significa l'atto di racchiudere uno o più oggetti all'interno di un contenitore, non nascondendo i dettagli. Se si sostiene che "anche tutto ciò che è stato incapsulato è stato nascosto". Questo ovviamente non è vero. Ad esempio, anche se le informazioni possono essere incapsulate all'interno di strutture e matrici di record, queste informazioni di solito non sono nascoste (se non nascoste tramite qualche altro meccanismo).

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.