En esta ocasión les traigo un post de Matthias Noback quien nos brinda algunos consejos para hacer legible nuestro código PHP, sin más:

PHP es un lenguaje, que con un estilo tan libre provoca que escribir código en ocasiones se haga ilegible. Sin embargo, ello no debe ser motivo para no proponerse a mejorar la legibilidad de lo que se codifica. Una buena práctica es reducir la complejidad de nuestro código con mecanismos sencillos y decisivos. Por ejemplo, reducir la cantidad de ramas en el cuerpo de una función eliminando la mayor cantidad de condicionales posible.

Esto :

if ($a->somethingIsTrue()) {
    $a->doSomething();
}

puede ser:

$a->doSomething();

Ello conlleva a la adaptación del principio de ‘haz, no preguntes’ (http://martinfowler.com/bliki/TellDontAsk.html) Es muy interesante cómo aplicar este principio cuando programamos orientado a objetos.

Otra manera de reducir la cantidad de condicionales, sobre todo cuando tenemos muchas ramificaciones es utilizar un mapa de referencias, ello permite acceder a la opción deseada directamente, llevando el mecanismo condicional al mínimo.

Esto:

if ($type === 'json') {
    return $jsonDecoder->decode($body);
} elseif ($type === 'xml') {
    return $xmlDecoder->decode($body);
} else {
    throw new \LogicException(
        'Type "' . $type . '" is not supported'
    );
}

puede ser:

$decoders = ...; // a map of type (string) to corresponding Decoder objects
if (!isset($decoders[$type])) {
    throw new \LogicException(
        'Type "' . $type . '" is not supported'
    );
}
return $decoders[$type]->decode($body);

El forzado de tipos estrecha la utilización de las variables según un tipo determinado

Esto:

if ($a instanceof A) {
    // happy path
    return $a->someInformation();
} elseif ($a === null) {
    // alternative path
    return 'default information';
}

puede ser:

return $a->someInformation();

El retorno temprano, aunque de cierta manera ramifica, aporta claridad a la ejecución del codigo generado

 

// pre-condition
if (!$a instanceof A) {
    throw new \InvalidArgumentException(...);
}
// happy path
return $a->someInformation();

Reducir el número de variables temporales es otro punto a considerar en cuanto a legibilidad. Cada variable que se crea es un elemento que tienes que seguir durante toda la revisión de un código. Una forma de evitar este problema es incorporar el uso de funciones de ayuda

Esto:

public function capitalizeAndReverse(array $names) {
    $capitalized = array_map('ucfirst', $names);
    $capitalizedAndReversed = array_map('strrev', $capitalized);
    return $capitalizedAndReversed;
}

Puede ser:

public function capitalizeAndReverse(array $names) {
    return self::reverse(
        self::capitalize($names)
    );
}
private static function reverse(array $names) {
    return array_map('strrev', $names);
}
private static function capitalize(array $names) {
    return array_map('ucfirst', $names);
}

De igual manera, cuando la lógica se vuelve compleja, la encapsulación a través de métodos es una manera de hacer legible lo que se escribe.

Esto:

if (($a || $b) && $c) {
    ...
}

Puede ser:

if (somethingIsTheCase($a, $b, $c)) {
    ...
}

Y hasta aqui, son algunos consejos que puedes seguir para legibilizar lo que codifiques…

Fuente: https://www.ibuildings.nl/blog/2016/01/programming-guidelines-php-developers-part-1-reducing-complexity

Anuncios