Conceptos Básicos De La Programación Orientada A Objetos

Conceptos básicos de la programación orientada a objetos

En pleno siglo XXI y con una tendencia cada vez mas en aumento del dominio digital en nuestras vidas es imprescindible que todos tengamos unos conocimientos mínimos sobre informática, tecnología y programación. A lo largo de mi vida he conocido a muchas personas que solo sabían encender el ordenador y acceder a sus redes sociales, compartir sus fotos en Instragram y descargar películas desde plataformas de sharing.

Y tal vez eso sea suficiente para ellos pero si ahora mismo desarrollas un trabajo delante de un ordenador deberías tener unos conocimientos técnicos mínimos; y no hablo de conocer el sistema de señales del kernel de nuestro ordenador o saber como gestionar la memoria de tu máquina, tan solo quiero remarcar la importancia de poseer unos conocimientos técnicos en un mundo en el que cada vez dependemos mas de la informática.

Ya se ha demostrado la sana relación que existe entre los niños y la programación en su proceso de aprendizaje maduro. Esto tiene muchísimas ventajas en la formación del cerebro y en su definición de la personalidad. Un niño que aprende programación esta sin saberlo amueblando su cabeza y recibiendo herramientas para pensar de una manera lógica y desarrollando su capacidad para resolver problemas.

Entonces, si un niño es capaz de aprender un lenguaje de programación ¿porque tu no vas a poder aprenderlo?

Otra cosa es si de verdad quieres desarrollar su autosuficiencia tecnológica o si por el contrario quieres seguir dependiendo del friki gordo que juega con los ordenadores toda tu vida. Cuando ese tío ya no este, ¿qué vas a hacer cuando aparezca la temida Blue Screen Of Death en tu ordenador y tu trabajo tenga que ser interrumpido? Por ejemplo…

Por eso y como modo de educación os voy a contar los conceptos de la programación para que a los que os interesa sigáis aprendiendo y para los que no os interesa tanto por lo menos que conozcáis en qué se basa nuestro trabajo y desmentir el mito de que los programadores apretamos un botón y el trabajo ya está hecho.

Por cierto, no somos vagos. Trabajamos con la ley del mínimo esfuerzo pero siempre buscando la manera de optimizar y automatizar procesos de trabajo. 😛

programador

¿Qué es la programación orientada a objetos?

Dentro de la programación existen diferentes paradigmas sobre como afrontar y resolver un problema y estos tipos de paradigma están ligados al desarrollo histórico de la tecnología y de nuestra capacidad para producir mejores máquinas y aumentar la capacidad de cálculo y procesamiento de estas.

Si hacemos una búsqueda rápida veremos que podemos desarrollar haciendo programación funcional, programación imperativa, programación estructural, programación orientada a objetos o las recientes en alcanzar hype programación orientada a eventos y orientada a comportamientos, entre muchas otras…

Pero en este caso vamos a aprender qué es la programación orientada a objetos y para ello la wikipedia nos dice lo siguiente:

La programación orientada a objetos (POO, u OOP según sus siglas en inglés) es un paradigma de programación que viene a innovar la forma de obtener resultados. Los objetos manipulan los datos de entrada para la obtención de datos de salida específicos, donde cada objeto ofrece una funcionalidad especial.

Tal vez esta definición te deje con el culo torcido. Para aclarar las dudas y asentar las bases de la programación orientada a objetos has de saber que nuestros ordenadores contienen y procesan datos. Estos datos no dejan de ser información plana que carece de sentido por si mismos y que solo al ser analizados en un universo determinado y conocido obtienen el significado que nos es necesario para nuestros requisitos.

Me explico. Imagina que nuestro ordenador posee los siguientes datos:

Altura Anchura
50 20

Vale, vemos en la tabla que tenemos un dato que representa la altura, cuyo valor es 50, y tenemos otro dato que representa la anchura, que vale 20.

