La Programación Orientada a Objetos.
Como todos sabemos, los programas se componen de procedimientos y datos. Los procedimientos son los que se encargan de realizar tareas específicas, como calcular la suma de dos números, o mostrar un Frame en pantalla. Los argumentos (datos que se le pasan a los procedimientos), son generalmente estructuras globales o se pasan como parámetros.
Java, es un lenguaje de programación Orientado a Objetos…mmm… entonces, ¿qué es la programación orientada a objetos?... pues bien, es una técnica de programación, que usa los objetos como secuencia de construcción.
Y, ¿qué es un objeto?, Un Objeto es una colección de datos, junto con las funciones asociadas a esos datos y que operan sobre ellos.
Lo importante y fundamental de los objetos, son las propiedades de ellos, y estas son:
· Herencia
· Encapsulamiento o Encapsulación
· Polimorfismo.
La programación orientada a objetos es una “filosofía”, un modelo de programación, con su teoría y su metodología, que conviene conocer y estudiar antes de nada. Un lenguaje orientado a objetos es un lenguaje de programación que permite el diseño de aplicaciones orientadas a objetos. Dicho esto, lo normal es que toda persona que vaya a desarrollar aplicaciones orientadas a objetos aprenda primero la “filosofía” (o adquiera la forma de pensar) y después el lenguaje, porque “filosofía” sólo hay una y lenguajes muchos La programación orientada a objetos surge en la historia como un intento para dominar la complejidad que, de forma innata, posee el software. Tradicionalmente, la forma de enfrentarse a esta complejidad ha sido empleando lo que llamamos programación estructurada, que consiste en descomponer el problema objeto de resolución en subproblemas y más subproblemas hasta llegar a acciones muy simples y fáciles de codificar. Se trata de descomponer el problema en acciones, en verbos.
La programación orientada a objetos es otra forma de descomponer problemas. Este nuevo método de descomposición es la descomposición en objetos; vamos a fijarnos no en lo que hay que hacer en el problema, sino en cuál es el escenario real del mismo, y vamos a intentar simular ese escenario en nuestro programa.
La programación orientada a objetos es una nueva forma de programar sistemas de la vida real. Es una colección de objetos que interactúan entre si por medio del pase de mensajes. Puede ser descrita como la disciplina de modelaje y desarrollo de software que hace fácil la construcción de sistemas complejos por medio de componentes individuales llamados clases de objetos. El término P.O.O. significa que se organizará al software con una colección de objetos discretos que incorporan tanto una estructura de datos como un conjunto de procedimientos que son los únicos capaces de alterar la estructura de dato del objeto.
La programación orientada a objetos permite:
1. Modelaje de problemas del mundo real de una manera más sencilla por parte del usuario.
2. Facilidad de interrelación con otros ambientes computacionales.
3. Construcción de componentes de software que pueden ser reusables y que ofrecen la facilidad de ser extensibles (agregar más componentes).
4. Facilidad de modificación e implantación extensiva de los componentes del software sin tener que recodificar el sistema que emplee estos componentes.
Los lenguajes de programación tradicionales no orientados a objetos, como C, Pascal, BASIC, o Modula-2, basan su funcionamiento en el concepto de procedimiento o función. Una función es simplemente un conjunto de instrucciones que operan sobre unos argumentos y producen un resultado. De este modo, un programa no es más que una sucesión de llamadas a funciones, ya sean éstas del sistema operativo, proporcionadas por el propio lenguaje, o desarrolladas por el mismo usuario.
En el caso de los lenguajes orientados a objetos, como es el caso de C++ y Java, el elemento básico no es la función, sino un ente denominado precisamente objeto. Un objeto es la representación en un programa de un concepto, y contiene toda la información necesaria para abstraerlo: datos que describen sus atributos y operaciones que pueden realizarse sobre los mismos.
La programación orientada a objetos es una nueva forma de pensar, una manera distinta de enfocar los problemas. Ahí radica la dificultad de aprender un lenguaje totalmente orientado a objetos, como es Java, sin conocer previamente los pilares de la programación orientada a objetos. Hecha esta importante aclaración, conviene destacar que Java, más que un lenguaje orientado a objetos, es un lenguaje de objetos. Java incorpora el uso de la orientación a objetos como uno de los pilares básicos y fundamentales del lenguaje. Esto constituye una importante diferencia con respecto a C++. C++ está pensado para su utilización como lenguaje orientado a objetos, pero también es cierto que con C++ se puede escribir código sin haber oído nada de la programación orientada a objetos. Esta situación no se da en Java, dotado desde las primeras etapas de su diseño de esta filosofía, y donde no cabe obviar la orientación a objetos para el desarrollo de programas, por sencillos que éstos sean. Al contrario que en C++, en Java nada se puede hacer sin usar al menos un objeto.
Conceptos Asociados a la Programación Orientada a Objetos (POO)
Objetos.
Definición de Objeto:
Un objeto es cualquier cosa, real o abstracta, que posee atributos y un conjunto de operaciones que manipulan esos atributos; atributos y operaciones le dan al objeto un COMPORTAMIENTO particular. Por ejemplo, en una biblioteca podemos distinguir los objetos libros, revistas, fichas, etc. Al conjunto de atributos y procedimientos se les denomina “clase”.
Un objeto es cualquier entidad representable en un programa informático, bien sea real (ordenador) o bien sea un concepto (transferencia). Un objeto en un sistema posee: una identidad, un estado y un comportamiento.
El estado marca las condiciones de existencia del objeto dentro del programa. Lógicamente este estado puede cambiar. Un coche puede estar parado, en marcha, estropeado, funcionando, sin gasolina, etc.
El comportamiento determina como responde el objeto ante peticiones de otros objetos. Por ejemplo un objeto conductor puede lanzar el mensaje arrancar a un coche. El comportamiento determina qué es lo que hará el objeto. La identidad determina que cada objeto es único aunque tengan el mismo valor.
No existen dos objetos iguales. Lo que sí existe es dos referencias al mismo objeto. Los objetos se manejan por referencias, existirá una referencia a un objeto.
De modo que esa referencia permitirá cambiar los atributos del objeto. Incluso puede haber varias referencias al mismo objeto, de modo que si una referencia cambia el estado del objeto, el resto (lógicamente) mostrarán esos cambios.
Los objetos por valor son los que no usan referencias y usan copias de valores concretos. En Java estos objetos son los tipos simples: int, char, byte, short, long, float, double y boolean. El resto son todos objetos (incluidos los arrays y Strings).
Características de los Objetos
Los objetos como tales, presentan muchas cualidades diferentes, respecto a una variable simple. Entre ellas podemos mencionar las siguientes:
1. Los objetos se pueden agrupar en rubros (o tipos) denominados Clases
2. El estado de los objetos está determinado por los datos del mismo
3. Permite lo que se conoce como Ocultación de datos
4. Pueden heredar propiedades de otros objetos
5. Por medio de los Mensajes un objeto se puede comunicar con otro
6. Los métodos definen el comportamiento de los objetos
Un objeto se puede representar gráficamente de la siguiente manera:
En donde, Nombre, es identificar correspondiente a ese objeto: Por ejemplo Empleados(), Alumnos(), Datos(), etc, etc.
Los atributos, son los datos con los que operan los métodos (o Funciones) del objeto.
Y las Funciones o Métodos, son las que operan sobre esos datos.
Clases
Se puede decir, que son tipos definidos por el usuario, las cuales determinan la estructura de los datos y las funciones asociadas con esos tipos.
Las clases como plantillas (que el programador crea). La clase define las variables y los métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.
Primero deberemos crear una clase antes de poder crear objetos o instancias (ejemplares) de esa clase.
Atributo.
Definen las propiedades de un objeto de datos y toman una de las tres características diferentes:
1. Se usa para nombrar una ocurrencia del objeto de datos.
2. Describen la ocurrencia.
3. Hace referencia a otra ocurrencia en otra tabla.
Uno o varios atributos se definen como un identificador. Este atributo identificador supone una clave cuando queremos encontrar una instancia del objeto de dato. Para desarrollar un conjunto de atributos para un objeto, el analista puede estudiar de nuevo la narrativa de proceso para el problema seleccionar aquellos elementos que razonablemente pertenecen al objeto. Para cada objeto deben responderse la siguiente interrogante: ¿Qué elementos (compuestos o simples) definen completamente al objeto en el contexto del problema actual?
Para poder crear una aplicación se necesita más de un objeto, y estos objetos no pueden estar aislados unos de otros, para comunicarse esos objetos se envían mensajes.
Los mensajes son simples llamadas a las funciones o métodos del objeto con él se quiere comunicar para decirle que haga alguna cosa.
Herencia
La herencia es un mecanismo que permite crear una clase basándose en una clase existente, y ésta tendrá todas las variables y los métodos de su ‘superclase’, y además se le podrán añadir otras variables y métodos propios.
Se llama ‘Superclase’ a la clase de la que desciende una clase.
La herencia consiste en el compartir atributos y métodos entre clases basándose en una relación jerárquica. Una clase puede definirse ampliamente y redefinirse sucesivamente en subclases más refinadas. Cada subclase que se incorpora, hereda todas las propiedades de su superclase y adiciona sus propias y únicas propiedades. Las propiedades de la superclase no necesariamente deben de repetirse en cada subclase. La habilidad para sacar factor común de las propiedades de una clase dentro de una superclase común y la herencia de propiedades desde la superclase pueden ayudar enormemente en el diseño. Una clase implanta el tipo de objeto. Una subclase hereda propiedades de su clase padre; una sub-subclase hereda propiedades de las subclases; etc. La herencia de la estructura de datos permite la reutilización de la estructura. En la herencia múltiple, una clase puede heredar estructuras de datos y operaciones de más de una superclase.
La herencia interactúa en combinación con el encapsulado. Si una clase dada encapsula algunos atributos, entonces cualquier subclase tendrá los mismos atributos más cualquiera que actúe como parte de su especialización.
Polimorfismo
(Poli=muchos; morfo=Formas), Polimorfismo, es la cualidad de tener más de una forma. Java, permite que el código de sus programas tenga la posibilidad de ser usados con diferentes tipos de datos u objetos.
Una de las características fundamentales de la P.O.O. es el polimorfismo, que no es otra cosa que la posibilidad de construir varios métodos con el mismo nombre, pero con relación a la clase a la que pertenece cada uno, con comportamientos diferentes. Esto soporta la habilidad de enviar un mismo mensaje a objetos de clases diferentes. Estos objetos recibirán el mismo mensaje global pero responderán de formas diferentes; por ejemplo, un mensaje "+" a un objeto ENTERO significa suma, mientras que para un objeto STRING significa concatenación "pegar" strings uno seguido al otro.
Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una operación sin conocer el método que debe ser llamado. Estos detalles de la implantación quedan ocultos para el usuario; la responsabilidad descansa en el mecanismo de selección de la implantación.
Polimorfismo significa que la misma operación puede comportarse diferentemente sobre distintas clases. Por ejemplo, la operación "mover" ejemplo puede comportarse diferentemente sobre una clase llamada Ventana y una clase llamada Piezas_ajedrez. Una operación es una acción o transformación que un sujeto ejecuta sobre un objeto, por ejemplo, justifica a la derecha, desplegar, mover. Una implantación específica de un operación para una cierta clase es llamada método. Un operador orientado por objeto o polimórfico puede tener más de un método implantado.
Clasificación de Polimorfismo.
1. Polimorfismo Paramétrico: Se obtiene cuando una función trabaja uniformemente sobre un rango de tipos; esos tipos normalmente exhiben una estructura común y puede comportarse de manera distinta para cada tipo.
2. Polimorfismo de Inclusión: Es un polimorfismo utilizado por modelos de subtipos y herencia. En este tipo de polimorfismo un objeto puede pertenecer a clases diferentes que no necesariamente son disjuntas.
El polimorfismo paramétrico y de inclusión están clasificados en una categoría mayor llamada polimorfismo universal, el cual contrasta con el polimorfismo no universal o el polimorfismo ad hoc.
3. Polimorfismo por Overloading: En este caso el mismo nombre de la variable se utiliza para denotar diferentes funciones, y el contexto se utiliza para decidir cuál función se debería ejecutar para una invocación particular del nombre. Puede imaginarse que para el procesamiento de un programa eliminemos el overloading por asignación de nombres distintos a las funciones diferentes, en este caso tendríamos programas con muchos nombres de funciones. El overloading es justamente una abreviación sintáctica conveniente, que permite poseer diferentes funciones con un mismo nombre.
4. Polimorfismo por Coerción: Es una operación semántica que convierte argumentos a los tipos esperados por una función, en una situación que de otra forma resultaría en un tipo de error. La coerción puede estar dada estáticamente, insertándose automáticamente entre argumentos y funciones a tiempo de compilación o pueden tener que determinarse dinámicamente, con pruebas a tiempos de ejecución sobre los argumentos.
Abstracción
En el sentido más general, una abstracción es una representación concisa de una idea o de un objeto complicado. En un sentido más específico, la abstracción localiza y oculta los detalles de un modelo o diseño para generar y manipular objetos.
Una abstracción tiene un significado más general que la encapsulación, pudiendo hablar de abstracción de datos en lugar de encapsulación de datos.
Encapsulación.
Es una técnica que permite localizar y ocultar los detalles de un objeto. La encapsulación previene que un objeto sea manipulado por operaciones distintas de las definidas. La encapsulación es como una caja negra que esconde los datos y solamente permite acceder a ellos de forma controlada.
Las principales razones técnicas para la utilización de la encapsulación son:
1) Mantener a salvo los detalles de representación, si solamente nos interesa el Comportamiento del objeto.
2) Modificar y ajustar la representación a mejores soluciones algorítmicas o a nuevas tecnologías de software.