354

Capítulo 8 Clases y objetos: un análisis más detallado

los objetos existentes cumplen con sus necesidades, mecanismos de exploración que determinan cuáles clases están 
disponibles y qué tan estrechamente cumplen con los requerimientos de los desarrolladores de software, etcétera. 
Muchos problemas interesantes de investigación y desarrollo se han resuelto, y muchos más necesitan resolverse. 
Estos problemas se resolverán, debido a que el valor potencial de la reutilización de software es enorme.

8.15 Abstracción de datos y encapsulamiento

Las clases normalmente ocultan los detalles de la implementación a los clientes. Esto se conoce como 

oculta-

miento de información

. Como ejemplo de ello, analicemos la estructura de datos llamada 

pila

, que presenta-

mos en la sección 6.6. Recuerde que una pila es una estructura de datos del tipo 

último en entrar, primero en 

salir (UEPS)

: el último elemento que se mete (inserta) en la pila es el primer elemento que se saca (extrae) de 

ella.

Las pilas pueden implementarse mediante arreglos y con otras estructuras de datos, como las listas enlaza-

das. (Hablaremos sobre las pilas y las listas enlazadas en el capítulo 17, Estructuras de datos, y en el capítulo 19, 
Colecciones). El cliente de una clase pila no necesita preocuparse por la implementación de la pila. El cliente sólo 
sabe que cuando se colocan elementos de datos en la pila, éstos se recuperarán en el orden del último en entrar, 
primero en salir. El cliente se preocupa acerca de qué funcionalidad ofrece una pila, pero no acerca de cómo se 
implementa esa funcionalidad. A este concepto se le conoce como 

abstracción de datos

. Aunque los programa-

dores pudieran conocer los detalles de la implementación de una clase, no deben escribir código que dependa de 
esos detalles. Esto permite que una clase en particular (como una que implemente a una pila y sus operaciones: 
meter y sacar) se reemplace con otra versión, sin afectar al resto del sistema. Mientras que los servicios 

public

 de 

la clase no cambien (es decir, que cada método original tenga aún el mismo nombre, tipo de valor de retorno y 
lista de parámetros en la declaración de la nueva clase), el resto del sistema no se ve afectado.

La mayoría de los lenguajes de programación enfatizan las acciones. En estos lenguajes, los datos existen 

para apoyar las acciones que los programas deben realizar. Los datos son “menos interesantes” que las acciones. 
Los datos son “crudos”. Sólo existen unos cuantos tipos primitivos, y es difícil para los programadores crear sus 
propios tipos. Java y el estilo orientado a objetos de programación elevan la importancia de los datos. Las princi-
pales actividades de la programación orientada a objetos en Java son la creación de tipos (por ejemplo, clases) y 
la expresión de las interacciones entre objetos de esos tipos. Para crear lenguajes que enfaticen los datos, la comu-
nidad de lenguajes de programación necesitaba formalizar ciertas nociones sobre los datos. La formalización que 
consideramos aquí es la noción de 

tipos de datos abstractos (ADTs)

, los cuales mejoran el proceso de desarrollo 

de software.

Considere el tipo primitivo 

int

, el cual la mayor parte de las personas lo asociarían con un entero en ma-

temáticas. En vez de ello, un 

int

 es una representación abstracta de un entero. A diferencia de los enteros 

matemáticos, los números 

int

 de computadora tienen un tamaño fi jo. Por ejemplo, el tipo 

int

 en Java está 

limitado al rango desde 

2,147,483,648 hasta 

+

2,147,483,647. Si el resultado de un cálculo queda fuera de este 

rango se produce un error, y la computadora responde en cierta forma dependiente del equipo. Por ejemplo, 
podría producir “silenciosamente” un resultado incorrecto, como un valor demasiado largo como para caber en 
una variable 

int

 (lo que comúnmente se conoce como 

desbordamiento aritmético

). Los enteros matemáticos 

no tienen este problema. Por lo tanto, la noción de un 

int

 de computadora es solamente una aproximación de la 

noción de un entero real. Lo mismo se aplica al tipo 

float

 y a los demás tipos integrados.

Hemos dado por sentado la noción de 

int

 hasta este punto, pero ahora analicémosla desde una nueva pers-

pectiva. Los tipos como 

int

float

 y 

char

 son ejemplos de tipos de datos abstractos. Estos tipos son representa-

ciones de nociones reales hasta cierto nivel satisfactorio de precisión, dentro de un sistema computacional.

En realidad, un ADT captura dos nociones: una 

representación de datos

 y las 

operaciones

 que pueden 

realizarse sobre esos datos. Por ejemplo, en Java un 

int

 contiene un valor entero (datos) y proporciona las opera-

ciones de suma, resta, multiplicación, división y residuo; sin embargo, la división entre cero está indefi nida. Los 
programadores en Java utilizan clases para implementar tipos de datos abstractos.

Observación de ingeniería de software 8.15

Los programadores pueden crear tipos mediante el uso del mecanismo de clases. Pueden diseñarse nuevos tipos de 
manera que sean tan convenientes de usar como los tipos integrados. Esto marca a Java como un lenguaje extensible. 
Aunque el lenguaje es fácil de extender mediante nuevos tipos, el programador no puede alterar el lenguaje básico 
en sí.

08_MAQ_CAP_08.indd354

4/19/081:23:56AM