Encapsulamiento | OOP

↑ Me gusta (1)

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.

Aquí el enlace a la serie que te comento

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.

  • Manuel Dautt (CTO)