jueves, 9 de octubre de 2014

PROGRAMACIÓN ORIENTADA A OBJETOS

La programación Orientada a Objetos es una metodología que basa la estructura de los programas en torno a los objetos. 
Los lenguajes de POO ofrecen medios y herramientas para describir los objetos manipulados por un programa. Más que describir cada objeto individualmente, estos lenguajes proveen una construcción que describe a un conjunto de objetos que poseen las mismas propiedades. 

Para comprender que es la programación orientada a objetos, es necesario tener conocimiento de: 

Objeto: 
Es una entidad (tangible o intangible) que posee características y acciones que realiza por sí solo o interactuando con otros  objetos. 
Un objeto es una entidad caracterizada por sus atributos propios y cuyo comportamiento está determinado por las acciones o funciones que pueden modificarlo, así como también las acciones que requiere de otros objetos. Un objeto tiene identidad e inteligencia y constituye una unidad que oculta tanto datos como la descripción de su manipulación. Puede ser definido como  una encapsulación y una abstracción: una encapsulación de atributos y servicios, y una abstracción del mundo real. 
Para el contexto del Enfoque Orientado a Objetos (EOO) un objeto es una entidad que encapsula datos (atributos) y acciones o  funciones que los manejan (métodos). También para el EOO un objeto se define como una instancia o particularización de una  clase. 
Los objetos de interés durante el desarrollo de software no sólo son tomados de la vida real (objetos visibles o tangibles),  también pueden ser abstractos. En general son entidades que juegan un rol bien definido en el dominio del problema. Un libro, una persona, un carro, un polígono, son apenas algunos ejemplos de objeto. 
Cada objeto puede ser considerado como un proveedor de servicios utilizados por otros objetos que son sus clientes. Cada objeto puede ser a al vez proveedor y cliente. De allí que un programa pueda ser visto como un conjunto de relaciones entre proveedores clientes. Los servicios ofrecidos por los objetos son de dos tipos: 
1.- Los datos, que llamamos atributos. 

2.- Las acciones o funciones, que llamamos métodos. 

Características Generales:
ƒ Un objeto se identifica por un nombre o un identificador único que lo diferencia de los demás.
Ejemplo: el objeto Cuenta de Ahorros número 12345 es diferente al objeto Cuenta de Ahorros número 25789. En este caso el identificador que los hace únicos es el número de la cuenta.  
Un objeto posee estados. El estado de un objeto está determinado por los valores que poseen sus atributos en un momento dado.  
Un objeto tiene un conjunto de métodos. El comportamiento general de los objetos dentro de un sistema se describe o representa mediante sus operaciones o métodos. Los métodos se utilizarán para obtener o cambiar el estado de los objetos, así como para proporcionar un medio de comunicación entre objetos.  
Un objeto tiene un conjunto de atributos. Los atributos de un objeto contienen valores que determinan el estado del objeto durante su tiempo de vida. Se implementan con variables, constantes y estructuras de datos (similares a los campos de un registro).  
Los objetos soportan encapsulamiento. La estructura interna de un objeto normalmente está oculta a los usuarios del mismo. Los datos del objeto están disponibles solo para ser manipulados por los propios métodos del objeto. El único mecanismo que lo conecta con el mundo exterior es el paso de mensajes.  

Clase:
La clase es la unidad de modularidad en el EOO. La tendencia natural del individuo es la de clasificar los objetos según sus características comunes (clase). Por ejemplo, las personas que asisten a la universidad se pueden clasificar (haciendo abstracción) en estudiante, docente, empleado e investigador.
La clase puede definirse como la agrupación o colección de objetos que comparten una estructura común y un comportamiento común.
Es una plantilla que contiene la descripción general de una colección de objetos. Consta de atributos y métodos que resumen las características y el comportamiento comunes de un conjunto de objetos.
Todo objeto (también llamado instancia de una clase), pertenece a alguna clase. Mientras un objeto es una entidad concreta que existe en el tiempo y en el espacio, una clase representa solo una abstracción.
Todos aquellos objetos que pertenecen a la misma clase son descritos o comparten el mismo conjunto de atributos y métodos.
Todos los objetos de una clase tienen el mismo formato y comportamiento, son diferentes únicamente en los valores que contienen sus atributos. Todos ellos responden a los mismos mensajes.
Su sintaxis algorítmica es:
Clase <Nombre de la Clase>
 …
FClase <Nombre de la Clase>;

Características Generales: 
Una clase es un nivel de abstracción alto. La clase permite describir un conjunto de características comunes para los objetos que representa. Ejemplo: La clase Avión se puede utilizar para definir los atributos (tipo de avión, distancia, altura, velocidad de crucero, capacidad, país de origen, etc.) y los métodos (calcular posición en el vuelo, calcular velocidad de vuelo, estimar tiempo de llegada, despegar, aterrizar, volar, etc.) de los objetos particulares Avión que representa. 
Un objeto es una instancia de una clase. Cada objeto concreto dentro de un sistema es miembro de una clase específica y tiene el conjunto de atributos y métodos especificados en la misma 
Las clases se relacionan entre sí mediante una jerarquía. Entre las clases se establecen diferentes tipos de relaciones de herencia, en las cuales la clase hija (subclase) hereda los atributos y métodos de la clase padre (superclase), además de incorporar sus propios atributos y métodos.
Ejemplos, Superclase: Clase Avión  Subclases de Avión: Clase Avión Comercial, Avión de Combate, Avión de Transporte

 Relación entre Clase y Objeto:
