Jose J. Fernández Programador. Desarrollador web y SEO en León

Introducción a la programación orientada a objetos

Jose J. Fernández

Programación orientada a objetos

Programación orientada a objetos, algo que todo programador debe saber a día de hoy. Por lo menos lo básico. Para ello voy a escribir una serie de artículos sobre la programación orientada a objetos o POO, de modo que si aún no sabes de qué va esto te enteres, y que si tienes dudas que las puedas aclarar.

Este es el primer artículo de varios que tengo guardados y con los que espero que acabes dominando toda la teoría de POO.

Paradigmas de programación

La orientación a objetos es un paradigma de programación, como lo son también la programación funcional o la programación estructurada. Un paradigma es una forma de hacer las cosas que facilita la solución a unos problemas específicos. Si ya sabes programar, lo más seguro es que el paradigma que hayas utilizado hasta ahora sea la programación estructurada.

La programación orientada a objetos surgió para que fuera posible representar elementos de la vida real en un programa de una forma entendible y para facilitar el mantenimiento y reutilización de los programas. Cuando entiendas bien la orientación a objetos serás capaz de hacer uso de todas sus ventajas, pero hasta entonces no debes desesperar si te sientes perdido o no lo entiendes todo.

Clases y objetos

Son los conceptos básicos que necesitas entender al 100% para continuar. No son muchas las veces que se explican bien estos conceptos, por lo que voy a intentar que mi artículo sea una de ellas.

  • Un objeto es un elemento de programa como pueden serlo variables o funciones. Las variables almacenan datos y las funciones ejecutan tareas. En cambio, un objeto puede almacenar datos y ejecutar tareas. A las variables que contiene un objeto las llamamos propiedades o atributos, y a sus funciones las llamamos métodos.
  • Una clase es la definición del objeto: qué datos guardará el objeto y qué cosas podrá hacer. En la clase se incluyen los prototipos o declaraciones de las funciones del objeto (acostúmbrate a llamarlas métodos) y su implementación en la mayoría de los casos.

En otras palabras: en la clase escribes el nombre y tipo, según corresponda, de las variables del objeto (las llamaremos propiedades o atributos a partir de ahora), la implementación de los métodos (esto es, las funciones del objeto), sus valores de retorno, los parámetros que aceptan, etc. El objeto, en cambio, sólo llama a dichos métodos y los ejecuta.

Otra manera de decirlo: la clase es el plano de la casa, y el objeto es la casa en si. Tú no utilizas el plano, sólo lo miras para ver qué zonas tiene la casa, dónde van las puertas, dónde hay ventanas y demás información. Para utilizar todo eso, tienes que entrar en la casa. Tú puedes vivir en tu casa sin conocer las medidas exactas de la misma, ni cómo se diseñó, ni en qué pensaba el arquitecto cuando lo hizo…

Pero para poder usar la casa, primero tienes que comprarla o alquilarla. Esto nos lleva a lo siguiente… Para utilizar los métodos del objeto, tienes que instanciarlo.

Instanciación de objetos

Instanciar un objeto significa coger la clase y crear un objeto de ese tipo. Puedes pensar así pues en clases como en tipos de objeto.

El paso de instanciación es necesario en casi todos los casos, y se suele hacer con el operador new. Si sabes PHP, en ese lenguaje sería $miCasa = new Casa();, mientras que en Java sería Casa miCasa = new Casa();. En los lenguajes con sintaxis tipo C es muy parecido siempre.

Veamos el siguiente código:

Casa miCasa = new Casa();

¿Identificas qué es qué en ese código? miCasa es el objeto en si, mientras que Casa es la clase. Puedes pensar en miCasa como un puntero a un conjunto de datos y funciones.

Al utilizar new, ponemos los paréntesis tras el nombre de la clase (como en new Casa()) que indican que estamos llamado a una función… Porque cuando instanciamos una clase con new, el lenguaje de programación está llamando a un método especial de la clase, aunque no lo hagamos explícitamente: el constructor.

El constructor tiene que cumplir unos requisitos que dependen del lenguaje en el que programemos. Por ejemplo, en PHP el constructor siempre se llama __construct(). En Java el constructor siempre se llama como la clase: NombreDeLaClase(). En Python, el constructor es __init__(self), y nos fuerza a que el primer parámetro es siempre self.

Este método especial, el constructor, puede hacer lo que nosotros queramos. Si el objeto tiene unos valores iniciales, se suelen asignar en el constructor, aunque no es estrictamente necesario, depende del lenguaje.

Algunos lenguajes permiten varios constructores, como Java y C#, y otros como PHP sólo permiten tener un constructor. Como siempre, depende de cada lenguaje y en unos hay unas restricciones y en otros hay otras distintas. La teoría siempre será la misma, aunque cada lenguaje luego imponga sus reglas.

