domingo, 19 de mayo de 2013

Conceptos Básicos de Programación Orientada a Objetos

En esta entrada veremos algunos conceptos de la programación orientada a Objetos (POO)...............................................
Muchas veces cuando empezamos a trabajar con lenguajes de programación nos dicen que son orientados a Objetos y nos dan la teoría del "porqué" pero puede que al trabajar con ellos en la practica no sepamos interpretarlo desconociendo el "como", y entonces seguimos desarrollando por simple inercia porque así fue que aprendimos pero tal vez no de la forma mas óptima.

Vamos a ver algunos conceptos de POO de forma general, mas adelante trabajaremos estos conceptos en casos prácticos para ver su aplicación......

Adicionalmente les comparto un video con un ejemplo basicò sobre el trabajo con objetos en java.....  Empecemos!!!

Programación OO.

La programación orientada a Objetos básicamente define una serie de conceptos y técnicas de programación para representar acciones o cosas de la vida real basada en objetos, a diferencia de otras formas de programación como por ejemplo la estructurada, con la POO trabajamos de manera distinta vinculando diferentes conceptos tales como clases, objetos, métodos, propiedades, estados, herencia, encapsulación entre otros, generando cada vez interrelaciones en nuestro desarrollo en pro del funcionamiento del sistema principal, definiendo el programa como un conjunto de estos objetos relacionados entre si.

Veamos algunos de los conceptos principales.....

Clases. 

Las clases son uno de los principales componentes de un lenguaje de programación, pues en ellas ocurren todos los procesos lógicos requeridos para un sistema, en si podemos definirlas como estructuras que representan objetos del mundo real, tomando como objetos a personas, lugares o cosas, en general las clases poseen propiedades, comportamientos y relaciones con otras clases del sistema. (Ver Ejemplo...)

una clase se compone por tres partes fundamentales:

Nombre : Contiene el Nombre de la Clase.
Atributos : Representan las propiedades que caracterizan la clase.
Métodos : Representan el comportamiento u operaciones, la forma como interactúa la clase con su entorno.

En java se representa así :

/**Principal define el nombre de la Clase*/
public class Principal {
 
 public String atributo="Esto es un atributo";

 /**Esto es un método, donde se definen las operaciones*/
 public void metodo(){
  /**aqui van las sentencias que definen
   * el comportamiento del método*/
 }
}

Objeto.
 
Los objetos representan una entidad concreta o abstracta del mundo real, en programación básicamente se le conoce como la instancia de una clase en si es lo que da el sentido a estas.

Al igual que las clases se componen de tres partes fundamentales:

Estado: Representa los atributos o características con valores concretos del objeto. Comportamiento : Se define por los métodos u operaciones que se pueden realizar con el. Identidad : Es la propiedad única que representa al objeto y lo diferencia del resto.

en la imagen, los moldes representan las clases, mientras que las galletas obtenidas de estos moldes representan los objetos instancias de estas clases, por ejemplo atributos del objeto galleta podría ser sabor, color, tamaño etc......

En java se representa creando una instancia de la clase por medio de la palabra new  al hacer eso creamos el objeto de la clase y podemos hacer uso de los métodos o atributos de esta (dependiendo de la visibilidad de los mismos ) por medio de un punto (.) así:

/**Creamos el objeto como instancia de la clase Principal*/
    Principal miObjeto= new Principal();
    miObjeto.atributo="Este es el nuevo valor del atributo para el objeto";
    miObjeto.metodo();

En este video veremos la aplicaciòn de los conceptos anteriores...


 
Herencia.
 
La herencia en java representa lo que conocemos de herencia en el mundo real, básicamente mediante esta obtenemos las características o rasgos comunes de nuestros padres o abuelos, en java es el mismo enfoque permitiendo la creación de nuevas clases basadas en clases ya existentes, con las cuales podemos obtener las características de las clases padres, heredando campos, atributos, métodos o funcionalidades.


En Java solo se puede heredar de una sola clase padre y se representa mediante la palabra extends (Ver Ejemplo...)

public class Animal{
 public String tamaño;
 
 public void comer(){
  /**Comportamiento.....*/
 }
}

 class Perro extends Animal{
 
 public int dientes;

 public void correr(){
  /**Comportamiento.....*/
 }
}

 class Paloma extends Animal{
  
 public int plumas;

 public void volar(){
  /**Comportamiento.....*/
 }
}

