Archivo

Posts Tagged ‘Paquetes’

Fundamentos de Programación Orientada a Objetos

Fundamentos de Programación Orientada a Objetos

Cómo dice Laura Leemay en su libro «Aprendiendo Java en 21 días» la POO se parece mucho a la cerveza: la primera vez que la pruebas no te gusta pero si continúas bebiéndola llegas a tomarle cariño.   La POO es una de la ideas de programación más extraordinaria de los últimos años y es una materia que puede ser estudiada y practicada por muchos años, sin embargo, la idea central es simple: organizar los programas de modo que reflejen la forma de organización de los objetos en el mundo real.

Pensando en Objetos

La programación orientada a objetos, es, desde su raíz, una forma de concebir un programa de computadora. Un programa es una serie de instrucciones que le indican a la computadora que hacer. La manera en que la POO ve a un programa es como un conjunto de objetos que operan juntos en formas predefinidas para realizar tareas.

Laura Leemay hace la siguiente analogía entre la POO y el juego de bloques de construcción LEGO. «Para quienes no conocen los bloques LEGO son pequeñas piezas de plástico en varios colores y tamaños.  Estos bloques pequeñas protuberancias redondas en un lado las cuales se ajustan en los huecos de los otros bloques.  La combinación de piezas crea formas más grandes y se pueden usar muchas otras piezas LEGO como llantas, motores, bisagras y poleas.

Con los bloques LEGO se pueden hacer todo tipo de cosas: castillos, automóviles, trailers, etc., casi cualquier cosa que se pueda imaginar. Cada pieza de LEGO es un objeto que se une con otros objetosen forma específica para crear un objeto más grande.

La POO es muy parecida es muy similar a construir estructuras a partir de bloques LEGO. Mediante la POO, todo su programa está formado por objetos diferentes llamados objetos.

Objetos y Clases

Un objeto es un elemento independiente de un programa de computadora, que representa a un grupo asociado de características y esta diseñado para realizar tareas específicas.  A los objetos también se les conoce como instancias.

La programación orientada a objetos se basa en la observación de, en el mundo real, los objetos se construyen a partir de objetos más pequeños. Sin embargo, la capacidad de combinar objetos es sólo un aspecto general de dicha programación. También incluye conceptos y características que hacen que la creación y el uso de objetos sea más sencilla y flexible. La clase es la más importante.

Una clase es una plantilla que se utiliza para crear múltiples objetos con características similares.

Las clases engloban  todas las características de un conjunto particular de objetos.  Cuando escribe un programa en un lenguaje orientado a objetos, usted no define objetos individuales, sino que define clases de objetos.

Por fortuna, no hay que empezar desde cero. La mayoría de los lenguajes orientados a objetos incluyen un grupo de clases que implementan la mayoría de la funcionalidad básica que necesitará.  A estas agrupaciones se les denomina bibliotecas.

Una biblioteca de clases es un grupo de clases diseñadas para su uso con otros programas.

La reutilización es uno de los  beneficios de mayor importancia en la programación orientada a objetos.

Comportamiento y Atributos

En general,  cada clase que escribas esta compuesta de dos componentes:

  1. Atributos
  2. Comportamiento

Atributos

Los atributos son las cosas individuales que diferencían una clase de objetos de otros y determinan la apariencia, estado y otras cualidades de la clase.

También pueden incluir información acerca del estado de un objeto. En una clase, los atributos estan definidos por variables.  Cada objeto puede tener valores distintos para sus variables y a éstas se les denomima variables de instancia.

Una variable de instancia es un elemento de información que define un atributo de un objeto en particular.

La clase del objeto define que tipo de atributo es y cada instancia almacena su propio valor para ese atributo.  A las variables de instancia también se les denomina variables de objeto.

Cada atributo de clase tien una variable correspondiente sencill; al cambiar de valor de la variable puede cambiar ese atributo en un objeto.

Las variables de instancia pueden tomar un valor cuando se crea un objeto y permanece constante a traves de la vida del objeto o bien pueden tomar valores diferentes mientras el objeto se usa en un programa en ejecución.

Para describir toda una clase de objetos se usa otro tipo de atributo en vez de objetos especificos desde la clase. A éstas se les denomina variables de clase.

Una variable de clase es un elemento de información que define un atributo de toda una clase.  La variable aplica para la clase por sí misma y para todas sus instancias, de modo que solo se almacena un valor, no importa cuántos objetos de clase hayan sido creados.

Comportamiento

El comportamiento, es la manera en que una clase de objetos puede hacer cualquier cosa para sí o para otros objetos.

El compartamiento de una clase determina qué objetos de esa clase hacen cambiar sus atributos y tambén qué hacen cuando otros objetos les piden hacer algo.  El comportamiento para una clase de objetos se implementa a través de métodos.

Los métodos son grupo de instrucciones asociadas en una clase de objetos que actúan en si mismos y en otras clases y objetos.  Se usan para realizar tareas específicas, del mismo modo que las funciones se usan en otros lenguajes de programación.

Los objetos se comunican entre sí utilizando métodos.  Una clase o un objeto pueden llamar métodos en otra clase u objeto para muchas razones, incluyendo las siguientes:

  • Para informar un cambio a otro objeto.
  • Para indicar al otro objeto que cambie algo acerca de sí mismo.
  • Para pedir a otro objeto que haga algo.

Así como hay variables de instancia y de clase, también hay métodos de instancia y de clase. Los métodos de instancia, que son tan comunes que sólo se llaman métodos, se aplican a un objeto de la clase. Si el método hace un cambio para un objeto individual, debe de ser un método de instancia. Los métodos de clase aplican pra una clase en sí misma.

