10.8.11

¿Donde quedó la bolita?

Una de las cosas chidas que aprendí de jQuery es la forma en que maneja los argumentos, de forma casi predictiva. A lo que me refiero es la manera en que permite que los argumentos de la derecha se puedan emplear hacía la izquierda y así sucesivamente.

jQuery.post( url, [data,] [success(data, textStatus, jqXHR),] [dataType] )

jQuery.post('url.php', { foo: bar }, function(){}, 'json');
jQuery.post('url.php', function(){}, 'json');

O algo así, la onda es que me late hacer lo mismo con PHP.

function foo($bar = '', $candy = 0, $does = array(), $nothing = NULL, $else = FALSE)
{
  if (is_integer($bar))
  {
    $candy = $bar;
    $bar = '';
  }

  if (is_array($candy))
  {
    $does = $candy;
    $candy = 0;
  }

  if (is_callable($does))
  {
    $nothing = $does;
    $does = array();
  }

  if (is_bool($nothing))
  {
    $else = $nothing;
    $nothing = NULL;
  }
}

Aquí la clave está en conocer bien el tipo de argumentos que necesita nuestra función, y en base a ello omitir o redefinir los argumentos. En el ejemplo se hace de forma muy abusiva, confusa y complicada.

Si una función espera mas de 4 argumentos entonces lo que yo hago es agrupar las opciones mas triviales y restantes en un solo último argumento a modo de arreglo asociativo. Así los primeros tres argumentos -los mas relevantes- son mas fáciles de comparar predictivamente, suponiendo que alguno de ellos es igualmente un arreglo asociativo para combinarlo con las últimas opciones.

function request($url, $method = 'GET', array $params = array())
{
  static $defaults = array(
    'url' => '',
    'vars' => array(),
    'method' => 'GET',
    'headers' => array(),
    'status' => 200,
    'timeout' => 30,
    'callback' => 'print',
  );


  if (is_array($url))
  {
    $params += $url;
  }


  if (is_array($method))
  {
    $params += $method;
  }


  $params = array_merge($defaults, $params);

  extract($params);
}

Aquí hay otro tip: el type-hinting de php es realmente útil en estos casos, neta. Esto cambia radicalmente nuestra forma de emplear una función, método o como se llame.

Así mismo la idea es trabajar directamente con la variable de opciones, o bien, usar extract() para abreviar.

Yo le llamo patrón de predicción.

No hay comentarios: