Rimorsoft Online
Blog Foro

Conceptos de Programación Orientada a Objetos


La OOP mantiene características que la identifican y diferencian de otras formas de programar. Aprendamos en esta serie sobre: Abstracción, Encapsulamiento, Modularidad, Herencia y Polimorfismo. En la página web siempre tendremos material al respecto, recuerda comunicarte conmigo si no entiendes algo.

Qué es la Programación Orientada a Objetos

Es difícil decir de primera algo que sea fácil de entender cuando hablamos de este tema, si estás aquí es porque ya conoces de que trata y buscas aclarar tu panorama y posibles dudas. Te puedo comentar que gracias a esta forma de escribir código conseguimos un proyecto mucho mas organizado y muy fácil de mantener.

Aclaremos lo siguiente: La programación orientada a objetos es una forma de programar, un paradigma o una técnica. Lo que aquí aprenderás te servirá mucho así no trabajes con PHP, sin embargo, toma en cuenta que los ejercicios se harán en PHP.

A continuación la clave:

  • Programación orientada a objetos: Es la técnica.
  • PHP: Es el Lenguaje de programación (donde implementamos la técnica).

En esta serie quiero aclarar los conceptos que hacen que este paradigma sea algo enredado, se trata de abstracción, herencia y otros términos.

Para programar de esta forma en realidad debemos crear objetos, y un objeto es una instancia de una clase y una clase es el molde, ejemplo:

  1. Clase User.php.
  2. Objeto 1: $user1 = new User;
  3. Objeto 2: $user2 = new User;

Su estructura inicial es así, nuestra clase es una sola y a partir de ella podré crear uno o muchos objetos.

¿PHP es un lenguaje orientado a objetos?

La respuesta es SI, con PHP contamos con todo lo que se requiere; podemos por supuesto crear clases, objetos, estos por supuesto pueden heredar y mantener una comunicación.

Cuando hablamos de paradigma nos referimos a "modelo", "forma" o "ejemplo", con esto queremos decir que para hacer una acción se toma como modelo o ejemplo otra ya establecida. En otras palabras, tenemos el paradigma de programación estructurada o el paradigma de la programación orientada a objetos.

Esto es importante mencionarlo porque existen diferentes paradigmas y aquí puedes ampliar esa información.

Existen muchos paradigma pero hablemos de programación estructurada y programación orientada a objetos.

  1. Programación estructurada: Es lo que aprendemos en la universidad en la materia lógica de programación, computación 1, etc... Se trata de programar mediante rutinas básicas como if, switch, for, while, etc. (crearé un curso sobre esto para que todos pasen esa materia con éxito).
  2. Programación Orientada a Objetos: Cómo ya mencionamos está basada en varios conceptos: herencia, abstracción, polimorfismo y otras. Todo esto lo veremos en esta serie. Esto no es nuevo, desde la década de 1990 se viene usando este paradigma.

Con PHP podemos trabajar con ambos paradigmas... ¿es un lenguaje estructurado? SI, ¿es un lenguaje orientado a objetos? SI, también lo es.

La mala fama que alguna vez tuvo PHP y que aún mantiene "un poco" se debe precisamente a que muchas personas creaban un index.php, dentro tenían mucho código estructurado y buscaban trabajo como programador. Su misma flexibilidad ayudó a que sea el lenguaje mas usado en el mundo y al mismo tiempo se ganó esa mala fama.

Pero vamos poco a poco ayudando a que trabajemos mejor. Yo enseñando hago mi parte y tu haces la tuya aprendiendo. ¡Somos un buen equipo!.

Entonces, PHP al permitir clases, herencia, objetos y todo lo mencionado anteriormente lo convierte en un lenguaje orientado a objetos.

Antes de continuar te comento que es recomendable estudiar nuestra serie PHP para principiantes, podría decirse que esta serie es la continuación de PHP para principiantes.

Tenemos elementos fundamentales, esto es en realidad lo que vamos a aprender en esta serie, aclaremos todo al respecto:

  1. Abstracción.
  2. Encapsulamiento.
  3. Modularidad.
  4. Herencia.
  5. Polimorfismo.

Te invito a seguir este material de cerca.

Aquí verás los conceptos de programación orientada a objetos.

Abstracción

La definición de diccionario: Consideración aislada de las cualidades esenciales de un objeto, o del mismo objeto en su pura esencia o noción: es un ejercicio de abstracción.

Definición de programación: Esta característica es esencial, nos ayuda a expresar claramente que queremos lograr como resultado final. La abstracción es una técnica usada para el análisis y diseño orientado a objetos, mediante ella detallamos el problema que se quiere atacar para resolverlo fácilmente.

Un dato clave seria decir que la interfaz es sinónimo de aislar, separar y sacar, si es así ¿cuando lo hacemos?.

Hablando de inmediato de temas prácticos podemos decir que es describir una clase a través de propiedades y métodos, crear una interfaz, usar una clase abstracta, etc. Todo esto expresa este principio, veamos a continuación ejemplos:

Interfaz

<?php

