Comprensione dei tipi di dati astratti (ADT) [duplicato]

14

Ho appena letto il codice completo ieri sera e ho trovato la spiegazione dei tipi di dati astratti.

Devo averlo letto 5 volte, e l' articolo di Wikipedia non aiuta molto. Quindi quello che sto cercando è una semplice spiegazione di esattamente che cos'è un tipo di dati astratti ? Qualche esempio solido? In C # o VB?

Capisco che String dovrebbe essere uno, perché è questo? E perché non è Int32? O è?

Qualsiasi suggerimento è molto apprezzato.

    
posta billy.bob 21.01.2011 - 11:11
fonte

5 risposte

7

Gli oggetti non sono ADT (*) . (Quindi in C # String e Int32 sono non ADT.)

Con quello fuori mano, un tipo di dati astratto "ha un nome pubblico, una rappresentazione nascosta e operazioni per creare, combinare e osservare i valori dell'astrazione". (Citando dal documento collegato.)

(*) In breve, Cook spiega che:

  • Gli oggetti non possono ispezionare la rappresentazione nascosta di altri oggetti, a differenza dei membri di un ADT. Ciò implica che i valori di un ADT possono essere implementati in modo efficiente, anche per operazioni che richiedono l'ispezione di più valori astratti.
  • Gli oggetti si comportano come una funzione caratteristica rispetto ai valori di un tipo, piuttosto che come un'algebra. Gli oggetti usano astrazione procedurale piuttosto che tipo astrazione
  • Gli ADT di solito hanno un'implementazione unica in un programma. Quando il proprio linguaggio ha moduli, è possibile avere più implementazioni di un ADT, ma di solito non possono interoperare.
risposta data 21.01.2011 - 13:50
fonte
4

Un tipo di dati astratto è un concetto teorico (una raccolta di firme e regole di funzione) per descrivere i valori che un tipo può avere definendo come questi valori possono essere costruiti e quali costruzioni creano gli stessi valori. Ad esempio, per i numeri interi, puoi avere:

Tre firme:

zero: INTEGER
successor(INTEGER): INTEGER
predecessor(INTEGER): INTEGER

E le seguenti regole:

successor(predecessor(X)) = X
predecessor(successor(X)) = X

Puoi introdurre addizioni, sottrazioni e qualsiasi altra operazione fornendo queste regole.

Gli ADT sono veicoli per capire i tipi, in modo simile a una macchina di Turing per capire il calcolo.

Esiste una relazione tra ADT e tipi di dati nei linguaggi di programmazione, più specificamente classi in lingue OO. Ma questa è una relazione complessa, poiché le istanze di classi in OO introducono l'idea di "identità dell'oggetto" che non è presente negli ADT.

    
risposta data 02.07.2015 - 14:44
fonte
1

Un tipo di dati astratto è definito dalla sua interfaccia. Penso che un buon esempio di questo è l'API JDBC. Si cerca un Datasource (un ADT) e si ottiene un'implementazione specifica di quell'origine dati a seconda del tipo di database a cui si desidera accedere. Si creano istruzioni e si lavora con ResultSet, che sono anche ADT. Il punto è che l'interfaccia è definita, l'implementazione non lo è.

Perché vorresti questo? Ancora con JDBC, consente un codice più portatile perché, poiché si utilizza l'interfaccia per accedere all'oggetto, non è necessario preoccuparsi di quale tipo di database si sta accedendo. Questo può essere gestito esattamente in un punto: dove è definita l'origine dati. Se si utilizzano le fabbriche, la fabbrica può restituire oggetti diversi in base al contesto dei dati che contengono, pur consentendo al codice operativo su tali oggetti di rimanere lo stesso.

Alcuni motivi per cui vedo l'utilizzo di ADT:

  • Per evitare di ripetere te stesso. Se hai solo bisogno di gestire le specifiche in un posto, le modifiche sono più facili da fare e tenere traccia.
  • Fornire un livello di astrazione. Gli ADT ti permettono di pensare ad un livello più alto. Puoi pensare a cosa fare piuttosto che a come farlo.
risposta data 21.01.2011 - 16:15
fonte
0

Un tipo di dati astratti (ADT) è un tipo la cui implementazione interna può cambiare senza influire sul codice che la utilizza. Con "implementazione interna", intendo che rimane l'interfaccia (API, se lo si desidera) per l'ADT.

In questo senso, la classica classe "internals-hiding" implementa un ADT, sarebbe possibile avere un'implementazione parallela con un'implementazione interna diversa, a patto che l'API rimanga invariata.

    
risposta data 02.07.2015 - 14:35
fonte
-2

Se conosci il modello di progettazione di fabbrica, sarà più comprensibile ciò che è ADT.

Cerchiamo di discuterne con l'esempio, Prendiamo un negozio di pizza, che ha le filiali regionali a New York, Chicago, California, ecc. La sede centrale, che è a Washington, definisce come dovrebbe preparare una pizza e lasciare che le filiali regionali li implementa da soli.

Qui, Pizza è un ADT e NYPizza, ChicagoPizza, CaliforniaPizza sono sottotipi.

Spero che questo aiuti a ottenere l'idea in modo astratto.

    
risposta data 21.01.2011 - 11:58
fonte

Leggi altre domande sui tag