¿QUE ES POO?

  Programación Orientada a Objetos.
El primer paso que necesitamos para comenzar con Orientación  a Objetos es modificar la visión del problema que tenemos que resolver  respecto a la visión tradicional.
 El  modelo de Programación Orientada a objetos nos describe la manera de  construir  programas  organizados como colecciones de objetos, entendiendo por objeto,   la representación informática de una entidad.
 
 Se describe un determinado sistema como un conjunto de objetos  que representan abstracciones del mundo real o virtual.
 Cada objeto es una representación abstracta de una entidad del mundo real o virtual en términos de:
  • Un conjunto de características esenciales (atributos).
  • Un conjunto de operaciones o comportamientos que permiten la manipulación de estos atributos (métodos).
 ¿Qué es el sistema? ¿Qué objetos intervienen?
 
¿Qué hace el sistema?
El comportamiento del sistema estará simulado a través del comportamiento de los objetos que lo componen.
Los objetos recibirán solicitudes o peticiones externas  y de acuerdo con la naturaleza de estas peticiones se comportarán de una determinada forma.
2.      Mensajes:
 ¿Cómo se consigue un determinado comportamiento de un objeto?
En POO, cualquier acción que lleva a cabo el sistema se inicia a través del envío de una petición a un objeto que será el responsable de la acción.
Las peticiones realizadas a los objetos son los mensajes.
Mensaje:
  •  Un mensaje es  una petición enviada  a un objeto para que este se comporte de una determinada manera, realizando una de sus operaciones. Si el receptor de la solicitud acepta el mensaje, aceptará la responsabilidad de llevar a cabo la acción. En respuesta al mensaje, el receptor se comportará de una determinada forma.
Estructura de un mensaje.
Cada  mensaje consta de tres partes:
  • Identidad del objeto al que va dirigido el mensaje.
  • Operación solicitada (método).
  • Información adicional ( argumentos), necesaria para poder ejecutar el método.
 Ejemplo 1:
                                                                                                                            
  
UnCoche.arrancar()         El mensaje solicita al objeto UnCoche, la operación arrancar(); en respuesta al mensaje, UnCoche modificará su atributo enmarcha asignándole el valor “cierto”.
UnCoche.acelerar(20)      El mensaje solicita al objeto UnCoche, la operación acelerar() y le pasa como información adicional el incremento de velocidad correspondiente; en respuesta al mensaje, UnCoche modificará su atributo velocidad incrementando su valor en 20.
UnCoche.frenar(20)           El mensaje solicita al objeto UnCoche, la operación frenar() y le pasa como información adicional el decremento de velocidad correspondiente; en respuesta al mensaje, UnCoche modificará su atributo velocidad decrementando su valor en 20.
UnCoche.verVelocidad() El mensaje solicita al objeto UnCoche, la operación verVelocidad(); como respuesta al mensaje UnCoche mira el valor del atributo velocidad y lo devuelve al exterior. (Acceso al atributo velocidad para ver su valor, sin cambiar su valor).
UnCoche.parar()                El mensaje solicita al objeto UnCoche, la operación de parar. UnCoche no podrá parar, a menos que su velocidad sea 0, en ese caso el objeto UnCoche modificará su atributo enmarcha   asignándole el valor “falso”      
3.      Conclusión.
 Podríamos resumir  la filosofía de la Programación Orientada a Objetos:
La orientación a objetos propone un método de descomposición, no basado únicamente en lo que hace el sistema, sino en la integración de lo que el sistema es, un conjunto de objetos y lo que hace, respuesta  de los objetos  a  los mensajes que recibe.
Vemos por tanto que, un  modelo de programación Orientada a Objetos, nos obliga a construir los programas como colecciones de objetos; el estudio completo del modelo debe contemplar fundamentalmente los aspectos siguientes:
  • Objetos.
  • Tipos Abstractos de Datos:TAD.
  • Clases.
  • Herencia.
  • Polimorfismo.

