Mi granito de java: Programación orientada a objetos con Java

Google+ Badge

viernes, 17 de junio de 2011

Programación orientada a objetos con Java

La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos. - Wikkipedia.

¿Que es un objeto?


Un objeto es una representación detallada, concreta y particular de un "algo". Tal representación determina su identidad, su estado y su comportamiento particular en un momento dado.
Quizas decir que es una representación de un “algo” suene un tanto vaga, pero es exactamente eso: un objeto en el software puede representar a un objeto tangible como un “motor” o bien, puede representar a un objeto no tangible, como el objeto “estrategia”.
Un objeto es una pieza de software única que posee ciertas características (atributos) y un comportamiento previamente determinado (métodos que se definen en una clase).
A diferencia de otros lenguajes, un objeto siempre pertenece a una clase. No puede existir sintaxis “tirada” en cualquier lugar.

¿Que es una clase?

Un clase es una plantilla que se utiliza para definir las características y habilidades de los objetos, lo que significa, que una clase es la definición de un objeto. Es un modelo abstracto, sin “vida”, ya que son sus instancias (objetos) las que tendrán valores en el futuro.
Desde un punto de vista más técnico, es el lugar donde se define los métodos y atributos que tendrán los objetos. Una clase es un contenedor de uno o más datos (variables o propiedades miembro) junto a las operaciones de manipulación de dichos datos (funciones/métodos).
Para aquellos que vienen de la programación estructurada es un conjunto de datos definidos por el programador, parecidos a las “estructuras de datos” de la programación estructurada, pero con la importante novedad de incluir también las herramientas necesarias para su manipulación.

Cuando se crea una clase, por convención, suelen colocarse en la parte superior los atributos de la misma. Y en la parte inferior, sus métodos. Si esto no se cumple, funcionan igual, aunque esto podría afectar el entendimiento de la misma y, por ende, el mantenimiento del sistema.
Los nombres de las clases empiezan con mayúscula y si tuviesen palabras en el medio, también comenzarían con mayúscula: AutoDeCarrera.

Atributos

Los atributos son las características del objeto. Toman valores durante la vida del mismo. Estos valores determinan el estado del objeto.
Cuando definimos un atributo se establece su nombre y su tipo. Los atributos suelen ser sustantivos. Marcan las propiedades del objeto.
Una persona puede tener varios atributos. Además de las variables (y clases) definidas por Java, es posible agregar atributos propios, por ejemplo documento que hace referencia a la clase Documento.
Los atributos se escriben con minúscula y si tuviesen palabras en el medio, éstas van con mayúscula: colorDeOjos.

Métodos

Representan el comportamiento del objeto. Es decir, lo que el objeto puede hacer.
Los métodos se escriben con minúscula y si tuviesen palabras en el medio, éstas van con mayúscula: dameCantidad().

Deben especificar lo que devuelven….y en caso que no devuelvan nada se utiliza la palabra reservada “void”.


Creando objetos.
  • Un objeto es una instancia de una clase.
  • Es la implementación con valores del modelo abstracto (clase).
  • La sintaxis para crear un objeto es new Objeto(), donde la parte izquierda del igual representa la referencia del objeto.
Por ejemplo, para crear un objeto de la clase Persona habría que colocarla siguiente sintaxis:

Persona p = new Persona();

El paradigma de objetos posee tres características fundamentales:
  1. Encapsulamiento
  2. Herencia
  3. Polimorfismo

1) Encapsulamiento.

  • Consiste en ocultar los detalles de la implementación de un objeto, a la vez que se provee una interfaz pública por medio de sus métodos permitidos.
  • Es la propiedad de los objetos de permitir el acceso a sus estados. Esto se logra a través de su interfaz pública o a través de relaciones preestablecidas con otros objetos. Lo que importa es el comportamiento del objeto y no como esta implementado ese comportamiento.
  • Tiene una regla de oro: atributos en privado y métodos públicos.
El modificador “private” hace que un atributo (o método) pueda ser accedido sólo dentro de la propia clase.
El modificador “public” hace que un atributo (o método) pueda ser accedido desde todos lados.
Aquí vemos como todos los atributos son privatizados y todos tienen métodos Get que sirve para pedir el valor del atributo en cuestión y un método Set que sirve para asignarle un valor determinado. Se debe prestar especial atención a aquellos atributos que son objetos, ya que reciben un objeto instanciado.

Los errores de codificación se subrayan en rojo y son debido a que los atributos fueron privatizados, por ende, no pueden ser accedidos por fuera de la clase.
Esta sería la forma correcta.

