Metodologías para encontrar errores

From Wiki de Caballero
Revision as of 18:49, 7 November 2013 by Alex (talk | contribs) (→‎PHP)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

☠ Errores… Agujas en un pajar.

Es una analogía para errores que pueden ser dificiles de encontrar.

Si la buscas en toda la paja puede que encuentres la aguja. Si no la encuentras a la primera se vuelve complicado saber cuales partes de la paja buscaste y cuales no. Para buscar una aguja en un pajar hay que separar la paja en pequeñas porciones. Por eso un buen método puede ser dar una escaneada superficial inicial al pajar y ver si se puede encontrar la aguja rápidamente. Si no se puede con la escaneada superficial, pasar a separar la paja para encontrar la aguja.

Pasos:

  1. Realizar un escaneo superficial al código para tratar de encontrar fácilmente el error.
  2. Si no se puede con el paso anterior:
    1. Separar el problema en pequeñas partes.
    2. Revisar cada parte por separado y definir si funciona correctamente.
    3. Coregir problemas en cada parte
    4. Repetir para todas las partes hasta revisar el código completo.

Mostrar variables, siempre...

En caso de no ser capaz de encontrar un error, siempre hay que ver qué valores tienen las variables con las que se está trabajando. Esto para saber la razón por qué alguna instrucción que debería funcionar no está funcionando como un if, for, foreach, etc..

PHP

Para el caso de PHP en particular, se pueden usar varias formas para saber que información contiene una variable:

Para los ejemplos se usa:

$variable = array('', false, 42, array('42') );

echo

/*
* Imprime la variable directamente
*
* Si es un array por ejemplo <b>sólo</b> muestra que es una array pero no su contenido
*/
echo $variable;

Resultado:

Array

print_r()

/*
* Imprime la variable y muestra su contenido aunque sea un array o un objeto
*
* Esta función muestra el contenido de una variables de forma bastante clara
*
* Si se imprime en un html normal no se muestra ordenado,
*  para mostrarlo ordenado encerrar el resutlado en etiquetas &lt;pre&gt;
*/
print_r($variable);

Resultado:

Array
(
    [0] => 
    [1] => 
    [2] => 42
    [3] => Array
        (
            [0] => 42
        )

)

var_dump()

/*
* Imprime la variable y muestra su contenido aunque sea un array o un objeto
*
* Similar a print_r() pero entrega más información como el tipo de la variable
*  Preferiblemente usar print_r() ya que muestra el resultado de forma más intuitiva,
*  si se requiere más información usar var_dump
*
* Si se imprime en un html normal no se muestra ordenado,
*  para mostrarlo ordenado encerrar el resutlado en etiquetas &lt;pre&gt;
*/
var_dump($variable);

Resultado:

array(4) {
  [0]=>
  string(0) ""
  [1]=>
  bool(false)
  [2]=>
  int(42)
  [3]=>
  array(1) {
    [0]=>
    string(2) "42"
  }
}

var_export()

/*
* Imprime la variable y muestra su contenido aunque sea un array o un objeto
*
* Similar a print_r() y a var_dump() ya que muestra el contenido de la variable
*  la diferencia es que imprime una versión que se puede copiar y pegar
*  en el código
*
* Si se imprime en un html normal no se muestra ordenado,
*  para mostrarlo ordenado encerrar el resutlado en etiquetas &lt;pre&gt;
*/
var_export($variable);

Resultado:

array (
  0 => '',
  1 => false,
  2 => 42,
  3 => 
  array (
    0 => '42',
  ),
)