4.5. Tipos abstractos de datos

La habilidad para empaquetar datos junto con funciones permite la creación de nuevos tipos de datos. Esto se llama a menudo encapsulación [48] Un tipo de dato existente puede contener varias piezas de datos empaquetadas juntas. Por ejemplo, un float tiene un exponente, una mantissa y un bit de signo. Le podemos pedir que haga varias cosas: sumarse a otro float o a un int, etc. Tiene características y comportamiento.

La definición de Stash crea un nuevo tipo de dato. Se le pueden agregar nuevos elementos (add()), sacar (fetch()) y agrandarlo (inflate()). Se puede crear uno escribiendo Stash s; igual que cuando se crea un float diciendo float x;. Un Stash también tiene características y un comportamiento bien determinado. Aunque actúe igual que un tipo de dato predefinido como float se dice que Stash es un tipo abstracto de dato tal vez porque permite abstraer un concepto desde el espacio de los problemas al espacio de la solución. Además, el compilador de C++ lo tratará exactamente como a un nuevo tipo de dato y si, por ejemplo, declara una función que acepta un Stash como argumento, el compilador se asegurará de que no se le pase otra cosa a la función. De modo que se realiza el mismo nivel de comprobación de tipos tanto para los tipos abstractos de datos (a veces también llamados tipos definidos por el usuario) como para los tipos predefinidos.

Sin embargo, notará inmediatamente una diferencia en la forma en que se realizan las operaciones sobre los objetos. Se hace objeto.funciónMiembro(listaArgumentos) o sea, «se llama a un método de un objeto». Pero en la jerga de la orientación a objetos, eso también se denomina «enviar un mensaje a un objeto». De modo que para una Stash s, en esta jerga la sentencia s.add(&i) le «envía un mensaje a s» diciéndole «añadete (add()) esto». De hecho, la programación orientada a objetos se puede resumir en la siguiente frase: enviar mensajes a objetos. Realmente, ¿eso es todo lo que se hace? crear un montón de objetos y enviarles mensajes. El truco, obviamente, es entender qué son en nuestro problema los objetos y los mensajes, pero una vez que se ha cumplido esa etapa, la implementación en C++ será sorprendentemente directa.



[48] Este término puede causar debates. Algunas personas lo utilizan tal y como está definido aquí, aunque otras lo usan para describir el control de acceso, término que se discutirá en el siguiente capítulo.