Pero ¿a qué representan estos valores? ¿Son las medidas de una persona? ¿Las medidas de una caja tal vez? ¿O las propiedades de un paquete de tabaco en un dibujo? Digo en un dibujo porque es un plano bidimensional tal y como lo son la altura y la anchura. Al no haber valor para la profundidad, plano Z, no podemos representar una caja o una persona de tres dimensiones, solo es un ejemplo educativo, no os pongáis tiquismiquis cabrones…

Pues bien, esa caja, esa persona o ese paquete de tabaco es a lo que me refiero con el universo concreto de los datos, es el contexto que le da sentido a los valores numéricos que hemos visto. Y como los datos y la informática es impersonal y carente de significado, la programación orientada a objetos es la herramienta que utilizamos para traducir esos valores a conceptos que conocemos de nuestra vida real.

La programación orientada a objetos como su nombre indica trabaja con objetos y nuestro paquete de tabaco del ejemplo es un objeto. Este objeto tiene propiedades como la altura y la anchura y encima puede realizar acciones por si mismo y puede ser sometido a acciones, como por ejemplo abrir el paquete, sacar un cigarrillo, comprobar que tenga tabaco o que el cartón del paquete se degrade.

Pues en la programación orientada a objetos, todo este conjunto de propiedades y acciones es lo que se conoce como objeto que es la representación abstracta de un objeto real de la vida real. ¿Se entiende?

Bueno, si todavía no te ha explotado la cabeza tomate un descanso, tomate un café o échate un piti porque vamos a entrar en faena a partir de aquí…

Representando los datos mediante las clases

Ya hemos visto cual es la definición de un objeto dentro de la programación orientada a objetos, pues bien una clase es la plantilla que vamos a utilizar para modelar este conjunto de datos o estos objetos vamos. Utilizamos las clases para representar entidades o conceptos y definen un conjunto de variables (propiedades) y de métodos (acciones).

Tal y como hemos visto, las clases y objetos suponen el pilar fundamental de la programación orientada a objetos.

Cuando estamos programando y utilizamos una clase, osea la plantilla, para crear un objeto digital, decimos que estamos instanciando una clase.

Para que nuestro ordenador nos entienda tenemos que escribir una clase tal que así:

Atención:

Tutorial basado en PHP. Si eres un Javero o defensor aferrimo de otros lenguajes y te entran pampurrias por favor vete 😛
Cada lenguaje utiliza diferentes sintaxis aunque compartan ciertos aspectos en común.

Vale, tal y como puedes ver en el ejemplo, hemos definido la clase utilizando la palabra reservada class para a continuación nombrar a esta clase con el nombre PaqueteDeTabaco. El nombre de una clase puede ser cualquier nombre que te de la gana siempre y cuando no utilices una palabra reservada de esta lista.

Si te fijas bien, la clase tiene un conjunto de propiedades (altura y anchura) y de métodos (cualEsLaAltura, cualEsLaAnchura, abrirPaquete, comprobarSiHayTabaco, sacarCigarrillo)

Las propiedades tienen la palabra private delante de su definición y esto tiene que ver con las buenas prácticas en la programación orientada a objetos y con el encapsulamiento de datos. La palabra reservada private hace referencia al ámbito de las variables o como se diría en inglés al scope.

Existen varios tipos de ámbitos o de visibilidad de propiedades y métodos:

  • public: permite que el valor de la propiedad o el método sean accesibles desde cualquier lugar como por ejemplo otra clase u otras instancias de esa clase.
  • protected: hace que el valor de la propiedad o el método sea accesible desde la misma clase o desde cualquier otra que herede de ella.
  • private: hace que el valor de la propiedad o el método solamente sea accesible desde la misma clase que la define.

El valor de una propiedad no debería ser accesible desde fuera de una clase o desde otra clase sin utilizar un método que nos proporcione ese valor y aquí es donde entran los métodos getters y setters. Métodos get para recuperar un valor y métodos set para establecer un valor. Por ejemplo, si queremos acceder a la altura del paquete de tabaco tendríamos que hacerlo tal que así.

$paqueteDeTabaco->cualEsSuAltura();

Vuelve a fijarte en la definición de la clase que hay algo que todavía no he explicado… ¿Ya? ¿No te mosquea el uso de la palabra $this? ¿No sabes qué es?

Pues bien, la palabra $this es una pseudovariable, no forma parte de nuestra clase ni tenemos que definirla ni nada por el estilo, es una forma que nos da la sintaxis del lenguaje para poder acceder a elementos de una clase dentro de la misma clase ya sean propiedades o métodos y que solo funciona dentro de la clase.

Si intentas utilizar en cualquier lugar fuera de la clase te fallará.

Creando instancias de clases

Para crear la instancia de una clase y poder utilizarla en nuestro programa tendremos que utilizar la palabra reservada new.

$paqueteDeTabaco = new PaqueteDeTabaco();

Cualquier objeto se creará siempre y cuando tenga un constructor, pero ¿qué coño es un constructor?

Pues un constructor es el método que se encarga de construir el objeto, ¿obvio no? Un constructor se define tal que así:

function __construct() {
...
}

Al utilizar la palabra reservada new, internamente estamos llamando al constructor de la clase, aunque si te fijas en la clase del ejemplo, verás que no hay definido ningún constructor y esto es porque la clase utiliza el constructor por defecto, que al igual que con la pseudovariable $this no nos tenemos que preocupar de definir, ya nos lo provee el lenguaje.

Solo nos preocuparemos de definir siempre y cuando  queramos hacer algo específico en el proceso de construcción del objeto como por ejemplo inicializar variables o llamar a métodos de la clase.

Al igual que todo en la vida, todo lo que se crea se puede destruir y en la programación orientada a objetos no podría ser de otra forma. El lenguaje también nos provee de un método para destruir el objeto y esto es el destructor o la función destructora.

function __destruct() {
...
}

Generalmente utilizamos esta función para liberar memoria, aunque ese es un tema para otro post…

Otra cosa que podemos hacer con los objetos a parte de construirlos y destruirlos es clonarlos o lo que es lo mismo, hacer una copia de ellos mismos. Cuando se clona un objeto PHP hace una copia superficial de todas las propiedades del objeto. Si por cualquier caso una de estas propiedades es una referencia a otra variable el objeto clonado mantendrá esta misma referencia.

$paqueteDeMarlboro = new PaqueteDeTabaco();
$paqueteDeChester = clone $paqueteDeMarlboro;

Internamente al hacer una copia de un objeto estamos llamando al método mágico __clone().

Otro concepto importante en la programación orientada a objetos es la herencia.

Entendiendo la herencia

Entendiendo la herencia y digo entendiendo porque es un concepto bastante abstracto que tenemos que masticar muy detenidamente.

Volvamos al ejemplo del paquete de tabaco. Un paquete de tabaco es un concepto abstracto ya que nos imaginamos el concepto pero no somos capaces de identificar de que marca de tabaco se trata, si pertenece a tabaco negro o tabaco rubio o si se trata de cigarrillos hechos o de tabaco de liar.

Ahora si te imaginas un paquete de Ducados, otro de Marlboro y otro de Golden Virginia, estarás de acuerdo conmigo en que los tres son paquetes de tabaco y que entre ellos comparten ciertas características como la altura y la anchura del paquete pero se diferencian entre ellos del tipo de tabaco, de la presentación y de la marca.

Ademas estos tres paquetes pueden realizan acciones como abrir el paquete y/o saber cuantos cigarrillos quedan, sin embargo, por la fisionomía del packaging de los distintos paquetes, cada uno de ellos se pueden abrir de una forma diferente, por ejemplo…

Pues bien, si aplicamos esta lógica a la programación orientada a objetos, tendremos cuatro clases diferentes:

  • PaqueteDeTabaco.class.php
  • PaqueteDeDucados.class.php
  • PaqueteDeMarlboro.class.php
  • PaqueteDeGoldenVirginia.class.php

La clase PaqueteDeTabaco.class.php sería la clase padre y el resto de clases son las clases hijas que heredan de la clase padre. Mejor veamoslo con un dibujico…

