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