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

37

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

Modifica: il motivo per cui trovo entrambi i termini possibilmente intercambiabili è una voce di Wikipedia sul livello Abstraction . Qui puoi trovare David Wheelers quote "Tutti i problemi dell'informatica possono essere risolti con un altro livello di riferimento indiretto. '

    
posta Theo Lenndorff 30.09.2011 - 22:51
fonte

8 risposte

27

Abstraction si occupa di semplificazione, tratta indiretto con la posizione.

  • Abstraction è un meccanismo che "nasconde" i dettagli complicati di un oggetto in termini di termini più semplici e più facili da manipolare. Nella programmazione, un buon esempio è la differenza di dettagli tra il codice macchina e i vari strumenti per la creazione di applicazioni che si basano in ultima analisi sul codice macchina. Prendi in considerazione la possibilità di creare un'applicazione Windows Form con IDE di Visual Studio. L'IDE ti consente di pensare all'applicazione in termini di elementi facili da manipolare in un modo che ti consente di vedere come si ottiene. La posizione di un widget di schermo è astratta rispetto a una posizione visiva in un frame che è possibile modificare trascinando il widget in giro. Internamente, l'IDE manipola il widget usando un altro livello di astrazione come un linguaggio di alto livello (come C #). C # non è manipolato usando il codice macchina, è manipolato usando un "Common Runtime Environment" che a sua volta è un'astrazione di un computer e un sistema operativo.

  • Indirection si riferisce a rendere trasparente la posizione di un oggetto. Se si conosce l'URI di una risorsa Web, è possibile accedere alla risorsa senza conoscere la sua posizione precisa. Non si accede direttamente alla risorsa, ma si accede attraverso un canale che trasmette la richiesta attraverso una serie di server, applicazioni e router. L'indirzione può essere considerata un tipo speciale di astrazione in cui la posizione è astratta.

risposta data 09.10.2011 - 21:39
fonte
26

Le astrazioni sono implementate usando l'indirezione.

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

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

    
risposta data 01.10.2011 - 00:14
fonte
7

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

    
risposta data 30.09.2011 - 22:55
fonte
7

Per prima cosa, proviamo le definizioni corrette per i termini:

  1. Livello 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 riferimento indiretto, d'altra parte, significa:

      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, finché usi:

  a) step = going from simple code to complex code. 
    
risposta data 01.10.2011 - 00:57
fonte
7

Il livello di astrazione e il livello di Indirection sono concetti distinti. L'astrazione è l'aggregazione e la denominazione significativa di un numero di elementi come pezzi di dati o istruzioni del programma, ad esempio il concetto di un file o di un metodo, mentre l'indirezione è 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 di applicazioni.

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 quando si apprende o si documenta un'API; la sua proprietà di riferimento indiretto è importante quando si aggiunge l'estensibilità o si creano test per un'applicazione.

Uno strato di astrazione è l'aggregazione di astrazioni e dà loro un'integrità concettuale e 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 molto astratto. Un livello come l'API Win32 fornisce una barriera attraverso la quale un programmatore può essere consigliato di non avventurarsi. Rimuove la complessità dal punto di vista del chiamante al costo di una potenza ridotta (flessibilità, prestazioni, ecc.). Questo trade-off è evidenziato dalla frequente discussione sulle astrazioni che perdono: potremmo ancora aver bisogno di effettuare chiamate SQL dirette quando usiamo Hibernate o facciamo chiamate a Win32 quando usiamo .NET.

Per quanto riguarda l'indirizzamento indiretto, la maggior parte dei programmi non banali opera con una qualche forma di indirizzamento indiretto codificato dall'utente, la sezione INPUT-OUTPUT del testimone COBOL da prima dell'arca. Quando accediamo a una risorsa come un database potremmo vedere l'incorporamento di una stringa di connessione JDBC nel codice come riferimento a 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 numerose risorse contenitore del Livello 2. Più livelli consentono a un numero di parti esterne alla relazione (in questo caso una relazione tra codice in esecuzione e un database) di manipolare tale relazione. Questo vale anche per i componenti interni del programma come interfacce ed eventi.

Vediamo che, a prescindere dalle loro altre qualità, l'astrazione riduce la complessità mentre l'induzione indiretta lo aumenta. L'astrazione riduce il potere mentre indiretta lo aumenta. L'indirizzamento può essere utilizzato per ripristinare la potenza dell'astrazione, consentendo al comportamento predefinito di essere sovrascritto da callback personalizzati.

    
risposta data 02.10.2011 - 11:24
fonte
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 qualunque.

    
risposta data 08.09.2017 - 23:59
fonte
0

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

Quindi l'astrazione nasconde i dettagli dell'implementazione dove indirection fornisce semplicemente un'interfaccia "indiretta" attraverso cui accedere a qualcosa.

L'astrazione è quando non hai bisogno di capire cosa si nasconde, dove lo fai con indirezione.

    
risposta data 04.10.2011 - 16:23
fonte
-1

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

    
risposta data 08.09.2017 - 05:42
fonte

Leggi altre domande sui tag