Herencia en la programación orientada a objetos

Herencia en la programación orientada a objetos

Tal y como se ve en la imagen, cada una de las clases hijas comparten propiedades y métodos entre ellas gracias a la clase padre. Una instancia de la clase PaqueteDeDucados.class.php, otra de la clase PaqueteDeMarlboro.class.php y otra de PaqueteDeGoldenVirginia.class.php podrán utilizar el método abrirPaquete() y cualquiera de las tres podrán acceder al método cualEsLaAltura() para obtener el valor de la propiedad $altura de la clase padre y todo este gracias a la herencia.

Sin embargo, si preguntas al PaqueteDeDucados por su marca y tipo serán muy diferentes de las del PaqueteDeMarlboro.

$paqueteDeDucados->cualEsLaAltura();
$paqueteDeMarlboro->abrirPaquete();
$paqueteDeGoldenVirginia->comprobarSiHayTabaco();

Si nos ponemos puristas esto no sería del todo así ya que ambas clases hijas comparten marca y tipo de tabaco por lo que haciendo una buena refactorización deberíamos situar estas propiedades en la clase padre, pero para el ejemplo y para que sea mas visual nos vale.

Así pues, para que una clase herede de otra en PHP deberemos utilizar la palabra reservada extends en la definición de la clase.

Todos los métodos y propiedades de la clase padre pueden ser sobrescritos por las clases hijas. Esto quiere decir que, siguiendo el ejemplo, podemos re-definir el comportamiento de la función abrirPaquete() para una clase en concreto, por ejemplo para la clase del paquete de Golden Virginia ya que este tipo de tabaco no se vende en una cajetilla sino en un sobre y por lo que para abrir el paquete deberemos desenrollarlo en lugar de abrir la cajita, no se si me explico xD

Podremos sobrescribir un método padre siempre y cuando no haya sido definido como final.

Por otro lado, para acceder a una propiedad o llamar a un método padre desde una clase hija tenemos que utilizar la palabra reservada parent junto con el nombre del método.

Pues bien, como podemos ver en la clase de arriba, tenemos el método sacarCigarrillo() que pertenece a la clase padre pero que en este ejemplo de clase hija debemos re-definir ya que en el tabaco de liar los cigarros no vienen hechos sino que tenemos que coger un poco de tabaco, un papel y un filtro y liarlo.

A diferencia del resto de clases de paquetes de tabaco, el método sacarCigarrillo() nos devolvería un cigarro, sin tener que liarlo y por lo cual no haría falta sobrescribir este método.

 

Pues nada, obviamente quedan muchísimo mas conceptos por conocer y dominar en la programación orientada a objetos pero para ir entrando en faena creo que esta ha sido una buena primera aproximación.

Se que el tema ha sido largo y puede ser duro para una persona que nunca ha visto nada sobre lenguajes de programación así que si tienes algún tipo de duda o sugerencia puedes dejarme un comentario mas abajo o hacerlo a través de twitter a través del siguiente banner.

@gorkakatua #faqsGorkamu pregúntame por twitter cualquier cosa y vemos cómo lo solucionamos.

¡Hala a mamarla!

¿Te ha parecido este un artículo de 5 estrellas? Dame tu valoración:
Review Date
Reviewed Item
Conceptos básicos de la programación orientada a objetos
Author Rating
51star1star1star1star1star

Gorka Muñoz Andrés

Me llamo Gorka Muñoz y soy un desarrollador melómano. Combino a la perfección la búsqueda de nuevos grupos con la pasión por la tecnología. Desde chiquitito me ha gustado la programación, ahora que soy mayor estoy metido en el mundo del SEO sin olvidarme del /Dev.

This Post Has 3 Comments

  1. Pingback: Constructores y destructores en la programación orientada a objetos

  2. Pingback: Paamayim Nekudotayim y la palabra final en la programación - Gorkamu

  3. Pingback: Herencia en la programación orientada a objetos - Gorkamu

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *