Qual è la differenza tra "livello di astrazione" e "livello di riferimento indiretto"?


38

Non sono sicuro che entrambi i termini possano essere usati in modo intercambiabile. Forse esiste una certa distinzione accademica nell'informatica che non è rilevante per la programmazione quotidiana? O posso usare entrambi i termini in modo intercambiabile senza sbagliarmi? Forse dipende dal contesto in cui utilizzo entrambi i termini?

Modifica: Sul motivo per cui trovo entrambi i termini eventualmente intercambiabili è una voce di Wikipedia sul livello di astrazione . Lì puoi trovare la citazione di David Wheelers "Tutti i problemi nell'informatica possono essere risolti da un altro livello di riferimento indiretto".


7
... tranne il problema di troppi livelli di indiretta!
Mason Wheeler,

@MasonWheeler: potresti aggiungere un altro livello di indiretta meno indiretto ...
Jon Purdy,

Il C ++ ti consente di aggiungere uno strato di astrazione senza uno strato di riferimento indiretto, quindi non possono significare lo stesso.
Fredoverflow

Risposte:


30

L'astrazione ha a che fare con la semplificazione, la direzione indiretta riguarda la posizione.

  • Astrazioneè un meccanismo che "nasconde" dettagli complicati di un oggetto in termini di termini più semplici e facili da manipolare. Nella programmazione, un buon esempio è la differenza nei dettagli tra il codice macchina e i vari strumenti per la creazione di applicazioni basate sul codice macchina. Prendi in considerazione la creazione di un'applicazione Windows Form con l'IDE di Visual Studio. L'IDE ti consente di pensare all'applicazione in termini di elementi facili da manipolare in un modo What-You-See-Is-What-You-Get. La posizione di un widget dello schermo viene sottratta a una posizione visiva in una cornice che è possibile modificare trascinando il widget. Internamente, l'IDE manipola il widget usando un altro livello di astrazione come un linguaggio di alto livello (come C #). C # stesso non viene manipolato usando il codice macchina, ma viene manipolato usando un "Common Runtime Environment"

  • Indiretta si riferisce al rendere trasparente la posizione di un elemento. Se conosci l'URI di una risorsa Web, puoi accedere alla risorsa senza conoscerne la posizione precisa. Non si accede direttamente alla risorsa, ma si accede tramite un canale che passa la richiesta attraverso una serie di server, applicazioni e router. L'indirizzamento può essere considerato un tipo speciale di astrazione in cui la posizione è astratta.


2
+1 migliore risposta finora! Stava per scriverne uno, ma questo è abbastanza vicino a quello che avevo in mente.
Newtopian,

27

Le astrazioni sono implementate usando il metodo indiretto.

Ad esempio, memoria virtuale: l'astrazione è uno spazio di indirizzi contiguo interamente a vostra disposizione. Questa astrazione viene implementata utilizzando l'indirizzamento indiretto tramite una tabella di pagine. Invece di accedere direttamente agli indirizzi di memoria fisica, vengono tradotti da un indirizzo virtuale a un indirizzo fisico.

Per aggiungere un livello di astrazione, è necessario aggiungere un livello di riferimento indiretto. Ma l'aggiunta di riferimenti indiretti non ti dà necessariamente un'astrazione. Ad esempio, avere getter e setter su ogni singola variabile è un livello di riferimento indiretto, ma se tutto ciò che fanno è ottenere e impostare valori semplici non c'è astrazione.


2
In realtà, l'ultimo esempio non è molto buono. Getter e setter semplici aggiungono astrazione. L'unico a sapere, sono semplici, è la classe che li dichiara. Se si decide di modificare l'implementazione, qualsiasi codice creato rispetto all'astrazione non viene interessato.
back2dos,

puoi dare qualche esempio migliore che sia l'indirizzamento ma non l'astrazione?
Mr Coder,

1
sicuramente un esempio sbagliato
Morg.

3
Chi ha detto qualcosa sulle lezioni? Inoltre non ho detto nulla riguardo alla modifica della visibilità di una variabile. Nulla ti impedisce di accedervi direttamente; è una variabile. Ma puoi anche farlo con un livello di riferimento indiretto tramite getter e setter. Poiché la semantica dell'uso del getter e del setter è la stessa dell'accesso diretto alla variabile, non c'è astrazione.
Austin,

2
Solo che il getter e il setter non necessariamente "solo" accedono alla variabile. Se stai usando un getter e un setter stai aggiungendo un'astrazione in quanto potresti cambiarli per usare una variabile diversa senza che l'utente ne sia consapevole, quindi un'astrazione.
Dominique McDonnell,

9

Innanzitutto, proviamo le definizioni appropriate per i termini:

  1. Strato di astrazione significa:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Il livello di indiretta significa invece:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Entrambe queste cose possono significare la stessa cosa, purché tu usi:

  a) step = going from simple code to complex code. 

7

La mia comprensione è che l'astrazione si riferisce principalmente alle funzioni e l'indirizzamento indiretto si riferisce principalmente ai dati. In altre parole, il livello di astrazione è la profondità della traccia dello stack e il livello di riferimento indiretto è quanti puntatori devi dedurre. Almeno è così che uso i termini.