4.      OBJETOS


    ¿Qué es lo que define a un objeto?

 Cada objeto tiene tres características


  •  Estado: Es el conjunto valores de los   atributos  que tiene el objeto.  El estado de un objeto evoluciona con el tiempo. Algunos atributos pueden ser constantes, otros serán variables.  El estado de un objeto se almacena en las variables asociadas a cada objeto.
  • Comportamiento: Agrupa todas las competencias de un objeto.  Cada competencia se denomina operación o método.
              En general, existen tres tipos de operaciones o métodos, según  Khoshafian, 90:
             a.)  Los de actualización que cambian todo o parte del estado de un objeto (métodos set…()). Se implementan mediante procedimientos.
             b.)  Los de acceso  que devuelven todo o parte  del estado de un objeto, permiten acceder al estado de un objeto sin modificarlo (métodos get…()). Se implementan mediante funciones. 
             c.)  Los que permiten crear un objeto e inicializarlo (Constructores). Su implementación depende del lenguaje.
             d.)  Los que permiten liberar el estado de un objeto y lo destruyen (Destructores). Su implementación depende del lenguaje. 
Clasificación similar a la realizada por Booch en 1994, con cinco tipos: modificadores (actualización), selectores (acceso), constructores, destructores y un último grupo de iteradores (con acceso a toda la estructura del objeto).
  •  Identidad: La identidad permite distinguir los objetos de forma no ambigua, independientemente de su estado.   Para la identificación de un objeto se emplean nombres definidos por el usuario y direcciones o referencias a memoria
El conjunto de características que definen un objeto puede esquematizarse mediante la expresión:
 OBJETO   =   ESTADO + COMPORTAMIENTO +IDENTIDAD

5.      Clases vs Tipos Abstractos de Datos TAD.
Puesto que los elementos fundamentales en Programación Orientada  a Objetos son los objetos, se hace necesario un estudio de estos que nos ayude a clasificarlos en grupos de objetos similares, en cuanto a los atributos y métodos que los definen.
Necesitamos por lo tanto, una herramienta que nos permita definir estas características, comunes a un grupo de objetos, y que sirven para diferenciar un grupo de objetos del resto de los grupos de objetos.
Esta herramienta es la utilización de tipos abstractos de datos.
Definición.
Un tipo abstracto de datos (TAD) describe un tipo definido  de datos que incluye una  estructura de datos,  una lista de operaciones disponibles sobre los datos (servicios)  que nos permiten  su manipulación y un mecanismo que permite separar la utilización de los servicios de un TAD, de la implementación interna de los datos. Este mecanismo asegura que los datos sean manipulados, únicamente, a través del conjunto de operaciones definidas.
El conjunto de servicios que pueden ser solicitados a los objetos de un TAD (conjunto de mensajes a los que un objeto de un TAD es capaz de responder) se denomina interfaz o protocolo.
En un TAD podremos distinguir:
La interfaz del TAD:                          Proporciona la  funcionalidad del TAD.
La implementación del TAD:    Implementación de los servicios del TAD.
                                                                         Implementación interna de los datos
La  interfaz de una clase se puede dividir, según la  visibilidad que define, en tres partes [Booch, 94]:
  • pública
  • privada
  • protegida.

Un TAD constará  de tres partes:
                    1.      Representación interna de  los  datos. 
                    2.      Definición de aquellos  métodos ó funciones que describen el conjunto de operaciones o servicios de un TAD.  
                    3.      El mecanismo de  Encapsulación que implementa la interfaz.
 Generalmente, los TAD están implementados, en cada lenguaje de programación Orientado a Objetos mediante  el concepto de clase.
  • El TAD representa  la noción abstracta.
  • La clase representa la implementación concreta en el lenguaje.

