Descripción de los tipos de datos abstractos (ADT) [duplicado]

14

Anoche, navegando a través de Code Complete, encontré la explicación de los tipos de datos abstractos.

Debo haberlo leído 5 veces, y el artículo de Wikipedia tampoco ayuda mucho. Entonces, lo que busco es una explicación simple de exactamente ¿qué es un tipo de datos abstractos ? ¿Algún ejemplo sólido? ¿En C # o VB?

Entiendo que String se supone que es uno, ¿por qué es esto? ¿Y por qué no es Int32 uno? ¿O es?

Cualquier puntero es muy apreciado.

    
pregunta billy.bob 21.01.2011 - 11:11

5 respuestas

7

Los objetos no son ADT (*) . (Por lo tanto, en C # String y Int32 son no ADT).

Con eso fuera del camino, un tipo de datos abstracto "tiene un nombre público, una representación oculta y operaciones para crear, combinar y observar los valores de la abstracción". (Cotización del papel vinculado).

(*) Brevemente, Cook explica que:

  • Los objetos no pueden inspeccionar la representación oculta de otros objetos, a diferencia de los miembros de un ADT. Eso implica que los valores de un ADT pueden implementarse de manera eficiente, incluso para operaciones que requieren la inspección de múltiples valores abstractos.
  • Los objetos se comportan como una función característica sobre los valores de un tipo, en lugar de como un álgebra. Los objetos utilizan abstracción de procedimiento en lugar de tipo abstracción
  • Los ADT generalmente tienen una implementación única en un programa. Cuando el lenguaje de uno tiene módulos, es posible tener implementaciones múltiples de un ADT, pero generalmente no pueden interoperar.
respondido por el Frank Shearar 21.01.2011 - 13:50
4

Un tipo de datos abstracto es un concepto teórico (una colección de firmas y reglas de funciones) para describir los valores que un tipo puede tener al definir cómo se pueden construir estos valores y qué construcciones crean los mismos valores. Por ejemplo, para enteros, puede tener:

Tres firmas:

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

Y las siguientes reglas:

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

Puede introducir sumas, restas y cualquier otra operación al proporcionar estas reglas.

Los ADT son un vehículo para comprender tipos, similar a una máquina de Turing que se usa para entender computación.

Existe una relación entre los ADT y los tipos de datos en los lenguajes de programación, Más específicamente clases en idiomas OO. Pero esa es una relación compleja, ya que las instancias de las clases en OO introducen la idea de "identidad de objeto" que no está presente en los ADT.

    
respondido por el Bernte 02.07.2015 - 14:44
1

Un tipo de datos abstracto se define por su interfaz. Creo que un buen ejemplo de esto es la API JDBC. Busca una fuente de datos (ADT) y obtiene una implementación específica de esa fuente de datos en función del tipo de base de datos al que desea acceder. Crea estados de cuenta y trabaja con ResultSets, que también son ADT. El punto es que la interfaz está definida, la implementación no lo está.

¿Por qué querrías esto? Nuevamente con JDBC, permite un código más portátil porque, dado que usa la interfaz para acceder al objeto, no necesita preocuparse por el tipo de base de datos a la que accede. Eso se puede manejar en exactamente un lugar: donde se define la fuente de datos. Si está utilizando fábricas, la fábrica puede devolver diferentes objetos según el contexto de los datos que contienen, al tiempo que permite que el código que opera en esos objetos permanezca igual.

Algunas razones que veo para usar ADTs:

  • Para evitar repetirte. Si solo necesita manejar datos específicos en un solo lugar, los cambios son más fáciles de hacer y rastrear.
  • Para proporcionar un nivel de abstracción. Los ADT te permiten pensar en un nivel superior. Puedes pensar qué hacer en lugar de cómo hacerlo.
respondido por el Michael K 21.01.2011 - 16:15
0

Un tipo de datos abstractos (ADT) es cualquier tipo cuya implementación interna puede cambiar sin afectar el código que lo usa. Por "implementación interna", me refiero a que la interfaz (API, si lo desea) para el ADT permanece.

En ese sentido, la clase clásica de "ocultamiento interno" implementa un ADT, sería posible tener una implementación paralela con una implementación interna diferente, siempre y cuando la API permanezca sin cambios.

    
respondido por el Vatine 02.07.2015 - 14:35
-2

Si conoce el patrón de diseño de fábrica, será más comprensible lo que es ADT.

Discutámoslo con el ejemplo, Tomemos una pizzería, que tiene sucursales regionales en Nueva York, Chicago, California, etc. La oficina central, que está en Washington, define cómo debe prepararse una pizza y dejar que las sucursales regionales implementa eso por su cuenta.

Aquí, Pizza es un ADT, y NYPizza, ChicagoPizza, CaliforniaPizza son subtipos.

Espero que esto ayude a obtener la idea de una manera abstracta.

    
respondido por el Abimaran Kugathasan 21.01.2011 - 11:58

Lea otras preguntas en las etiquetas