domingo, 29 de julio de 2012

1.2. Cada objeto tiene una interfaz.

1.2. Cada objeto tiene una interfaz

Los objetos son únicos, no tiene sentido tenerlos por duplicado. Sin embargo, sí es importante considerar las características y comportamientos comunes de estos: lo que les hace pertenecientes a una misma clase. Esta idea se uso incluso en el primer lenguaje orientado a objetos, Simula-67, con la palabra reservada class.

Simula, como su nombre lo indica, fue creado para desarrollar simulaciones, como el clásico "problema del cajero". Aquí se tiene un grupo de cajeros, clientes, cuentas, transacciones y unidades de moneda (es decir, un montón de objetos). Éstos objetos pueden agruparse en "clases de objetos", y de allí proviene la palabra reservada class.

Crear tipos de datos abstractos (clases) es un concepto fundamental de la POO. Éstos trabajan como tipos de datos predefinidos: así es posible crear variables de un tipo (los llamados objetos o instancias), y manipular estas variables (mediante el envío de mensajes o peticiones).

Cada objeto pertenece a una clase en particular, lo que define sus características y comportamientos.

Prácticamente todos los lenguajes de programación orientados a objetos usan la palabra reservada class, y por lo general, los que no, usan la palabra reservada type; por lo que podemos relacionar dichos términos entre sí.

** Hay quienes suelen hacer distinción, alegando que type determina la interfaz; mientras que class es una implementación particular de dicha interfaz.


Las unidades de almacinamiento de los ordenadores están definidas por tipos de datos ya establecidos. Sin embargo, el programador no está obligado a usar estos tipos predefinidos: puede usar clases, es decir, añadir nuevos tipos de datos específicos en base a sus necesidades.

** El sistema de programación acoge las clases y las adopta como uno más de sus tipos predefinidos.

El uso de técnicas POO puede reducir fácilmente un amplio conjunto de problemas a una solución simple (es innegable, incluso si no se está de acuerdo con que se trata de "simular" la realidad).

Una vez establecida una clase, pueden hacerse tantos objetos de esta como se quiera, y manipularlos como si fueran elementos que existen en el problema que se está resolviendo. 

** De hecho, uno de los desafíos más grandes de la POO es crear una correspondencia para cada elemento que existe en el espacio del problema, mediante los objetos que se definen en el espacio de la solución.

La utilidad de cada objeto se percibe en su interfaz. La interfaz viene a ser el conjunto de las peticiones que puede hacer cada objeto, y suele estar determinada por el tipo al que pertenece.

** Cada objeto puede satisfacer sólo ciertas peticiones. Por ejemplo: completar una transacción, dibujar algo en pantalla o activar un interruptor.

He aquí un simple ejemplo, de una bombilla:

Nombre del tipoLuz
Interfazencender()
apagar()
intensificar()
atenuar()

Clase Luz

Como ya se dijo, la interfaz establece qué peticiones pueden hacerse a un objeto particular. Sin embargo, estos deben tener un fundamento: es decir, en algún sitio debe codificarse  las instrucciones correspondientes a cada petición.

Cada tipo presenta una función asociada para las posible peticiones. De ese modo, cuando se hace una petición a algún objeto, se llama a esa función (se la invoca). Este procesillo se resume diciendo "se ha enviado un mensaje" (ha hecho una petición a un objeto).

En el ejemplo, el nombredel tipo o clase es: Luz; y se ha creado un objeto perteneciente a dicha clase, con el nombre de: luz1. Las peticiones que se pueden hacer a un objeto del tipo luz están detalladas en su interfaz; sin embargo, las peticiones se hacen a los objetos en particular.

¿Cómo? Sólo debe adherir al nombre del objeto la petición que se le quiere encomendar.
Por ejemplo: luz1.encender();

** El diagrama usado para mostrar el ejemplo sigue el formato del Lenguaje Unificado de Modelado: UML. El formato representa a las clases mediante cajas, donde el nombre va en la parte superior. En la parte central van los atributos que se requieran especificar (en este caso no hubo); y en la parte de abajo los métodos (las funciones que pueden ser invocadas/llamadas por petición). Usualmente se muestra la parte superior e inferior únicamente; sin embargo, es importante tener en cuenta que tampoco es necesario mostrar la parte de abajo.