Encapsulamiento.
 
Este concepto es uno de los mas importantes en términos de seguridad dentro de nuestra aplicación, la encapsulación es la forma de proteger nuestros datos dentro del sistema, estableciendo básicamente los permisos o niveles de visibilidad o acceso de nuestros datos


Se representa por 3 niveles :

Público: Se puede acceder a todos los atributos o métodos de la clase. Protegido: Se puede acceder a los atributos o métodos solo en la misma jerarquía de herencia. Privado: Solo se puede acceder a los atributos o métodos de la clase en la que se encuentran.

con la Encapsulación mantenemos nuestros datos seguros, ya que podemos evitar que por ejemplo se hagan modificaciones al estado o comportamiento de un objeto desde una clase externa, una buena practica es trabajar con métodos setter y getter que permiten manipular nuestros datos de forma segura.

en Java lo representamos así:

public class Principal{

  public String atributo1;
  private String atributo2;
  protected String atributo3;

  /**Métodos Set y Get para trabajar con las variables*/

  public String getAtributo2() {
 return atributo2;
  }

  public void setAtributo2(String atributo2) {
 this.atributo2 = atributo2;
  }
 
}

Clases Abstractas.
 
La abstracción permite resaltar la parte mas representativa de algo, ignorando detalles para centrarse en lo principal. 


La imagen es muy fácil de identificar, con base a ella podemos crear una clase persona, o la
clase hombre, humano entre otras, pero obviamente vemos que la imagen no tiene elementos como ojos, nariz, boca, rostro en general, ni dedos, pies, manos o cuello....... pero entonces porque decimos que es una persona?.........Precisamente aquí estamos aplicando el concepto de abstracción, ya que nos fijamos en lo mas representativo de algo, en este caso vemos que se tiene una cabeza, tronco, brazos y pies, con esto es suficiente para saber que es una persona sin fijarnos en los detalles mencionados anteriormente.
Las clases abstractas permiten crear métodos generales con un comportamiento común para otras clases concretas sin importar sus características ni el comportamiento que usen para dichos métodos.

La Abstracción en java solo tiene lógica mediante la Herencia, ya que una clase abstracta posee al menos un método abstracto el cual no tiene implementación, el comportamiento de estos métodos lo definen las clases concretas que lo hereden.

Podemos usarlos cuando existan varias clases con características o acciones comunes pero con diferentes comportamientos..............mediante el uso de la herencia y componentes abstractos hacemos mas óptima y organizada nuestra aplicación. (hay que tener en cuenta que a diferencia de las clases concretas, las clases abstractas no se pueden instanciar). (Ver Ejemplo...)


En Java representamos la abstracción mediante la palabra reservada abstract, así:


public abstract class Principal{

    /**Método Abstracto sin implementación*/
    public abstract void metodoAbstracto();
  
}

class subClase extends Principal{

 @Override
 public void metodoAbstracto() {
  /**Implementación definida por la clase concreta*/
 }
 
}

Interfaces.


Las interfaces son el mecanismo que utiliza Java para simular la herencia múltiple, como mencionamos en Java solo se puede extender de una sola clase, mediante el uso de interfaces esto se puede simular ya que el lenguaje permite implementar el numero de interfaces que necesitemos, básicamente son clases completamente abstractas, es común relacionarlas con un contrato en el que se define que se debe hacer, así cada clase concreta que implemente una interfaz esta obligada a implementar todos los métodos que la compongan.

las interfaces definen lo que la clase que la implemente deberá hacer, mas no la forma como lo hará.

al decir que las interfaces son clases completamente abstractas significa que todos sus métodos lo son y por ende no poseen implementación, no requieren el uso de la palabra reservada abstract, ya que al ser completamente abstracta todo dentro de ella lo es, al igual que las clases abstractas la implementación de los métodos depende de las clases concretas que las usen.


Se debe tener en cuenta que toda variable definida en una interfaz automáticamente se convierte en una constante, además tampoco se puede instanciar una interfaz..... (Ver Ejemplo...)


En java se representan con la palabra interface y se usan con la palabra implements  así: 

interface InterfacePrincipal {
 
 public void metodoAbstracto();
 
 public String otroMetodoAbstracto();
 
}

public class Principal implements InterfacePrincipal{

 public void metodoAbstracto() {
  /**Implementación definida por la clase concreta*/
 }

