Domanda

" Astrazione e incapsulamento sono concetti complementari: l'astrazione si concentra sul comportamento osservabile di un oggetto ... l'incapsulamento si concentra sull'implementazione che dà origine a questo comportamento ... l'incapsulamento viene spesso raggiunto attraverso nascondere le informazioni , che è il processo per nascondere tutti i segreti degli oggetti che non contribuiscono alle sue caratteristiche essenziali. " - < strong> Grady Booch in Analisi e progettazione orientate agli oggetti

Puoi mostrarmi alcuni esempi fortemente convincenti dei vantaggi dell'incapsulamento attraverso il nascondere le informazioni?

È stato utile?

Soluzione

L'esempio fornito nella mia prima classe OO:

Immagina un lettore multimediale. riassume i concetti di riproduzione, pausa, avanzamento rapido, ecc. Come utente, puoi utilizzarlo per utilizzare il dispositivo.

Il videoregistratore ha implementato questa interfaccia e nascosto o incapsulato i dettagli delle unità meccaniche e dei nastri.

Quando arriva una nuova implementazione di un lettore multimediale (ad esempio un lettore DVD, che utilizza dischi anziché nastri), può sostituire l'implementazione incapsulata nel lettore multimediale e gli utenti possono continuare a usarlo come hanno fatto con il loro videoregistratore (stesse operazioni come riproduzione, pausa, ecc ...).

Questo è il concetto di occultamento delle informazioni attraverso astrazione . Permette di modificare i dettagli dell'implementazione senza che gli utenti debbano conoscere e promuove un accoppiamento di codice.

Altri suggerimenti

L'astrazione * nix di flussi di caratteri (file su disco, pipe, socket, tty, ecc.) in una singola entità (il modello "tutto è un file") consente di applicare un'ampia gamma di strumenti a un ampio gamma di origini / pozzi di dati in un modo che semplicemente non sarebbe possibile senza l'incapsulamento.

Allo stesso modo, il concetto di stream in varie lingue, astrattando su elenchi, array, file, ecc.

Inoltre, concetti come numeri (astrazione su numeri interi, mezza dozzina di tipi di float, razionali, ecc.) immaginano che incubo questo sarebbe se al codice di livello superiore fosse dato il formato mantissa e così via e lasciato a difendersi da solo .

So che c'è già una risposta accettata, ma volevo lanciarne un'altra ancora: OpenGL / DirectX

Nessuna di queste API ha implementazioni complete (sebbene DirectX sia certamente un po 'più pesante in tal senso), ma invece metodi generici per comunicare i comandi di rendering a una scheda grafica.

I fornitori di schede sono quelli che forniscono l'implementazione (driver) per una scheda specifica, che in molti casi è molto specifica per l'hardware, ma tu come utente non devi preoccuparti che un utente stia eseguendo una GeForce ABC e l'altro un Radeon XYZ perché l'implementazione esatta è nascosta dietro l'API di alto livello. Se non lo fosse, avresti bisogno di avere un percorso di codice nei tuoi giochi per ogni carta sul mercato che volevi supportare, il che sarebbe completamente ingestibile dal primo giorno. Un altro grande vantaggio di questo approccio è che Nvidia / ATI può rilasciare un versione più recente ed efficiente dei loro driver e l'utente beneficia automaticamente senza alcuno sforzo da parte tua.

Lo stesso principio è in vigore per suono, rete, mouse, tastiera ... praticamente qualsiasi componente del tuo computer. Indipendentemente dal fatto che l'incapsulamento avvenga a livello hardware o in un driver software, a un certo punto tutte le specifiche del dispositivo sono nascoste per consentire di trattare qualsiasi tastiera, ad esempio, solo come una tastiera e non come Microsoft Ergonomic Media Explorer Deluxe Revisione 2 .

Quando lo guardi in quel modo, diventa rapidamente evidente che senza una qualche forma di computer incapsulamento / astrazione come li conosciamo oggi semplicemente non funzionerebbe affatto. È abbastanza geniale per te?

Quasi ogni base di codice Java, C # e C ++ nel mondo ha informazioni nascoste: è semplice quanto il privato: sezioni delle classi.

Il mondo esterno non può vedere i membri privati, quindi uno sviluppatore può cambiarli senza preoccuparsi che il resto del codice non venga compilato.

Che cosa? Non sei ancora convinto?

È più facile mostrare il contrario. Scrivevamo codice che non aveva alcun controllo su chi potesse accedere ai dettagli della sua implementazione. Ciò ha reso quasi impossibile a volte determinare quale codice ha modificato una variabile.

Inoltre, non puoi davvero astrarre qualcosa se ogni pezzo di codice nel mondo potesse dipendere dall'implementazione di specifiche classi concrete.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top