Herencia, Interfaces y Paquetes

Herencia

La herencia es uno de los conceptos de mayor importancia en la programación orientada a objetos y tiene un efecto directo en la manera en que diseñas y escribas tus programas.

La herencia es un mecanismo que hace posible que una clase herede todo el comportamiento y los atributos de otra clase.

A través de la herencia, una clase tiene inmediatamente toda la funcionalidad de una clase existente.  Debido a esto, las nuevas clases se pueden crear indicando únicamente en que se diferencian de la clase existente.

A una clase que hereda de otra clase se le denomina subclase y a la clase que proporciona la herencia se le llama superclase.

Una clase puede tener únicamente una superclase, pero cada clase tiene una cantidad ilimitada de subclases. Las subclases reciben por herencia todos los atributos y comportamiento de sus superclases.

En términos prácticos, esto significa que se la superclase tiene comportamiento y atributos que la clase que estas creando necesita, no tendra que redefinirlos o copiar el código para tener el mismo comportamiento y atributos.  Su clase recibe automáticamente todo esto de su superclase, la cual a su vez las obtiene de su superclase y así sucesivamente por toda la jerarquía de clases.  La clase que usted esté creando se convierte en una combinación de todas las características de las clases superiores en la jerarquía, así como de las propias.

Generalmente, en todos los lenguajes que soportan la POO el objeto base de todas las calses es Object. Object es la clase más general de la jerarquía y define el comportamiento y atributos heredados por todas las clases de la biblioteca de clases del lenguaje. Conforme desciende la jerarquía, las clases se construyen para un propósito específico. Una jerarquía de clases define conceptos abstractos en la parte superior de la jerarquía. Estos conceptos se vuelven más concretos conforme desciende la línea de subclases.

La generación de subclases es la creación de una nueva clase que hereda de una clase existente.  La única tarea de la subclase es indicar las diferencias de comportamiento y atributos entre ella y la superclase.

Si tu clase define totalmente un nuevo comportamiento y noes una subclase de otra clase, puede heredar directamente de la clase Object.  De hecho, si crea una definición de clase que no indique una superclase, el lenguaje (ya sea Java, C++, C#, etc)  asume que la clase nueva es herencia directa de Object.

Jerarquía de Clases

Si estás creando un gran conjunto de clases, tendrá sentido que éstas hereen de la jerarquía de clases y conformen una jerarquía por sí mismas.  Organizar clases de esta manera implica invertir un tiempo considerable de planeación, pero las ventajas son las siguientes:

  • La funcionalidad que es común a múltiples clases se puede colocar en superclases, lo que le permite ser utilizada repetidamente en todas las clases inferiores de la jerarquía.
  • Los cambios en la superclase se reflejan automáticamente en todas sus subclases, las subclases de éstas y así sucesivamente. No hay necesidad de cambiar o recompilar cualquiera de las clases inferiores; reciben toda la información a través de la herencia.

¿Cómo funciona la Herencia?

Cuando se crea un objeto nuevo,  el lenguaje registra cada variable definida para el objeto y cada variable definida para cada superclase del objeto. De este modo, todo lo que contienen en las clases se comibina para formar una estructura descriptiva del objeto en uso y cada objeto aporta la información apropiada para su situación.

Los métodos trabajan de manera parecida: los objetos nuevos tienen acceso a todos los nombres de los métodos de su clase y superclase. Esto determina de manera dinámica cuando se usa un método en un programa en ejecución. Si se hace un llamado a un método en un objeto en partitcular,  el interprete del lenguaje primero revisará la clase del objeto para este método. Si no lo encuentra,  lo busca en la superclase y así sucesivamente hasta encontrar la definición del método.

Las cosas se complican cuando una sublase define un método que tiene el mismo nombre, tipo de de valor de retorno y argumentos que otro método definido en una superclase.  En este caso, la definición del método que se localiza primero (comenzando por el fondo de la jerarquía y desplazandose hacia arriba) es la que se ha empleado. En consecuencia, puede crear un método en una clase que evite que se use un método de una superclase.  Para hacerlo, cre un método con el mismo nombre, tipo de valor de retorno y argumentos como el método de la superclase. A este proceso se le denomina sobreposición.

Herencia Sencilla y Múltiple

La Herencia Sencilla es aquella en la que cada clase solo puede tener una superclase (aunque cualquier superclase dada puedar tener múltiples subclases).

La Herencia Múltiple es aquella en la que una clase puede tener mas de una superclase y heredar variables y métodos de forma combinada de todas aquellas superclases.

La herencia múltiple proporciona la estructura para crear clases con casi cual comportamiento imaginable.  En consecuencia, esto complica significativamente las defeniciones de clase y el código necesario para producirlas.  C++ es uno de los lenguajes que soporta este tipo de herencia.  En cambio, Java solo da soporte a la herencia sencilla.

Interfaces

La herencia sencilla hace que la relacion entre clases y su funcionalidad que estas clases implementan sea más fácil de comprender y diseñar.  Sin embargo, también podría ser restrictiva (sobre todo cuando se cuenta con comportamientos similares que necesitan ser duplicados a lo largo de brazos distintos de la jerarquía de clases).  Con el uso de Interfaces, los lenguajes que soportan POO resuelven el problema de comportamiento compartido.

Una Interfaz es un conjunto de métodos que indican que una clase tiene un comportamiento particular además del que hereda de sus superclases.

Paquetes

Los paquetes son una forma de agrupar clases es interfaces asociadas.  Habilitan los grupos de clases para estar disponibles sólo si son necesarios y eliminan los conflictos potenciales entre los nombres de clases en grupos diferentes de clases.