Ventajas del encapsulamiento.:
  • La complejidad de la implementación queda escondida al resto de los objetos. Esto se ve reflejado en la vida real, yo quiero que mi auto funcione pero no quiero saber como esta hecho el motor.
  • La implementación de un objeto puede variar sin que ello afecte a los objetos que interactúan con él. Esto se debe a que los objetos llaman a un método y no saben como es la implementación. De esta manera, si la implementación (que es algo interno de la clase) varía, el resto de los objetos no se ven afectados.
  • Se protege al objeto de usos indebidos o inapropiados. Si los atributos son accedidos a través de métodos, es posible realizar ciertas validaciones, por ejemplo, el método setSueldo(-120) no debería asignar 120 al sueldo de la persona, ya que es un número negativo. El método setIVA(0.25) debería ser privado, asi ese atributo es de sólo lectura.
  • Se centraliza la manipulación del dato. Supongamos que el método getDNI() debe ser modificado para que, además del DNI, nos anteponga el número de sucursal donde trabaja la persona. Sin los Get y Set hubiera sido bastante engorroso y hubiesemos tenido que recorrer todo el programa. Con los Get y Set es tan simple como modificar 1 sólo método.

2) Herencia.

Es la capacidad de un objeto para utilizar las estructuras y métodos existentes en sus antepasados. Los “hijos” pueden compartir (y extender) su comportamiento sin tener que reimplementarlo. Si bien se heredan los métodos de los antepasados, es posible redefinirlos si fuera necesario.
La idea es no repetir comportamientos que otros ya lo tienen implementados. La idea es que en la clase padre exista un comportamiento estándar y la clase hija pueda especializarse en otros aspectos.

Hay dos tipos de herencia:
  1. Simple
  2. Múltiple ( es cuando una clase tiene más de 1 padre, lo cual no esta permitido en Java)

En Java, para heredar de una clase se utiliza la palabra clave “extends”. En nuestro ejemplo la definición de la clase Cliente es: public class Cliente extends Persona
 

Ventajas de la herencia.
  • Aumenta la reutilización del código. Tal como se pudo apreciar en la presentación anterior.
  • Favorece el Polimorfismo de los objetos. Esto se verá a continuación.
  • Las clases pueden ser organizadas jerárquicamente. Un “hijo” es un “tipo de…” de una clase padre.


3) Polimorfismo.

Polimorfismo implica varias formas de responder el mismo mensaje. En programación orientada a objetos se denomina polimorfismo a la capacidad que tienen objetos de diferentes clases de responder al mismo mensaje.
Esto significa que puede haber muchos mensajes con el mismo nombre, en diferentes clases. Cada clase responde al mensaje con su código propio (o método).
Existen diferentes formas de apreciar el polimorfismo:
a) Sobre-carga de métodos
b) Sobre-escritura de métodos
c) Vinculación dinámica


a) Sobrecarga de métodos.

La sobrecarga de métodos consiste en declarar métodos con el mismo nombre que serán diferenciados por los parámetros que reciben o que retornan.
Los parametros se diferencian por el tipo y la cantidad.
Por ejemplo, un mismo nombre de método puede recibir un String o un int o nada. Ahora veremos un ejemplo donde quedará más claro.


En el ejemplo se puede observar que en caso de crear un una Persona, es posible asignarle un apellido, así como también es posible no pasarle parámetros y que tome un apellido por default.
La ventaja de esto es que no es necesario declarar una método con distinto nombre para métodos similares en los que únicamente cambia el tipo de parámetros que han de utilizar.

b) Sobreescritura de métodos

Una subclase sobreescribe un método de su superclase cuando define un método con las mismas características (nombre, número y tipo de argumentos) que el método de la superclase.
Las subclases emplean la sobreescritura de métodos la mayoría de las veces para agregar o modificar la funcionalidad del método heredado de la clase padre.

En el ejemplo vemos que el nombre por default “Perez” no le sirve a la clase Cliente, la cual prefiere “Garcia”.

Vemos en el ejemplo que Persona y Cliente tienen la opción de setear un apellido (1er caso) o tomar el que viene por default (2do y 3er caso). Esto se puede apreciar en la salida por consola.

c) Vinculación dinámica.

Una referencia a un objeto de una clase, puede pasar a referenciar a otro objeto de otra clase.
Esto es posible siempre y cuando esten en la misma línea de herencia.
En nuestro ejemplo, una persona Puede referencia a un Cliente, ya que ambos se encuentran en la misma línea de herencia.


Si bien la clase instancia es Cliente, se puede observar que el numero de cliente no aparece. Si lo necesito debo “castear”. Luego veremos este concepto.

Respuesta correcta: Garcia.

Casteo.

Para que un objeto que fue referenciado por otro pueda recuperar sus métodos particulares es necesario “castear”.
El casteo sirve para cambiar de tipo. Es como que el objeto se “saca el disfraz”.

Hasta aquí la teoría de objetos, pero pronto crearé una nueva entrada con cosas básicas de Java como tipos de atributos/métodos, clases abstractas, paquetes, interfaces, etc. que van a complementar este post.

 Para crear este post me he basado en unos manuales que he escrito junto a otros profesores cuando trabajaba en IBM. Ellos son:
  • David Brunstein.
  • Gabriel García.
  • Sabrina Campa.
Publicar un comentario