PROGRAMACION ORIENTADA A OBJETOS


Los lenguajes de programación orientada a objetos existen desde los años 60 durante la pasada década se dio un crecimiento sin  paralelo en el uso y la aceptación de las tecnologías de objetos en toda la industria del software.

Éxitos recientes como los de Java, CORBA y C++ han impulsado a las tecnologías orientadas a objetos a nuevos niveles de aceptación. Después de mucho tiempo permaneces limitada a ambientes académicos.

En pocas palabras las computadoras en la actualidad reciben el perfeccionamiento de más de 50 años del perfeccionamiento de la programación orientada a objetos.

Había una dificultad y es que esta programación está muy susceptible a errores, y la falta de estructura consistente hacia prácticamente imposible el mantenimiento del código.

Después de la fama y popularidad de las computadoras, empezaron a aparecer lenguajes procedurales también conocidos como lenguajes de procedimientos, Este paradigma introdujo una gran cantidad de mejoras en cuanto al lenguaje de la maquina como la estructura consistentes con ello la facilidad de depurarlas más fácilmente y entenderlas más brevemente.

Ahora hablemos de la programación modular o por módulos. Con un lenguaje como Modula2, intenta superar algunas definiciones de la programación procedural. La programación modular divide un programa en una gran cantidad de componente o módulos, a diferencia de la programación procedural que separa datos y procedimientos, los módulos combinan ambos elementos.

Pero la programación modular tiene algunos inconvenientes importantes, los módulos no son extensibles, lo que significa que no es posible realizar cambios incrementales  a un módulo sin abrir el código y realizar cambios directamente. Tampoco es posible basar un módulo en otro más que a través de la delegación  y a pesar que un módulo podría definir un tipo de dato, no puede compartir el tipo de otro modulo.

S lenguajes modulares y procedurales, los datos estructurados y sin estructura tienen un “tipo”. El concepto tipo se puede entender con mayor facilidad si piensa que es el formato que tienen los datos en memoria. Los lenguajes de tipos estrictos o llamados fuertes requieren que cada objeto tenga un tipo específico  definido. Sin embargo, los tipos no se pueden extender para crear otro tipo, excepto mediante una técnica llamada “agregación”, Por ejemplo, en C, podemos tener dos tipos de datos relacionados:



typedef struct
{
int a;
int b;
} unTipoBase;
typedef struct
{
     unTipoBase   Base;
     int c;
}    unTipoDerivado;

En este ejemplo, unTipoDerivado se basa en unTipoBase, pero una estructura de unTipoDerivado no se puede manejar directamente como una estructura de unTipoBase. Solo es posible hacer referencia al miembro Base de una estructura de unTipoDerivado.

Por último la programación modular es también un hibrido de programación procedural que divide un programa en una gran cantidad procedimientos. La diferencia es que en lugar de actuar sobre datos puros. Estos procedimientos manejan módulos.

La Programación orientada a objetos da el siguiente paso lógico a la programación modular a través de la adición  de herencia y polimorfismo al módulo. La POO estructura un programa dividiéndolo en una cantidad determinada de objetos de alto nivel. Ada objeto le da forma a algún aspecto del problema que se intenta resolver. Una secuencia de llamadas a procedimientos para controlar el flujo dl programa ya no es el enfoque principal de la programación orientada a objetos, Tan solo los objetos interactúan y juegan entre ellos para dar así toda la fluidez  al programa.


Enfoque De La Programación Orientada a Objetos paras crear software mediante objetos.
Supongamos que desarrollaremos un programa o aplicación con programación orientada a objetos que implementara un carrito de compras en línea o una terminal de punto de venta. Un programa OO contendrá objetos artículo, carrito de compras, cupones y cajero. Cada uno de estos  interactuara con los demás para conformar el programa Por ejemplo: cuando el cajero procese un pedido. Tendrá que revisar el precio de cada artículo.
La definición de un programa en términos de objetos es una manera muy profunda de visualizar al software.
Los objetos deber ser conceptualizados en cuanto a su comportamiento, se debe mirar el objeto en cuanto a su implementación, esta forma de pensar obliga a plantear los términos naturales y reales. Los objetos permiten darle forma a un programa en términos de sustantivos verbos y adjetivos del dominio del problema.
El dominio es el espacio donde se desarrolla un problema. El dominio es el conjunto de conceptos que representan los aspectos importantes del problema que intenta resolver.
Objeto un objeto es un componente de software que encapsula un estado y un comportamiento. Los objetos permiten dar forma al software en términos y abstracciones reales.
Una comparación muy precisa del software orientado a objetos, de la misma forma que la vida real está conformada por objetos.

¿Qué es una clase?
Al igual que en la vida real, en el mundo de la programación orientada a objetos esta agrupa los objetos de acuerdo con sus atributos, características, comportamientos y cualidades comunes.
Una clase define todas las características comunes a un tipo de objeto. Específicamente, la clase define todos los aquellos atributos y comportamientos exhibidos por el objeto. La clase define de manera específica a cuales mensajes respondes sus objetos, Cuando un objeto desea poner en práctica el comportamiento de otro objeto, no lo hace directamente, si no que pide al otro objeto que se modifique así mismo.
En resumen  una clase define los atributos y comportamientos comunes que comparte un tipo de objeto.
Los atributos son las características externas y visibles de una clase, ejemplo el color de los ojos y del pelo son ejemplos de atributos.
Los lenguajes como C++ y Java tienen antecedentes del enfoque basado en procedimientos, donde las llamadas a funciones son estáticas.