 public String otroMetodoAbstracto() {
  /**Implementación definida por la clase concreta*/
  return "retorno";
 }
}


Polimorfismo.


Este tal vez sea uno de los conceptos de la programación orientada a objetos mas usados pero muchas veces sin saber que se aplica ya que el concepto inicialmente puede ser un poco confuso, básicamente mediante el polimorfismo programamos de forma general en lugar de hacerlo de forma especifica, se usa cuando se trabajen con la herencia y objetos de características comunes los cuales comparten la misma superClase y árbol jerárquico, al trabajar con este concepto optimizamos y simplificamos en gran medida nuestro trabajo.

básicamente podemos definirlo como la capacidad que tienen los objetos de comportarse de múltiples formas sin olvidar que para esto se requiere de la herencia, en si consiste en hacer referencia a objetos de una clase que puedan tomar comportamientos de objetos descendientes de esta.

 

con el polimorfismo usamos la generalización olvidando los detalles concretos de los objetos para centrarnos en un punto en común mediante una clase padre.

Tomando como ejemplo la imagen anterior, podemos decir que un objeto de la clase FiguraGeometrica puede usarse para referirse a cualquier objeto de cualquier subClase de FiguraGeometrica.............. en otras palabras una figura geométrica puede ser un cuadro, un triángulo, un cuadrado o cualquier figura que en términos generales sea geométrica...... (Ejemplo1) (Ejemplo2)


Veamos este proceso como se representa en Java.


class FiguraGeometrica{
 
}

class Cuadrado extends FiguraGeometrica {
 
}

class Triangulo extends FiguraGeometrica {
 
}

class Circulo extends FiguraGeometrica{
 
}

public class Principal{
 
   public void metodo(){
 /**Puedo crear objetos concretos*/
 FiguraGeometrica miFiguraGeometrica = new FiguraGeometrica();
 Cuadrado miCuadro=new Cuadrado();
 
 /**Puedo crear objetos polimorficos*/
 miFiguraGeometrica=miCuadro;
 
 /**Objeto Cuadrado de tipo FiguraGeometrica*/
 FiguraGeometrica miCuadrado= new Cuadrado();
 /**Objeto Circulo de tipo FiguraGeometrica*/
 FiguraGeometrica miCirculo=new Circulo();
 /**Objeto Triangulo de tipo FiguraGeometrica*/
 FiguraGeometrica miTriangulo=new Triangulo();
 }
}

Como vemos en el ejemplo la clase FiguraGeometrica puede convertirse en cualquier figura que se encuentra en su jerarquía de Herencia pudiendo utilizar las propiedades que compartan entre ellas, hay que tener presente que solo se permite el polimorfismo de clases padre a clases hija mas no al contrario, mas adelante explicaremos este concepto en detalle...


Hasta aquí vimos algunos de los principales conceptos de la programación Orientada a Objetos, en futuras entradas trabajaremos otros ejemplos y aplicaciones, ya que cada concepto posee sus restricciones con respecto al proceso de desarrollo.




También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó...... te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