Algorítmicamente, las clases son descripciones netamente estáticas o plantillas que describen objetos. Su rol es definir nuevos tipos conformados por atributos y operaciones.
Por el contrario, los objetos son instancias particulares de una clase. Las clases son una especie de molde de fábrica, en base al cual son construidos los objetos. Durante la ejecución de un programa sólo existen los objetos, no las clases.
La declaración de una variable de una clase NO crea el objeto.
La asociación siguiente: <Nombre_Clase> <Nombre_Variable>; (por ejemplo, Rectángulo R), no genera o no crea automáticamente un objeto Rectángulo. Sólo indica que R será una referencia o una variable de objeto de la clase Rectángulo.

Atributo:
Son aquellos datos o variables que caracterizan al objeto y cuyos valores en un momento dado indican su estado. Un atributo es una característica de un objeto. Mediante los atributos se define información oculta dentro de un objeto, la cual es manipulada solamente por los métodos definidos sobre dicho objeto. Un atributo consta de un nombre y un valor. Cada atributo está asociado a un tipo de dato, que puede ser simple (entero, real, lógico, carácter, string) o estructurado (arreglo, registro, archivo, lista, etc.)
Su sintaxis algorítmica es: <Modo de Acceso> <Tipo de dato> <Nombre del Atributo>;
Los modos de acceso son:
ƒ-Público: Atributos (o Métodos) que son accesibles fuera de la clase. Pueden ser llamados por cualquier clase, aun si no está relacionada con ella. Este modo de acceso también se puede representar con el símbolo +
-Privado: Atributos (o Métodos) que sólo son accesibles dentro de la implementación de la clase. También se puede representar con el símbolo –
ƒ Protegido: Atributos (o Métodos) que son accesibles para la propia clase y sus clases hijas (subclases). También se puede representar con el símbolo #

Método:
Son las operaciones (acciones o funciones) que se aplican sobre los objetos y que permiten crearlos, cambiar su estado o consultar el valor de sus atributos.
Los métodos constituyen la secuencia de acciones que implementan las operaciones sobre los objetos. La implementación de los métodos no es visible fuera de objeto.
La sintaxis algorítmica de los métodos expresados como funciones y acciones es:
 Para funciones se pueden usar cualquiera de estas dos sintaxis:
 <Modo de Acceso> Función <Nombre> [(Lista Parámetros)]: <Descripción del Tipo de datos>
Para acciones:
 <Modo de Acceso> Acción <Nombre> [(Lista Parámetros)] donde los parámetros son opcionales

Ejemplo: Un rectángulo es un objeto caracterizado por los atributos Largo y Ancho, y por varios métodos, entre otros Calcular su área y Calcular su perímetro.

Motivación:
Durante años, los programadores se han dedicado a construir aplicaciones muy parecidas que resolvían una y otra vez  los mismos problemas. Para conseguir que los esfuerzos de los programadores puedan ser utilizados por otras personas se creó la POO. Que es una serie de normas de realizar las cosas de manera que otras personas puedan utilizarlas y adelantar su trabajo, de manera que consigamos que el código se pueda reutilizar.
La POO no es difícil, pero es una manera especial de pensar, a veces subjetiva de quien la programa, de manera que la forma de hacer las cosas puede ser  diferente según el programador. Aunque podamos hacer los programas de formas distintas, no todas ellas son correctas, lo difícil no es programar orientado a objetos sino programar bien. Programar bien es importante porque así nos podemos aprovechar de todas las ventajas de la POO.

Cómo se piensa en objetos:
Pensar en términos de objetos es muy parecido a cómo lo haríamos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO. Diríamos que el coche es el elemento principal que tiene una serie de características, como podrían ser el color, el modelo o la marca. Además tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar.
Pues en un esquema POO el coche sería el objeto, las propiedades serían las características como el color o el modelo y los métodos serían las funcionalidades asociadas como ponerse en marcha o parar.
Por poner otro ejemplo vamos a ver cómo modelizaríamos en un esquema POO una fracción, es decir, esa estructura matemática que tiene un numerador y un denominador que divide al numerador, por ejemplo 3/2.
La fracción será el objeto y tendrá dos propiedades, el numerador y el denominador. Luego podría tener varios métodos como simplificarse, sumarse con otra fracción o número, restarse con otra fracción, entre otros.

EJEMPLOS

EJEMPLO 1:
(1,5 puntos) Declarad (sólo cabecera), para cada una de las siguientes sentencias A, B y C, qué haría falta añadir a una clase Matriz (implementada mediante undoble puntero a enteros) para que funcionasen correctamente.
int main(){
Matriz c;
/*A*/ c[3,5]; //devuelve el elto. En la pos. 3,5
/*B*/ c[3][5]; // idem
/*C*/ c(3,5); // idem
return (0);


};