Reunión de todos los elementos: Clases y Objetos
Tomemos por ejemplo un objeto artículo. Un artículo posee una descripción. Un identificador, un precio, una cantidad y un descuento opcional. Un artículo sabe cómo calcular su precio con descuento.


Método Constructor: Los constructores son métodos que se utilizan para inicializar objetos en la etapa de instanciación. La creación de objetos se denomina instalación porque durante esta se genera una instancia de un objeto de la clase.

Los accesores le dan acceso a los datos internos de un objeto; sin embargo, no permiten saber si los datos están en una variable, una combinación de variables o si son calculados. Los accesores permiten modificar u obtener el valor y que se produzcan “efectos secundarios” en el estado interno.

Los moduladores permiten modificar el estado de interno de un objeto, Al ejecutarse, sus programas utilizan clases como Articulo Para crear o instanciar los objetos que conforman la aplicación. Por ejemplo, si usted crea 2 objetos artículo a partir de la misma clase Articulo, uno de los objetos podría tener un valor distinto al otro.

Relaciones de Objetos
La manera en que se relacionan los objetos es un componente muy importante de la POO. Los objetos se pueden relacionar en dos formas principales.
Primero, Los objetos pueden existir de manera independiente uno de otro. Dos objetos Artículo pueden aparecer al mismo tiempo en un proceso. Si llega el momento en que estos dos objetos independientes necesitan interactuar, podrán hacerlo intercambiando mensajes.
2 o más objetos se comunican entre sí por mensajes, los mensajes dan como resultados que un objetó realice algo.
También tenemos que recordar y tener siempre en cuenta que en la POO que todo es un objeto y va orientado hacia ellos. La comunicación se da de la misma manera entre un objeto y los objetos que contiene.

Beneficios Y Metas De La Programación Orientada a Objetos
La programación orientada a objetos establece seis metas primordiales para el desarrollo de software. La POO se esfuerza para producir software que tenga las características siguientes:
Natural: La POO produce software natural. Los programas naturales son más comprensibles en lugar de programar en términos de arreglos o regiones de memoria, usted puede hacerlo utilizando la terminología de su problema específico.
Confiable: Si desea crear software útil, necesita que este sea igual de confiable que otros productos, como los refrigeradores y los televisores, produce un software bien diseñado cuidadosamente.
Reutilizable: Usted puede reutilizar fácilmente las clases orientadas a objetos bien diseñadas. Al igual que los módulos, puede reutilizar los objetos en diversos programas.
Mantenible: El ciclo de vida de un programa no termina cuando usted lo empaqueta y lo entrega. Por el contrario, debe darle mantenimiento al condigo. De hecho, entre 60 y 80 % del tiempo invertido en un programa se pasa en el mantenimiento, el desarrollo tan solo se constituye el 20 % de la ecuación.
Extensible: al igual qu8e usted debe darle mantenimiento a un programa, de la misma manera sus usuarios recurrirán a usted para que agregue funcionalidad a sus sistemas.
Oportuno: Con frecuencia, el ciclo de vida de un proyecto moderno de software se mide en semanas, La POO contribuye a lograr estos rápidos ciclos de desarrollo. La POO reduce los tiempos perdidos del ciclo de desarrollo proporcionando software confiable, reutilizable y fácilmente extensible.

Peligros más importantes
Al adelantarse por primera vez en POO, existen cuatro peligros que debes evitar:
Peligro 1: Pensar que la POO es tan sólo un lenguaje.
Con frecuencia, la gente equipara los lenguajes orientados a objetos con la POO. El error proviene de dar por sentado que se está programando con un estilo orientado a objetos tan sólo porque se está utilizando lenguaje orientado a objetos. Nada más alejado de la realidad.
Peligro 2: Miedo a la reutilización.
Debemos aprender a reutilizar el código. Aprender a reutilizar sin padecer un sentimiento de culpa es con frecuencia una de las lecciones más difíciles cuando se adentra por primera vez en la POO. Dos problemas originan esta dificultad, Primero que alos programadores les gusta ser creativos, Segundo, Muchos programadores padecen el sentimiento de “no fue escrito aquí” lo cual no significa que no confían en el software que no escribieron ellos mismos
¿Porque Java?
Hay dos razones para utilizar java como herramienta de enseñanza primero, Java lo aparta de los detalles relacionados con los sistemas operativos y la computadora en lugar de preocuparse acerca de la asignación y designación de memoria, simplemente se concentra en aprender los aspectos relacionados con los objetos.