namespace App\Connection;

interface Store
{
    public function get();

    public function increment($value = 1);

    public function decrement($value = 1);
}

Implementemos esta interfaz en nuestra clase:

<?php

namespace App\Connection;

class Database implements Store
{
    public function get()
    {
        //...    
    }

    public function increment($value = 1)
    {
        //...
    }

    public function decrement($value = 1)
    {
        //...
    }
}

Aquí vemos una clase con tres métodos, toma en cuenta que estos métodos son obligatorios porque la interfaz lo ha definido... Cuando tu implementas una interfaz es porque usarás todos sus métodos.

Crear y usar una interfaz es abstracción.

En términos mas amplios, una interfaz nos permite crear código en los métodos de la clase que la implemente. Nota que todos los métodos escritos en la interfaz son y deben ser públicos, es ésta es la naturaleza de una interfaz. Una interfaz solo se encargará de mostrar el comportamiento específico de la clase que la implemente.

  • El ¿Qué hace? es la interfaz.
  • El ¿Cómo lo hace? corresponde a la clase que es quien desarrolla cada método.

Clase Abstracta

<?php

namespace App;

abstract class Lock
{
    abstract public function acquire();

    public function get()
    {
        //...
    }
}

Veamos cómo extender de una clase abstracta.

<?php

namespace App;

class Cached extends Lock
{
    public function acquire()
    {
        //...
    }
}

Reglas de una clase abstracta:

  1. Las clases abstractas no se pueden instanciar.
  2. Si una clase abstracta contiene un método abstracto, este debe definirse de forma obligatoria en la clase hija.
  3. Los métodos abstractos solo se declaran en la clase abstracta, pero se desarrolla en la clase que lo implemente.

Observa que nuestra clase abstracta Lock declara el método acquire() pero no lo desarrolla.

Observa también que desde la clase Cached extendemos de la clase abstracta Lock, lo que quiere decir es que todos los métodos definidos como abstractos en Lock deben ser desarrollados en Cached. Por otro lado, toma en cuenta que el método get() no es abstracto, por ello no es obligatorio desarrollarlo en la clase Cached.

Sobre clases abstracta e interfaces haremos futuras lecciones, de momento solo vamos a ocuparnos del concepto de abstracción.

Una Clase

<?php

namespace App;

class Auth
{
    protected $email;
    protected $password;
    
    public function login()
    {
        //...
    }

    protected function validate()
    {
        //...
    }

    protected function attempt()
    {
        //...
    }

    protected function failed()
    {
        //...
    }

    protected function response()
    {
        //...
    }
}

Aquí ilustramos un punto de vista válido, la abstracción muestra las características o detalles de un objeto, quiero decir que no nos importan los detalles. Mira que en el ejemplo solo declaré los métodos (eso es abstracción).

... ¿Cuales son las acciones comunes y qué quiero como resultado final?

  1. Abstracción de Persona: Hablar, reír, comer, ir al baño, etc.
  2. Abstracción de Animal: Comer, dormir, caminar, correr, etc.
  3. Abstracción de Usuario: Registrarse, iniciar sesión, actualizar perfil, etc.

Y así, podemos listar todo acerca de cualquier cosa. Al hacerlo debemos incluir las características y comportamientos.

En resumen: La abstracción es un concepto propio de la programación orientada a objetos, esto puede ser aplicado en Java, PHP y muchos otros lenguajes de programación.

En esta lección vimos interfaces, clases abstractas y una clase; tres ejemplos válidos para ver cómo implementar este concepto en PHP. Abstracción es aislar, separar y sacar... Partiendo de ahí nacieron estos ejemplos.

Si llevamos a un papel alguna solicitud de este tipo podríamos pensar en lo común y no en el detalle. Esto ayuda a solucionar los problemas.

Encapsulamiento

Sobre esto hablé en la serie llamada PHP para principiantes pero en ese curso hablamos de temas prácticos respecto a PHP, aquí veremos el termino desde el punto de vista de la programación orientada a objetos.

Con el encapsulamiento garantizamos la integridad de los datos o propiedades de un objeto, y por integridad quiero decir que los datos se mantengan correctos y estén completos, al mismo tiempo evitamos que se acceda a cualquier dato si no queremos.

Imagina desarrollar diferentes propiedades y decidir que quieres que sea público, protegido o privado... OK, eso que imaginas es el encapsulamiento.

¿Qué logramos?

  1. Proteges propiedades.
  2. Proteger métodos.

Esto es un concepto de programación orientada a objetos, PHP nos permite encapsular y ya veremos un ejemplo.

¿Cuando lo usamos?

Al pensar que nuestros métodos o propiedades necesitan un poco de seguridad extra. Las preguntas que te ayudarán a tomar esta decisión son las siguiente:

  1. ¿Esta propiedad o método será usada solo en esta clase?.
  2. ¿Esta propiedad o método será usada desde una clase externa?.
  3. ¿Esta propiedad o método será usada solo por quienes hereden de mi?.