Clase.
Una clase es un marco que permite crear objetos semejantes; es decir con las mismas características.
Una clase representa un grupo de objetos que comparten una misma estructura y un mismo comportamiento; es decir,  una clase representa un grupo de objetos con los mismos atributos y los mismos métodos.
La clase definirá datos, métodos y el mecanismo de encapsulación correspondiente (interfaz de la clase) que  se puede dividir en tres partes según su visibilidad  [Booch, 94]:
cada usuario podrá  tener acceso a una parte  de la clase o a la clase completa  de acuerdo con las características de la llamada interfaz de clase.
-                     Parte pública:  Define qué parte de la clase será accesible a todos los posibles usuarios.
-                     Parte protegida: Define qué parte será accesible sólo desde la clase y de otras clases definidas a partir de ella (derivadas o subclases).
-                     Parte privada:  Define qué parte es accesible únicamente desde la clase.
Este mecanismo de  encapsulación, permite enlazar el código que manipula los datos con los propios datos, resguardándolos de interferencias externas y del mal uso.
  
Objetos como instancias de una clase.
Llegamos aquí a una nueva definición de objeto: Es una instancia de una clase. Todos los objetos son instancias de clases. Todos los objetos de una clase comparten una misma estructura y  un mismo comportamientocomportamiento.
El estado de un objeto corresponde,  generalmente,  a  la parte privada de un objeto y los métodos  a la parte pública.
Gráficamente  puede representarse un objeto:
Los datos se encuentran ocultos  y la única conexión con el exterior se realiza  a través  de los mensajes al objeto. Los datos  sólo pueden ser manipulados a través de las operaciones asociadas al propio objeto (métodos). Los datos están encapsulados. Desde fuera el usuario de una clase sólo ve una lista de métodos. Desde dentro, el programador de la clase, ve las variables usadas para  el mantenimiento del estado del objeto.
Por ejemplo para un objeto UnCoche:
UnCoche.arrancar()          El mensaje solicita al objeto UnCoche, la operación arrancar(); en respuesta al mensaje, UnCoche modificará su atributo enmarcha asignándole el valor “cierto”.
UnCoche.acelerar(20)      El mensaje solicita al objeto UnCoche, la operación acelerar() y le pasa como información adicional el incremento de velocidad correspondiente; en respuesta al mensaje, UnCoche modificará su atributo velocidad incrementando su valor en 20.
UnCoche.frenar(20)           El mensaje solicita al objeto UnCoche, la operación frenar() y le pasa como información adicional el decremento de velocidad correspondiente; en respuesta al mensaje, UnCoche modificará su atributo velocidad decrementando su valor en 20.
UnCoche.verVelocidad() El mensaje solicita al objeto UnCoche, la operación verVelocidad(); como respuesta al mensaje UnCoche mira el valor del atributo velocidad y lo devuelve al exterior. (Acceso al atributo velocidad para ver su valor, sin cambiar su valor).
UnCoche.parar()                El mensaje solicita al objeto UnCoche, la operación de parar. UnCoche no podrá parar, a menos que su velocidad sea 0, en ese caso el objeto UnCoche modificará su atributo enmarcha   asignándole el valor “falso”       
Otro ejemplo: Pila
 
pila.crearPila()                      El mensaje solicita al objeto pila, la operación crearPila(); en respuesta al mensaje, pila modificará su atributo cima asignándole el valor –1 correspondiente a una pila vacía.
pila.insertarPila (20)            El mensaje solicita al objetopila, la operación insertarPila() y le pasa como información adicional el dato que se insertará; en respuesta al mensaje, pila modificará su atributo  cima incrementando su valor en uno y en la posición correspondiente a cima del array insertará el dato 20.
pila.extraerPila()                  El mensaje solicita al objeto pila, la operación extraerPila(); en respuesta al mensaje, se puede obtener el dato situado en la cima y luego se decrementa el  atributo cima.
pila.pilaLlena ()                    El mensaje solicita al objeto pila , la operación pilaLlena(); como respuesta al mensaje pila mira el valor del atributo cima y devuelve al exterior true o false, dependiendo de si cima coincide con el máximo índice en el array o no.
pila.pilaVacia ()                   El mensaje solicita al objeto pila , la operación pilaVacia (); como respuesta al mensaje pila mira el valor del atributo cima y devuelve al exterior true o false, dependiendo de si cima coincide con el valor –1 o   no.