Llamar a los métodos del objeto

Cuando tienes un objeto (una instancia de una clase) puedes recurrir a sus métodos. Los métodos como dijimos antes no dejan de ser funciones en realidad, por lo que tienen sus mismas propiedades: pueden recibir o no parámetros (lo que va entre paréntesis), pueden retornar o no un valor, se ejecutan en otro ámbito…

Los métodos también tienen otras propiedades exclusivas de la programación orientada a objetos, como la visibilidad, la capacidad de ser abstractos o estáticos, etc.

Para llamar a los métodos del objeto hay que invocar a dicho objeto y apuntar al método. Fíjate que digo objeto, no clase: para acceder a los métodos necesitas instanciar una clase y tener un objeto.

Existen un tipo de métodos especiales llamados métodos estáticos que ya mencionamos antes y que tienen la particularidad de que no hace falta tener un objeto para acceder a ellos, porque se accede a ellos desde la clase y no desde un objeto, pero no te preocupes por ellos porque más adelante los veremos. Además, hay que usarlos con cuidado, hay quien dice que tu código es malo si usas métodos estáticos ;)

Como hasta ahora, casi todos los detalles que vamos viendo dependen del lenguaje. En unos se invoca a los métodos con el operador de punto (.), en otros con la flecha (->), en otros con ambos dependiendo de algunas cosas… Pero por poner un ejemplo, veamos en Java cómo se podría invocar a un método y recoger su valor de retorno:

GeneradorAleatorio rnd = new GeneradorAleatorio();

int numAleatorio = rnd.metodoQueRetornaEnteroAleatorio();

Lo mismo en PHP sería así:

$rnd = new GeneradorAleatorio();

$numAleatorio = $rnd->metodoQueRetornaEnteroAleatorio();

¿Lo tienes claro? Se puede hacer otro ejemplo con una clase calculadora. En Java:

Calculadora calc = new Calculadora();

System.out.print(calc.metodoQueSumaDosEnteros(2, 5));

En PHP:

$calc = new Calculadora();

echo $calc->metodoQueSumaDosEnteros(2, 5));

En realidad, usar los métodos de los objetos es como usar funciones de una librería de funciones. Es muy sencillo e intuitivo, y cuando te acostumbras se entiende todo bastante rápido.

Por qué utilizar programación orientada a objetos

Dar una explicación contundente sobre esta cuestión llevaría mucho más que un simple post, por lo que intentando simplificar hay una serie de motivos a tener en cuenta que deberían animarte a utilizar este paradigma:

  • Porque permite delimitar la funcionalidad del código en las clases. Esto quiere decir que un objeto tiene una función clara y definida, o debería. Esto acelera la detección de errores y facilita el mantenimiento. ¿Que por qué? Pues porque si sabes en qué parte del código están las líneas que hacen tal o cual cosa ya tienes mucho ganado, ¿no? ;)
  • Porque facilita la reutilización del código y su extensión. Sí, porque una clase como veremos más adelante es casi siempre susceptible de ser ampliada mediante herencia, y todo eso sin modificar el código original. Las clases creadas mediante herencia tienen la funcionalidad de sus ancestros (clases de las que heredan) y pueden añadir o modificar, sin que el código original cambie.
  • Porque permite modelar la realidad de manera sencilla. Cuando hablamos del mundo real y pretendemos trasladarlo a un programa, es muy sencillo con la POO. Intentar representar la realidad sucede constantemente: las páginas web manejan elementos de la realidad como usuarios o artículos. Los programas de contabilidad trabajan con facturas o impuestos. Y en los juegos es muchísimo más evidente, ya que todos tratan de un modo u otro de emular la realidad en mayor o menor grado.
  • Porque facilita el trabajo en equipo. Una persona puede estar trabajando con un conjunto de clases dentro de un programa relacionadas con una función y le da igual que las otras clases (especialmente las implementaciones) cambien, lo que permite que otra persona trabaje en otro conjunto de clases simultáneamente. Además, es muy sencillo realizar tests y pruebas con POO.

En otras páginas de Internet se encuentran muchas más ventajas, aunque en mi opinión todas descienden de estas cuatro. También tiene alguna desventaja, pero te reto a que me digas alguna que no quede en segundo plano cuando mencionas las ventajas… De hecho, creo que si te digo que la programación orientada a objetos se utiliza en la mayoría de empresas en las que podrás trabajar en mayor o menor medida, ya te interesa bastante más, ¿me equivoco?

Conceptos más avanzados

En próximas entradas hablaré de los demás conceptos de la programación orientada a objetos, como pueden ser la herencia, el polimorfismo, el principio de ocultación y otros. Como siempre, cualquier duda o aportación puedes plantearla sin miedo en los comentarios o a mi formulario de contacto, arriba del todo.

No se mostrará públicamente.

Un enlace a tu blog o página web.