con le funzioni virtuali modellate come puntatori a funzioni?
Caleth,

7

Strato di astrazione e livello di indiretta sono concetti distinti. L'astrazione è l'aggregazione e la denominazione significativa di un numero di elementi come pezzi di dati o istruzioni di programma, ad esempio il concetto di un file o una chiamata di metodo, mentre l'irregolazione è il disaccoppiamento delle entità per facilitare il rinvio della realizzazione della loro relazione, ad esempio, l'uso di JNDI per separare l'identificazione di una risorsa all'interno di un programma dalla risorsa effettiva che può eventualmente essere fornita da un contenitore dell'applicazione.

Spesso i concetti vanno di pari passo e quale si applica a un particolare costrutto dipende da quale esercizio o discussione è in corso. Ad esempio, la natura astratta di un'interfaccia è importante durante l'apprendimento o la documentazione di un'API; la sua proprietà di riferimento indiretto è importante quando si aggiunge estensibilità o si creano test per un'applicazione.

Uno strato di astrazione è l'aggregazione delle astrazioni e dà loro un'integrità concettuale e la coerenza di utilizzo. CreateProcess è il nome dell'API win32 per un gruppo di codice che crea ed esegue un processo. Il "nome" è significativo in questo contesto perché se chiamassimo la funzione qualcosa come DoAllocMemThenMakeEnvThenFindEntryPoint ... non sarebbe davvero molto astratto. Un livello come l'API Win32 fornisce una barriera attraverso la quale un programmatore può essere consigliato di non avventurarsi. Elimina la complessità dal punto di vista del chiamante a costo di potenza ridotta (flessibilità, prestazioni, ecc.). Questo compromesso è evidenziato dalla frequente discussione di astrazioni che perdono: potrebbe essere ancora necessario effettuare chiamate SQL dirette quando si utilizza Hibernate o effettuare chiamate Win32 quando si utilizza .NET.

Riguardo all'indirizzamento indiretto, la maggior parte dei programmi non banali opera con una qualche forma di indiretto codificato dall'utente, come testimonia la sezione INPUT-OUTPUT di COBOL prima dell'arca. Quando si accede a una risorsa come un database, è possibile che nel codice venga incorporata una stringa di connessione JDBC come indiretta di livello 0, una connessione JNDI (che delega la scelta della risorsa a un contenitore di applicazioni) come livello 1 e un costrutto Spring che mappa l'identificatore JNDI dell'applicazione a una delle molte risorse del contenitore come Livello 2. Livelli multipli consentono a un numero di parti esterne alla relazione (in questo caso una relazione tra l'esecuzione di codice e un database) di manipolare tale relazione. Questo vale anche per i componenti interni del programma come interfacce ed eventi.

Vediamo che, qualunque siano le loro altre qualità, l'astrazione riduce la complessità mentre la direzione indiretta la aumenta. L'astrazione riduce il potere mentre l'indirizzamento indiretto lo aumenta. La indiretta può essere utilizzata per ripristinare la potenza dell'astrazione consentendo di ignorare il comportamento predefinito mediante callback personalizzati.


1

Un puntatore a un puntatore a un puntatore a un puntatore a un puntatore a un puntatore a int ha sei livelli di riferimento indiretto, ma nessun livello di astrazione di sorta.


0

Un buon esempio di astrazione sta chiamando un singolo metodo per memorizzare un elemento in un database. Il metodo estrae i dettagli della connessione e della chiamata al database. Dove un esempio di indiretto sta usando una struttura per accedere agli interrupt. Stai ancora accedendo all'interruzione quando imposti i valori nella struttura. è solo indirettamente attraverso la struttura dando nomi di membri struct a punti specifici della memoria.

Quindi l'astrazione nasconde i dettagli dell'implementazione in cui l'indirizzamento indiretto fornisce semplicemente un'interfaccia "indiretta" attraverso la quale accedere a qualcosa.

L'astrazione è quando non hai bisogno di capire cosa si nasconde, dove con indiretto si fa.


-1

L'aggiunta di un livello (o livello) di astrazione e l'aggiunta di un livello di riferimento indiretto sono semplicemente due modi per dire la stessa cosa. Quando risolvi un problema, di solito provi una soluzione diretta. A volte ciò non è possibile, quindi provi una soluzione indiretta. Ciò richiede l'introduzione di alcune astrazioni per semplificare il problema, poiché è perché il problema è complesso e non può essere risolto direttamente. Avendo risolto il problema con l'approccio indiretto, non c'è motivo di non considerare di risolverlo di nuovo, ma più in generale; Ciò comporterà l'introduzione di un altro livello più elevato di astrazione. E questa nuova soluzione più generale è persino più indiretta della soluzione indiretta originale, vale a dire che è stato introdotto un altro livello di riferimento indiretto.


3
questo non sembra aggiungere nulla di sostanziale rispetto ai punti formulati e spiegati nelle precedenti 7 risposte
moscerino

Grazie Gnat. Prendo il tuo punto, ed è un peccato che questa domanda interessante attiri molto spam!
ChrisC,
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.