Comenzamos esta nueva serie de artículos en los que nos vamos a centrar en explicar conceptos sobre buenas prácticas en el mundo de la programación.

En cada una de las entregas de esta saga de artículos, detallaremos un principio de programación que conlleve algún tipo de buena práctica para llegar a ser "Top Developers".

Estos principios estarán subidos en un repositorio GitHub donde podréis ver cómo se realiza la implementación de una llamada "mala práctica" y cómo realizamos la refactorización de la misma para que se ajuste los principios explicados en el artículo.

Podéis encontrar el repositorio aquí: Manual de buenas prácticas de programación.

¡Vamos a darle caña a esas buenas prácticas!

Tell don't ask!

La traducción literal de esta buena práctica al español sería algo así como: ¡Manda y no preguntes!

Es una buena práctica fuertemente ligada a la Programación Orientada a Objetos y el principio que sustenta es que cuando se realiza la instanciación de un objeto no se debería preguntar sobre las propiedades internas del mismo para llevar a cabo una acción fuera del objeto, sino que se debería dejar la responsabilidad de realizar la acción al objeto en sí y que este mismo compruebe el estado de la propiedad.

Manual-buenas-practicas-tell-don't-ask

Vamos a verlo mejor con un ejemplo:

Imaginemos que estamos a cargo de la programación de una aplicación que gestiona el control de riego de una plantación.

Dentro de esta plantación, una serie de sensores nos informan sobre el porcentaje de humedad que tiene la tierra y cuando este porcentaje baja de un cierto número, se activa el sistema de riego.

Para hacerlo más sencillo, vamos a suponer que solo tenemos un sensor y solo tenemos una sección de riego.

Como bien sabéis, a Juanjo le mola PHP, así que el código estará escrito en este lenguaje. Pero no os preocupéis, tenemos entre manos un código muy sencillito y será muy fácil de comprender.

El objeto que realiza el control de riego podría ser algo así:

class ControlRiego{
    const MINIMO_HUMEDAD = 20;
    public $humedad;

    public function regar(){}
}

En el código que no sigue los principios de Tell don't ask toda la acción se realiza fuera del objeto, de este modo:

//Realizamos la instanciación del objeto
$instControlRiego = new ControlRiego();

//chequeamos si la humedad es menor al nivel nímimo.
if ($instControlRiego->humedad < $instControlRiego::MINIMO_HUMEDAD){
    $instControlRiego->regar();
}

Aquí podemos ver como preguntamos a la instancia en lugar de decirle lo que tiene que hacer.

En este caso, chequeamos el valor de una propiedad interna y la contrastamos con una contante, también declarada dentro de la clase.

Veamos cómo queda nuestra aplicación después de refactorizarla para que siga el principio de Tell don't ask.

class ControlRiego{
    const MINIMO_HUMEDAD = 20;
    //ahora nuestra variable puede ser privada
    private $humedad;

    public function regar(){

        if ($this->humedad < $self::MINIMO_HUMEDAD){
            //retornamos: Se ha llevado a cabo la acción de riego
        }

        //retornamos: No se ha llevado a cabo la acción de riego

    }
}

Desde fuera de la instancia, ahora no es necesario conocer el valor de las variables.

Simplemente instanciamos y ejecutamos la acción.

//Realizamos la instanciación del objeto
$instControlRiego = new ControlRiego();
//Ejcutamos la acción
$instControlRiego->regar();

Como hemos podido ver, para transformar el código inicial (para así mandar a la instancia y que ella sea la encargada de realizar la acción) simplemente tenemos que ceder al objeto toda la responsabilidad y que sea el mismo quien se encargue de consultar el valor de sus propiedades,MINIMO_HUMEDAD y $humedad en nuestro caso.

Gracias a esta buena práctica hemos conseguido encapsular todas las propiedades y acciones del objeto dentro del mismo, lo cual se considera buena práctica.

La vimos en detalle en el podcast titulado "Tell, don't ask", Ley de Demeter y el tío de la vara, junto con otras buenas prácticas que recordamos habitualmente para no olvidarlas.

Espero que os haya gustado, y ya sabéis:

¡Nos vemos en el siguiente fragmento de conocimiento, equipo!


Escrito por Juan José Ramos

Soy programador web, artesano del código y estudiante incansable. Aunque mi carrera siempre ha ido ligada al backend , últimamente me estoy dejando llevar por las lindezas del front.
No hay nada que me guste más que indentar y pulsar [ENTER] ;).
comments powered by Disqus