52 comentarios:

  1. Te felicito por tu blog , excelentemente explicado...

    Ricardo
    Venezuela

    ResponderEliminar
  2. La verdad muy bueno tu blog, muy completo y facil de comprender; muchas gracias !

    ResponderEliminar
  3. Interesante....se me hacia algo complicado entender el concepto de POO...pero ya me quedo claro.Gracias

    ResponderEliminar
  4. lo explicas bastante bien, muchas gracias

    ResponderEliminar
  5. Excelente blog y de antemano gracias. Sus ejemplo muy claros y me han servido para aclarar muchas dudas.

    ResponderEliminar
    Respuestas
    1. Hugo me alegra que te pudiera servir ;( un saludo y gracias por comentar

      Eliminar
  6. Cristian muy interesantes y entendibles todas tus entradas he estado más de 2 horas en tu blog y me parece fantástico, gracias por compartir tu conocimiento, estoy en este mismo proceso de creación de un blog para compartir de igual forma lo que se, Dios lo bendiga

    ResponderEliminar
    Respuestas
    1. Hola, me alegra mucho que estés en este proceso, apenas lo tengas me avisas para darle una ojeada, un saludo y gracias por comentar

      Eliminar
  7. Un pequeño detalle con el Polimorfismo Cristian, ya que no es exclusivo de la herencia, en Java existe la sobrecarga y la sobreescritura, y de ellas solo la sobrecarga es de herencia, el polimorfismo en POO se refiere a la capacidad de nombrar a varios atributo metodos o funciones de la misma forma y aun así poder diferenciarlos, ya sea por los parametros, o la clase a donde pertenece. Para ponerlo facil es la forma de englobar los comportamientos y atributos qeu puden ser comunes, y aun así poder usar sus diferentes "variantes" del mismo, de ahi lo de polimorfismo (varas formas)

    ResponderEliminar
    Respuestas
    1. Hola, tienes toda la razón, solo que se me pasó por alto teniendo en cuenta que estos 2 conceptos por lo regular se manejan de forma independiente como pero ligados a como lo dices la herencia y ps el mismo polimorfismo, gracias por tu aporte y nuevamente tienes razon.

      Eliminar
  8. Gracias, me quedó una sola duda, en el primer ejemplo hacías un override al método abstracto y en el segundo ejemplo no, ¿es necesario sobrescribir el método o se puede hacer de ambas formas?

    ResponderEliminar
    Respuestas
    1. hola, se puede hacer de ambas formas, la anotación identifica que fue heredado, te comparto esta entrada sobre el tema, un saludo y gracias por comentar ;)
      http://codejavu.blogspot.com/2014/05/sobreescritura-y-sobrecarga-de-metodos.html

      Eliminar
  9. Muy bien explicado, gracias

    ResponderEliminar
  10. Gracias¡ Muy clara tu explicacion

    ResponderEliminar
  11. EN QUE CASOS SE PUEDE APLICAR HERENCIA Y POLIMORFISMO A LA VEZ

    ResponderEliminar
  12. Jorge Eduardo Ramírez Porras7 de agosto de 2015, 8:17

    Excelentemente explicado, muchísimas gracias!

    ResponderEliminar
  13. exelente trabajo gracias

    ResponderEliminar
  14. Excelente blog! Me queda mas claro los conceptos.
    Gracias Saludos...

    ResponderEliminar
  15. Gracias por hacer claro y explicar de manera mas entendible lo que los profesores y libros explican con palabras confusas.

    ResponderEliminar
  16. Me gracias por la informacion!
    Saludos!.

    ResponderEliminar
  17. muy bueno tu blog me ayudo de mucho para mi trabajo de grado explicas muy bien felicidades

    ResponderEliminar
  18. Muy bien, excelente, me ayudo en mi tarea

    ResponderEliminar
  19. Muy completo, gracias por el aporte.

    ResponderEliminar
  20. Cada artículo es una genialidad,sigue así.

    ResponderEliminar
  21. Excelente, muchas gracias por la información.

    Quisiera saber si puedes hacer un post donde muestres las clases mas utilizadas y para que sirven.

    Saludos.

    ResponderEliminar
  22. Cristhian, realmente una explicación y unos ejemplos muy claros, mis congratulaciones...

    ResponderEliminar
  23. Cristian muchas gracias por la información clara y concisa.

    ResponderEliminar
  24. Cristian muchas gracias por la información clara y concisa.

    ResponderEliminar
  25. Respuestas
    1. Este comentario ha sido eliminado por un administrador del blog.

      Eliminar
  26. demasiado bien explicado excelente , saludos desde costa rica.

    ResponderEliminar
  27. excelente, muy buena explicación!!

    ResponderEliminar
  28. muy bueno la verdad, sigue asi!

    ResponderEliminar
  29. excelente gracias me sirve de mucho :)

    ResponderEliminar
  30. Indeed, excellent write-up. You have explained key OOP concepts in very easy manner. Keep it up. Btw, I have also tried to explain OOP fundamentals and principles in form of QnA, let me know if you find it useful.

    ResponderEliminar
  31. oh me sirvio de mucho,
    y al parecer un concepto depende de otra para crear la estructura de nuestro sistema.

    ResponderEliminar
  32. En que universidad estudio? Cristian?

    ResponderEliminar
  33. Excelente, gracias por tu aporte.

    ResponderEliminar
  34. Hola Cristian, tendrás algun video explicando agregación y composición en eclipse?
    Saludos desde Argentina

    ResponderEliminar
  35. Muy bien explicado, muy buen aporte y claridad en los conceptos

    ResponderEliminar
  36. Gracias por las explicaciones.
    Seria bueno un nuevo post pero basado en Kotlin.
    Gracias.

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!