EJEMPLO 2:
Vamos a realizar una consulta, todo dentro del mismo archivo index.php, bueno en esta oportunidad la  conexion la vamos a crearla en un archivo aparte de la siguiente manera: en la carpeta de proyectos creamos una carpeta que la vamos a llamar clases y dentro de clases guardamos el archivo de conexion llamado conectar.php  


Asi va a quedar la primera clase:
como podemos observar iniciamos con la palabra reservada class donde indicamos que es una clase y le colocamos un nombre, yo le coloque Conectar pero ustedes pueden llamarla como ustedes deseen.

luego creamos nuestro objeto de conexion. Los objetos en PHP se crean como funciones publicas para que puedan ser llamadas desde otros archivos.

si vemos en la linea public static function conexion() se encuentra la palabra reservada static es decir es una funcion estatica por que no vamos a tener necesidad de crear una instancia de ese objeto si no que la podremos llamar directamente desde cualquier pagina donde hallamos agregado nuestra clase, mas adelante les mostraré como hacerlo para que quede mucho mas claro.

el resto de la funcion lo habiamos visto en la entrada anterior, y por ultimo retornamos la variable $con, hasta aqui llega nuestra clase Conectar.

Ahora vamos a crear la segunda clase, creamos el archivo estudiantes.php y dentro de este vamos a colocar esto:



Aqui se van a  ver unas cosas interesantes.

Lo primero que se debe hacer  es agregar la clase conectar creada anteriormente por que necesitamos conectarnos a nuestra base de datos, utilizamos el require_once para agregarlo y dentro colocamos la ruta donde se encuentra ubicado.

Luego creamos la clase estudiantes, y dentro declaramos una variable $est de tipo privada, es decir, que solo se puede acceder  a ella desde nuestra clase estudiantes.

Luego creamos nuestro constructor que es donde vamos a declarar nuestra variable de tipo array para guardar en esta los resultados de nuestra consulta a la base de datos



Algo que es muy importante es el uso de la sintaxis ->, esto lo que quiere decir es que estamos accediendo a un objeto o atributo de nuestra clase y el $this es por que lo estamos accediendo desde ella misma, en este caso estamos accediendo a nuestra variable privada $est y a la cual la vamos a crear de tipo array()

y luego creamos nuestro objeto el cual nos traera todos los estudiantes que tenemos creado en nuestra tabla estudiantes y que llamaremos get_estudiantes

En una variable llamada $sql creamos nuestra consulta superdificilisima para traer todos los estudiantes creados, luego ejecutamos nuestra consulta

Se acuerdan que cuando creamos nuestra clase Conectar habiamos declarado al objeto conexion como estatico, bueno, como ya agregamos arriba la clase Conectar solamente colocamos el nombre de la clase seguido de :: y por ultimo el objeto conexion(), y no tuvimos necesidad de instanciar la clase. Interesante verdad.

Luego recorremos con un while todos los registros que nos trajo la consulta asi:


Usamos mysql_fetch_assoc por que vamos a guardar cada registro como un array, es decir, cada registro va a tener un indice y el nombre del campo de esta forma: nombre_var[indice]["nombre campo"] cuando vallamos a nuestro ultimo archivo lo vamos a tener mas claro.

Y por ultimo retornamos el resultado.

Nuestro ultimo archivo lo vamos a colocar fuera de la carpeta clases y lo llamamos index.php


Este archivo contiene HTML normal con sus etiquetas head, body. En la parte superior dentro de este codigo HTML agregamos un bloque PHP asi:

Agregamos nuestra clase estudiantes, y aqui vemos algo nuevo, como instanciar nuestras clases y hacer uso de sus objetos, para instanciar una clase utilizamos la palabra new seguida de la clase y se la asignamos a una variable.


Luego con esa variable que llamamos $est hacemos uso del objeto get_estudiantes por medio de -> y se la asignamos a otra variable.

$datos en estos momentos es un array que contiene todos los registros de nuestra consulta, asi que por ultimo lo que hacemos es recorrer ese array y lo hacemos de esta forma.

Aqui estamos integrando codigo html y php juntos, solo es abrir y cerrar los bloques php donde lo necesitemos. hemos agregado 3 input de tipo texto para la identificacion, nombre y telefono de nuestros estudiantes. como la variable $datos es un array y este tiene un indice vamos a recorrerlo mediante un for asi

 

lo iniciamos en $i=0 , luego lo recorremos hasta que sea menor a lo que contiene nuestro array y usamos la funcion sizeof y por ultmo incrementaremos nuestro indice de a uno.

luego en nuestros input en el atributo value vamos a abrir un bloque php para mostrar nuestros resultados dentro de este y o hacemos de esta forma

colocamos $datos mas el indice y el nombre que tiene nuestro campo en la tabla estudiantes.

y el resultado es el siguiente: