8

"astrazione e incapsulamento sono concetti complementari: astrazione concentra sul comportamento osservabile di un oggetto ... incapsulamento concentra sulla realizzazione che dà origine a questo comportamento ... incapsulamento è più spesso raggiunto attraverso informazioni nascondere, che è il processo di nascondere tutti i segreti dell'oggetto che non contribuiscono alle sue caratteristiche essenziali ". - Grady Booch in Object Oriented Analysis and DesignUn brillante esempio di incapsulamento efficace attraverso l'occultamento dell'informazione?

Puoi mostrarmi alcuni esempi convincenti di potentemente i vantaggi di incapsulamento attraverso l'informazione che si nascondono?

risposta

20

L'esempio riportato nella mia prima classe OO:

immaginare un lettore multimediale. È abstracts i concetti di riproduzione, pausa, avanzamento rapido, ecc. Come utente, è possibile utilizzarlo per far funzionare il dispositivo.

Il videoregistratore implementato questa interfaccia e nascose o incapsulati i dettagli delle trasmissioni meccaniche e nastri.

Quando un nuovo implementazione di un lettore multimediale arriva (ad esempio un lettore DVD, che utilizza i dischi invece di nastri) può sostituire l'attuazione incapsulato nel lettore multimediale e gli utenti possono continuare a utilizzare solo come fatto con il loro videoregistratore (stesse operazioni come play, pause, ecc ...).

Questo è il concetto di informazioni nascoste tramite astrazione. Consente di modificare i dettagli di implementazione senza che gli utenti debbano conoscere e promuovere il codice coupling basso.

0

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 si può davvero astrarre qualcosa se ogni pezzo di codice nel mondo potrebbe dipendere dall'implementazione di specifiche classi concrete.

9

L'astrazione * nix di flussi di caratteri (file disco, pipe, socket, ttys, ecc.) In un'unica entità (il modello "tutto è un file") consente di applicare un'ampia gamma di strumenti a una vasta gamma di fonti/sink di dati in un modo che semplicemente non sarebbe possibile senza l'incapsulamento.

Allo stesso modo, il concetto di flussi in varie lingue, facendo astrazione sulle liste, array, file, ecc

Inoltre, concetti come numeri (astrazione su numeri interi, una mezza dozzina di tipi di carri, razionali, etc.) immagina quale sarebbe un incubo se il codice di livello superiore avesse il formato della mantissa e così via e se ne andasse per difendersi da solo.

0

Quasi ogni base di codice Java, C# e C++ nel mondo nasconde informazioni: è semplice quanto le sezioni private delle classi.

Il mondo esterno non può vedere i membri privati, quindi uno sviluppatore può modificarli senza doversi preoccupare del resto del codice che non viene compilato.

+0

Non so che sarei arrivato al punto di dire "senza doversi preoccupare del resto del codice che non compila". Puoi certamente interrompere la compilazione mentre cambi solo membri privati. Il vantaggio è più simile a quello di riuscire a riscrivere completamente gli interni di una classe finché non si cambia l'interfaccia esterna. Questo è ottimo per determinati tipi di ottimizzazioni. – Toji

2

so che c'è già una risposta accettato, ma ho voluto gettare un altro là fuori: OpenGL/DirectX

Nessuna di queste API sono implementazioni completo (anche se DirectX è certamente un po 'più pesante nella parte superiore, al riguardo,), 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 come utente non deve mai preoccuparsi che un utente esegua una GeForce ABC e l'altra una Radeon XYZ perché l'implementazione esatta è nascosta dietro l'API di alto livello. Se non fosse così, avresti bisogno di avere un percorso di codice nei tuoi giochi per ogni scheda sul mercato che avresti voluto 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 e più efficiente dei loro driver e voi beneficiate automaticamente senza alcuno sforzo da parte vostra.

Lo stesso principio è valido per suono, rete, mouse, tastiera ... praticamente qualsiasi componente del computer. Se l'incapsulamento avviene 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, come una semplice tastiera e non una Microsoft Ergonomic Media Explorer Deluxe Revision 2

Quando lo si guarda in questo modo, diventa subito evidente che senza una qualche forma di computer di incapsulamento/astrazione come li conosciamo oggi semplicemente non funzionerebbe affatto. E 'abbastanza geniale per te?