Programación Orientada a Objetos

POO es un paradigna de programación que comenzó a desarrollarse en los años 80, en ese momento se dieron cuenta que esta forma de programación facilitaba el desarrollo de sistemas de gran tamaño. De hecho actualmente este paradigma de programación es el más utilizado, los grandes sistemas que conocemos han sido desarrollados en base a este paradigma.

Las ventajas de poo

Es reutilizable, esto quiero decir que si desarrollamos nuestro código de forma adecuada, las clases y lo que creemos se puede reutilizar, en distintas partes del programa la cual nos va a permitir no duplicar código. Mantenibilidad, un sistema orientado a objetos va ser mucho mas fácil de leer y comprender para los programadores, ya que para ellos no vas ser necesario adentrarse demasiado al código, basta con ver las clases generales para darse cuenta como funciona . Modificable, si nuestro código esta bien implementado va ser muy fácil añadir, modificar o incluso eliminar las clases u objetos que ya existan en el código. Un sistema orientado a objetos también es fiable, es mas fácil detectar errores en este tipo de programas, podemos dividir el sistema en partes e ir las probando de manera independiente

Característica principales

  • Abstracción
  • Encapsulamiento
  • Herencia
  • Polimorfismo

Para poder desarrollar aplicaciones orientas a objetos de la mejor manera, debemos analizar y entender cada uno de estos conceptos.

La abstracción

Es un pilar o característica de la programación orienta a objetos, que va permitir que los objetos puedan interactuar sin necesidad de conocer los detalles del funcionamiento, de esta forma el enfoque se centra en aspectos relevantes de las entidades, podemos decir de hecho que estos aspectos son relativos ya que van a depender del enfoque en que se analice. Para entender el concepto vamos a modelar una escuela. Una escuela puede tener muchas características, pero con la abstracciones me voy a centar o enfocar únicamente en las características que yo necesito, para ellos debo de pensar de que como quiero modelar la escuela, lo puedo modelas desde el punto de vista administrativo, por ejemplo:

  • Control de alumnos
  • Control de empleados
  • Control de asignaturas

Este seria el caso de un sistema de administración para escuela, también podemos enfocarnos de otra forma en las escuelas; podría ser que yo quisiera un sistema para una constructora, en este caso puedo ver el enfoque de la escuela es muy diferente; a una constructora le van a interesar las características de la escuela las cuales pueden ser, ventanas, puertas, pisos entre otras aspectos. Como podemos ver una misma entidad puede analizarse desde varias puntos de vista o enfoque, ademas de acuerdo de este enfoque se van a definir las características o comportamientos.

La abstraccion tambien nos va a permitir eliminar todos aquellos aspectos que forman parte del objeto o entidad pero que no son significatios para el caso que estamos analizando.

Encapsulamiento

Esta es una de las características más fáciles de entender de la programación orientada a objetos ya que la vamos a poder apreciar a simple vista en nuestro código, el encapsulamiento nos va a permitir empaquetar en un mismo contenedor o plantilla tanto las características de las entidades u objetos como sus comportamientos.

Si has desarrollado con otros paradigmas de programación como la ‘programación estructurada’, podrás recordar que los datos y los módulos estaban separados, en cambio en la programación orientada a objetos estas características y atributos o comportamientos se van a mantener empaquetados en una misma plantilla.

El encapsulamiento también va a permitir establecer niveles de acceso, de esta forma podemos indicar la manera en que los objetos van a poder interactuar entre si.

Si continuamos con el ejemplo de la escuela o el sistema administrativo para la escuela, podríamos tener la clase empleado y un comportamiento que calcule el pago, suponiendo que no queremos que otro elemento conozca el detalle de esta calculo, podríamos entonces ocultarlo y de esta forma estaríamos marcando su nivel de acceso

Herencia

La herencia es otro pilar de la programación orientada a objetos que vamos a entender fácilmente, ya que la herencia en sí es parte de la naturaleza humana.

En un sistema, la herencia va ayudarnos a clasificar los elementos y su vez nos va a permitir reutilizar el código, regularmente en un sistema vamos a encontrar que sus elementos pueden ser organizados de manera jerárquica, de tal forma que las clases o elementos de nivel superior pueda compartir sus características y acciones con las entidades de nivel superior.

Si pensamos en los empleados para el sistema que hemos planteado para la administración de una escuela, estos empleados pueden clasificarse en profesor, director y secretaria por ejemplo.

Podríamos entonces definir estas clases como derivadas de la clase empleado, de esta forma estaríamos aplicando la herencia y las clases derivadas profesor, director y secretaria estarán heredando las características y comportamientos de la clase empleado.

Podemos analizarlo de la siguiente forma, un empleado puede ser un profesor, un director o una secretaria, cabe mencionar que un sistema puede tener ‘n’ niveles de herencia, en nuestro sistema podríamos pensar por ejemplo en una clasificación adicional para el profesor, para ellos podríamos añadir las clases tiempo_completo y por_horas, estas clases serian entonces derivadas de la clase profesor.

Es así como la herencia nos ha ayudado hacer una estructura jerárquica que nos va servir para desarrollar nuestro sistema.

El ultimo nivel jerárquico en este caso tiempo_completo y por_horas van a adquirir las características de todas las clases de las cuales heredan, es decir que tiempo_completo va adquirir las características y comportamiento tanto de la clase profesor como de la clase empleado, las clases director, profesor y secretaría son clases derivadas únicamente de la clase empleado por la tanto solo van a adquirir las características y comportamientos de esta clase.

Polimorfismo

Es la característica de la programación orientada a objetos que va a permitir que un objeto presente diferentes comportamientos de acuerdo al contexto en el que se encuentre.

Existen diversas formas de implementar el polimorfismo, la implementación que podemos encontrar más comúnmente en un sistema es la que permite definir un comportamiento para que una clase que a su vez va ser heredado a sus clases derivadas y cada una de ellas va poder adaptar este comportamiento e implementarlo de acuerdo a sus necesidades.

Retomando el ejemplo que aviamos planteado de la escuela, vamos a suponer que quiero definir un comportamiento para los empleado, yo se todos los empleados van a tener que recibir un pago, para ello voy a utilizar el comportamiento o método CalcularPago, el problema en este caso que vamos a encontrar es que no todos los empleado van a recibir un mismo pago y su pago no se va a calcular de la misma forma, es entonces que mediante el poliformismo voy a permitir que el método CalcularPago sea implementado por cada clase dependiendo de sus necesidades.

Por ejemplo para la clase profesor de tiempo completo haría que el calculo de pago sea de acuerdo a sus prestaciones y a su quincena, en cambio para un profesor por hora implementaría el método CalcularPago de acuerdo a las horas que a trabajado durante el mes. También la clase director va heredar el método o comportamiento de la clase empleado y la clase derivada secretaria también lo va hacer, cada una de estas clases va implementar el comportamiento de acuerdo a sus necesidades.