cakePHP es un framework de código libre, para el desarrollo web en un entorno rapido y ágil, el cual esta basado en el patrón Modelo Vista Controlador

Contribución revisando comparación lógica en CakePHP::Shell

El cakephp es un framework que entre las cosas que nos brinda es una consola en la cual podemos construir: modelos, controladores, vistas, pruebas, ademas de contar con una serie de utilitarias.

 

¿Cual era el problema? si es que existía alguno

Por otra parte cakephp se caracteriza por ser un framework con una codificación muy clara, sin embargo de repente en el core hay código que es difícil de entender. Muchas veces como programadores hacemos una serie de proposiciones lógicamente correctas sin embargo las hacemos tan complejas que al momento de que terceras personas tratan de leerlas son algo difíciles de descifrarlas(por así decirlo) y esto con el tiempo llega a ser un problema ya que el único que entiende cierto código es quien lo escribió. Por tales razones siempre es bueno tratar de simplificar las expresiones lógicas de tal forma de hacerlas lo mas claras posibles.

Pero.. ¿por que comento todo esto? verán en concreto el  cakephp en su tiempo tuvo la siguente linea:

while ($in === '' || ($in !== '' && (!in_array(strtolower($in), $options) && !in_array(strtoupper($in), $options)) && !in_array($in, $options))) {

Tomate tu tiempo para analizarla y piensa que es lo que hace dicha linea, ¿es algo confusa verdad?.

Analizando posibles soluciones ¿como hacemos esto mas claro?

Bien veamos el código de otra forma, analizando la instrucción lógica siguiente:

(bool)($in === '' || 
        (
             $in !== '' 
           && (!in_array(strtolower($in), $options)
           && !in_array(strtoupper($in), $options)) 
           && !in_array($in, $options))
       );

Bien ahora analice la siguiente expresión lógica:

(bool)($in === '' || ($in !== '' && (otra_expr_logica) ));

Verán sí en la primera parte analizamos que $in es la cadena vacía ($in === '') entonces la segunda($in !== '' && (otra_expr_logica) ) parte ya no es analizada por PHP (por su comportamiento en corto circuito o perezoso).

Solución final

Bien teniendo esto en cuenta y aplicando algunas reglas lógicas podemos obtener una expresión un poco mas clara. Finalmente  la solución que se implemento es la que se muestra a continuación:

(bool) ($in === '' || 
            !(
                 in_array(strtolower($in), $options)
              || in_array(strtoupper($in), $options) 
              || in_array($in, $options)
        ));

Queda como tarea para el lector hacer su propio análisis lógico, para mayor información de la contribución consultar:

https://github.com/cakephp/cakephp/pull/411

Resolviendo un pequeño defecto en los comportamientos de CakePHP

Esta fue mi primera contribución en el frame de cakephp, en la cual me di cuenta de un bug, que existía en el modelo del nucleo.

El problema ¿que estaba pasando?

Tratare de explicar dicha contribución, verán hace un tiempo el cakephp en su modelo base tenia la siguiente instrucción en php:

if ($this->actsAs !== null || $this->actsAs !== false) {
 //...
}

Una prueba haciendo una pequeña prueba

Sí analizamos un poco nos daremos cuenta que es un análisis lógico incorrecto, por lo cual me puse en contacto con uno de los desarrolladores enviando el siguiente test:

function foo($actsAs){
    if ($actsAs !== null || $actsAs !== false) {
                echo "always runs!\n";
    }else
        var_dump($actsAs);
}

foo(false);
foo(null);
foo(
    array('Translate', 'MyBehavior' => array('setting1' => 'value1'))
);
foo('other mensaje');

Verán definí la función foo la cual es simplemente una función de prueba para testar la instrucción lógica de la forma: if ($this->actsAs !== null || $this->actsAs !== false), el resultado del script es el siguiente:

always runs!
always runs!
always runs!
always runs!

¿Como se resolvió? y ¿tu que solución darías?

Bien basicamente propuse las siguientes 3 soluciones:

1. Cambiar la estructura de la comparación lógica por la siguiente

    if ($this->actsAs !== null && $this->actsAs !== false)

2. Revisar si $this->actsAs no es vacio

    if (!empty($this->actsAs))

3.Eliminar la comparación y simplemente ejecutar la acción defecto

    $merge = array('findMethods','actsAs');
    /*if ($this->actsAs !== null || $this->actsAs !== false) {
            $merge[] = 'actsAs';
    }*/

 

¿Tu cual crees que es la mejor solución?, para mayor información sobre la solicitud de cambios puede ver los detalles en:

https://github.com/cakephp/cakephp/pull/357

 

P.d. Agradezco a la comunidad de cakePHP y en especial a Markstory por portarse tan amables con un novato que apenas hacia su 1ra confirmación.