1.-CONCEPTOS
DE PROGRAMACIÓN ORIENTADA A OBJETOS
1.1
Introducción
Un
concepto muy importante introducido por la programación estructurada es la abstracción. La abstracción
se puede definir como la capacidad de examinar algo sin preocuparse de los
detalles internos. En un programa estructurado es suficiente conocer que un
procedimiento dado realiza una tarea específica. El cómo se realiza la tarea
no es importante; mientras el procedimiento sea fiable se puede utilizar sin
tener que conocer cómo funciona su interior. Esto se conoce como abstracción
funcional.
Una debilidad de la programación estructurada aparece cuando programadores
diferentes trabajan en una aplicación como un equipo. Dado que programadores
diferentes manipulan funciones separadas que pueden referirse a tipos de datos
mutuamente compartidos, los cambios de un programador se deben reflejar en el
trabajo del resto del equipo. Otro problema de la programación estructurada es
que raramente es posible anticipar el diseño de un sistema completo antes de
que se implemente realmente.
En esencia, un defecto de la programación estructurada, como se acaba de ver,
consiste en la separación conceptual de datos y código. Este defecto se agrava
a medida que el tamaño del programa crece.
1.2
Abstracción de datos
La
abstracción de datos permite no preocuparse de los detalles no
esenciales. Existe en casi todos los lenguajes de programación. Las estructuras
de datos y los tipos de datos son un ejemplo de abstracción. Los procedimientos
y funciones son otro ejemplo. Sólo recientemente han emergido lenguajes que
soportan sus propios tipos abstractos de
datos (TAD), como Pascal, Ada, Modula-2 y C++.
1.3
¿Qué es la programación orientada a objetos?
Se
puede definir POO como una técnica o
estilo de programación que utiliza objetos como bloque esencial de construcción.
Los objetos son en realidad como los tipos abstractos de datos. Un TAD
es un tipo definido por el programador junto con un conjunto de
operaciones que se pueden realizar sobre ellos. Se denominan abstractos para
diferenciarlos de los tipos de datos fundamentales o básicos.
En C se puede definir un tipo abstracto de datos utilizando typedef
y struct y la implementación de las operaciones con un conjunto de
funciones.
C++ tiene muchas facilidades para
definir y utilizar un tipo TAD.
Al igual que los tipos de datos definidos por el usuario, un objeto es una
colección de datos, junto con las funciones asociadas, utilizadas para operar
sobre esos datos. Sin embargo la potencia real de los objetos reside en las
propiedades que soportan: herencia, encapsulación y polimorfismo,
junto con los conceptos básicos de objetos,
clases, métodos y mensajes.
1.4
Trabajando con objetos
En
programación convencional los programas se dividen en dos componentes:
procedimientos y datos. Este método permite empaquetar código de programa en
procedimientos, pero ¿Qué sucede con los datos? Las estructuras de datos
utilizadas en programación son globales o se pasan como parámetros. En esencia
los datos se tratan separadamente de los procedimientos.
En POO un programa se divide en componentes que contienen
procedimientos y datos. Cada componente se considera un objeto.
Un objeto es una unidad que
contiene datos y las funciones que operan sobre esos datos. A los elementos
de un objeto se les conoce como miembros;
las funciones que operan sobre los datos se denominan métodos (en C++ también se llaman funciones miembro) y los datos se denominan miembros datos. En C++ un programa consta de objetos. Los objetos de
un programa se comunican entre sí mediante el paso o envío de mensajes (acciones que debe ejecutar el objeto).
En POO los objetos pueden se cualquier entidad del mundo real:
- Objetos
físicos
* automóviles en una simulación de tráfico
* aviones en un sistema de control de tráfico aéreo
* animales mamíferos, etc
-
Elementos de interfaces gráficos de
usuarios
* ventanas
* iconos
* menús
* ratones
-
Estructuras de
datos
* arrays
* pilas
* árboles binarios
-
Tipos de datos definidos por el usuario
* números complejos
* hora del día
1.5
Definición de objetos
Un
objeto es una unidad que contiene
datos y las funciones que operan sobre esos datos. Los datos se denominan miembros
dato y las funciones métodos o funciones miembro.
Los datos y las funciones se encapsulan
en una única entidad. Los datos están ocultos y sólo mediante las funciones
miembro es posible acceder a ellos.
1.6
Clases
Una
clase es un tipo definido por el usuario que determina las
estructuras de datos y las operaciones asociadas con ese tipo. Cada vez que se
construye un objeto de una clase, se crea una instancia de esa clase. En general, los términos objetos
e instancias de una clase se pueden utilizar indistintamente.
Una clase es una colección de objetos similares y un objeto es una instancia de
una definición de una clase.
La comunicación con el objeto se realiza a través del paso de mensajes. El
envío a una instancia de una clase produce la ejecución de un método o función
miembro. El paso de mensajes es el término utilizado para referirnos a la
invocación o llamada de una función miembro de un objeto.
1.7
Mensajes: activación de objetos
Los
objetos pueden ser activados mediante la recepción de mensajes. Un mensaje
es simplemente una petición para que un objeto se comporte de una
determinada manera, ejecutando una de sus funciones miembro. La técnica de
enviar mensajes se conoce como paso de
mensajes.
Estructuralmente
un mensaje consta de tres partes:
- la identidad del objeto receptor
- la función miembro del receptor
cuya ejecución se ha solicitado
- cualquier otra información adicional
que el receptor pueda necesitar para
ejecutar el método requerido.
En C++, la notación utilizada es
nombre_del_objeto.función_miembro
Ejemplo:
Se tiene un objeto o1 con los siguientes miembros dato:
nombre_alumno y curso y con las funciones miembro: leer_nombre e imprimir.
Si el objeto o1 recibe el mensaje imprimir, esto se expresa:
o1.imprimir()
La sentencia anterior se lee: "enviar mensaje imprimir al objeto
o1". El objeto o1 reacciona al mensaje ejecutando la función miembro de
igual nombre que el mensaje.
El
mensaje puede llevar parámetros:
o1.leer_nombre("Pedro Pérez")
Sin los mensajes los objetos que se definan no podrán comunicarse con otros
objetos. Desde un punto de vista convencional, el paso
de mensajes no es más que el sinónimo de llamada
a una función.
1.8
Programa orientado a objetos
Un
programa orientado a objetos es una colección de clases. Necesitará una función
principal que cree objetos y comience la ejecución mediante la invocación de
sus funciones miembro.
Esta organización conduce a separar partes diferentes de una aplicación en
distintos archivos. La idea consiste en poner la descripción de la clase para
cada una de ellas en un archivo separado. La función principal también se pone
en un archivo independiente. El compilador ensamblará el programa completo a
partir de los archivos independientes en una única unidad.
En realidad, cuando se ejecuta un programa orientado a objetos, ocurren tres
acciones:
1.
Se crean los objetos cuando se necesitan
2.
Los mensajes se envían desde uno objetos y se reciben en otros
3. Se borran los objetos cuando ya no son necesarios y se recupera la memoria
ocupada por ellos
1.9
Herencia
La
herencia es la propiedad que permite a los objetos construirse a
partir de otros objetos.
Una clase se puede dividir en subclases.
En C++ la clase original se denomina clase
base; las clases que se definen a partir de la clase base, compartiendo sus
características y añadiendo otras nuevas, se denominan clases
derivadas.
Las clases derivadas pueden heredar código y datos de su clase base añadiendo
su propio código y datos a la misma.
La herencia impone una relación jerárquica entre clases en la cual una clase hija hereda de su clase padre.
Si una clase sólo puede recibir características de otra clase base, la
herencia se denomina herencia simple.
Si una clase recibe propiedades de más de una clase base, la herencia se
denomina herencia múltiple.
1.10
Polimorfismo
En
un sentido literal, significa la cualidad de tener más de una forma. En el
contexto de POO, el polimorfismo
se refiere al hecho de que una misma operación puede tener diferente
comportamiento en diferentes objetos. Por ejemplo, consideremos la operación
sumar. El operador + realiza la suma de dos números de diferente tipo. Además
se puede definir la operación de sumar dos cadenas mediante el operador suma.
|