Cuestionario
1 ¿Que es la programación procedural?
La programación procedural es aquella que se lleva a cabo por medio de diferentes procesos, o en pocas palabras es aquella que se lleva a cabo por medio de un paso a paso.
2. ¿Qué beneficios tiene la programación procedural  respecto de la programación que carece de estructura?
Que los programas y procesos son más fáciles de entender , además de que estos programas pueden ser leídos en un tipo de secuencia , por lo cual nos permite llevar un tipo de orden , sin estar salteándonos de un lado a otro además lleva algún tipo de orden, el cual nos permite entender que proceso conduce al otro.
3. ¿Qué es la programación modular?
La programación modular o por módulos. Con un lenguaje como Modula2, intenta superar algunas definiciones de la programación procedural. La programación modular divide un programa en una gran cantidad de componente o módulos, a diferencia de la programación procedural que separa datos y procedimientos, los módulos combinan ambos elementos.
4. ¿Qué beneficios tiene la programación modular sobre la programación procedural?
Los beneficios de la programación modular son que al dividir los programas en módulos o subprocesos se hace más tangible y  manejable en cambio la programación estructurada tiene procesos ya establecidos lo cual hace más complejo el proceso del programa.
5. Mencione una desventaja de la programación procedural y de la modular
 La programación modular tiene algunos inconvenientes importantes, los módulos no son   extensibles, lo que significa que no es posible realizar cambios incrementales  a un módulo sin abrir el código y realizar cambios directamente.
Limitaciones del programador: Es posible el programador desconozca algunas características del paradigma y de hecho siga utilizando el paradigma estructurado.
6. Que es la programación orientada a objetos?
Programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que viene a innovar la forma de obtener resultados. Los objetos manipulan los datos de entrada para la obtención de datos de salida específicos, donde cada objeto ofrece una funcionalidad especial.
7. Cuáles son los 6 beneficios y metas de la programación orientada a objetos?
Natural
Confiable
Reutilizable
Mantenible
Extensible
Oportuno
8. Explique las metas de la programación orientada a objetos?
Natural: La POO produce software natural. Los programas naturales son más comprensibles en lugar de programar en términos de arreglos o regiones de memoria, usted puede hacerlo utilizando la terminología de su problema específico.
Confiable: Si desea crear software útil, necesita que este sea igual de confiable que otros productos, como los refrigeradores y los televisores, produce un software bien diseñado cuidadosamente.
Reutilizable: Usted puede reutilizar fácilmente las clases orientadas a objetos bien diseñadas. Al igual que los módulos, puede reutilizar los objetos en diversos programas.
Mantenible: El ciclo de vida de un programa no termina cuando usted lo empaqueta y lo entrega. Por el contrario, debe darle mantenimiento al condigo. De hecho, entre 60 y 80 % del tiempo invertido en un programa se pasa en el mantenimiento, el desarrollo tan solo se constituye el 20 % de la ecuación.
Extensible: al igual qu8e usted debe darle mantenimiento a un programa, de la misma manera sus usuarios recurrirán a usted para que agregue funcionalidad a sus sistemas.
Oportuno: Con frecuencia, el ciclo de vida de un proyecto moderno de software se mide en semanas, La POO contribuye a lograr estos rápidos ciclos de desarrollo. La POO reduce los tiempos perdidos del ciclo de desarrollo proporcionando software confiable, reutilizable y fácilmente extensible.
9. Defina los siguientes términos:
Clase: Es una Plantilla de  objetos esta agrupa los objetos de acuerdo con sus atributos, características, comportamientos y cualidades comunes.
Objeto: Representación De las cosas


10. Como se comunican los objetos entre si?
Por medio de mensajes
11. Que es un constructor?
Los constructores son métodos que se utilizan para inicializar objetos en la etapa de instanciación. La creación de objetos se denomina instalación porque durante esta se genera una instancia de un objeto de la clase.
12. Que es un accesor?
Le dan acceso a los datos internos de un objeto; sin embargo, no permiten saber si los datos están en una variable, una combinación de variables o si son calculados.
13. Que es mutador?
Son los famosos métodos get y set
14 ¿Que es this?
Contenido null por defecto de un objeto

Pilares de la programación orientada a objetos
Los tres pilares del desarrollo orientado a objetos son la encapsulación, la herencia y el polimorfismo.


La encapsulación: 

La encapsulación es la capacidad de ocultar los datos abstraídos,  aislarlos o protegerlos de quién no desees que tenga acceso a ellos; otro objeto o función por ejemplo. 
Cada objeto puede tener muchas cosas encapsuladas en su interior, propiedades, funciones o incluso otros objetos. 

Herencia:

La Herencia lo que nos dice es que puede crearse un objeto a partir de otro objeto ya existente. El nuevo objeto hereda todas las cualidades del objeto del que deriva y además puede añadir nuevas funcionalidades o modificar las ya existentes.



Polimorfismo:


 El polimorfismo es la capacidad para que varias clases u objetos derivados de otros, reaccionen de manera diferente ante los mismos métodos. El polimorfismo se puede aplicar tanto a objetos como a funciones, por lo que podemos hablar de objetos polimórficos y de funciones polimórficas.
Por ejemplo, cuando apretamos el acelerador de un coche no va a responder igual el que posee un motor diésel que el que tiene un motor de gasolina.



Comentarios