En otras palabras, este concepto o principio habla propiamente del nivel de acceso que podemos tener hacia una propiedad o método de una clase y como has podido notar nos da un nivel extra de seguridad restringiendo el acceso de acuerdo a la decisión que tomemos.

  1. Acceso público (public): Se resume en "No hay restricciones".
  2. Acceso privado (private): Este nivel solo permite el accedo desde nuestra misma clase.
  3. Acceso protegido (protected): Con este nivel permitimos el acceso desde nuestra misma clase y de quienes hereden de mi.

¿Qué puedes encapsular?: Hablando de PHP podrías encapsular propiedades, constantes y métodos. Veamos a continuación un ejemplo:

<?php

class User
{
    public const PAGINATE = 25;
    //private const PAGINATE = 25;
    //protected const PAGINATE = 25;
    
    public $username;
    //private $username;
    //protected $username;

    public function getUsername()
    {
        //...
    }
    //...
}

Así definimos nuestra estructura, siempre será bajo nuestro criterio.

Generalmente conseguimos el acceso a nuestros métodos usando el prefijo get y set que necesariamente son public, en nuestro ejemplo escribí getUsername().

Nota como todo va de la mano, en este caso podemos tranquilamente abstraer y a medida que redactamos a la clase podemos ir encapsulando.

En Laravel tenemos por defecto en la entidad User.php algunos ejemplos:

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
    
    //...
}

Ahí vemos dos propiedades definidas como protected y nuestras relaciones las creamos siempre como public.

Sabiendo esto podemos entender rápidamente un proyecto hecho por otra persona, "escribir buen código es al mismo tiempo una escribir una buena documentación".

Ocultación o aislamiento

Principio de ocultación: Toma en cuenta que le llamamos "principio" y aquí es donde quiero hacer énfasis. Es probable que sobre la ocultación esperes un capítulo entero, lo malo es que te diría lo mismo que escribí aquí en encapsulamiento.

Según mi experiencia, ambos términos se relacionan y básicamente van de la mano: Podemos decir que la ocultación es el principio y la encapsulación es la técnica o el cómo se hace.

La definición técnica es: Un objeto debe estar aislado y ser un módulo natural. Esto se cumple aplicando la protección a las propiedades impidiendo su modificación y básicamente controlar el acceso. Por eso, luego de leer este principio podemos decir que la técnica o la aplicación es el encapsulamiento.

Modularidad

Este es un concepto muy sencillo; podemos imaginarlo como un módulo que unido a otros módulos forman un proyecto. Crear todo un sistema en un index.php no tiene nada que ver con la modularidad. Ahora pensemos en todas las partes de nuestros sistema, cada pequeña parte (módulo) independiente ayuda a que nuestro sistema realmente funcione.

Si vemos a Laravel podemos entender que tiene este concepto tan en su esencia que lo usamos y manejamos sin saber que esto existe. Laravel aplica este principio al pie de la letra.

Siendo más técnicos podemos definir que la modularidad consiste en dividir un sistema en módulos, donde cada módulo debe ser lo mas independiente posible del resto. La idea es probar por separado cada módulo y dar garantía de su funcionamiento individual y entre ellos.

Este principio básicamente nos ayuda a tener cada vez piezas de código mas pequeñas y mas entendibles, digamos por ejemplo: Es mejor atender netamente el módulo de usuarios que es un archivo de cuarenta (40) líneas de código que todo el proyecto. Esto es capacidad de "descomponer".

El concepto nos lleva a que también se debe permitir la composición y esto simplemente indica que cualquier programador pueda crear, completar o resolver problemas con el menor trauma posible.

Con todo esto tenemos un sistema separado y organizado y los beneficios son palpables:

  1. Mejor lectura del código.
  2. Rápido mantenimiento.
  3. Estándar.

La modularidad es un concepto de programación orientada a objetos, ahora cómo aplicamos esto en PHP. Tomando en cuenta que el único elemento que es posible componer y descomponer es una clase, pero podemos llevar esto a un nivel superior y pensar que organizar las vistas, controladores, helpers, entidades y clases propias aplicando patrones de diseño es una forma acertada de implementar la modularidad.

En la explicación de Programación Estructurada y OOP de Código espagueti se ilustró muy bien este ejemplo. Allí empezamos con un controlador llamado LoginController.php y dentro el método login().

Logramos sacar adelante la solicitud de iniciar sesión pero luego dividimos en varios métodos a esta solución login(), validate(), attempt(), failed() y response().

Sin embargo, vimos también la necesidad final de crear a una clase llamada Auth.php y mudamos todos nuestros métodos allá, teniendo como resultado a LoginController.php con un solo método llamado login() y a una clase Auth.php con su responsabilidad y organización.

El concepto de modularidad debe ser parte de nuestro día a día, incluso fuera del mundo de la programación.

Libro de TDD - Lo que debes saber
Compra el libro
TDD lo que debes saber

Newsletter

Únete a más de 4.000+ personas y no te pierdas nunca más de las nuevas clases, tips, tutoriales y más cada semana.

    No enviamos spam. Puedes darte de baja en cualquier momento.