Digamos que tenemos una función como esta:
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Ahora, por alguna razón, nuestro código no funciona. Tal vez está arrojando un error, tal vez está devolviendo el valor incorrecto, tal vez se ha quedado atascado en un bucle infinito.
Lo primero que un programador de primer año es imprimir en consola / std out (habiendo aprendido a imprimir Hello World antes de aprender a usar un depurador).
Por ejemplo, para depurar este código, podrían hacer lo siguiente:
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
Ahora que ejecutan el código, obtienen una gran impresión de la consola, que pueden atravesar para rastrear dónde van las cosas mal.
Una alternativa, por supuesto, es establecer puntos de interrupción y recorrer el código en cada punto.
Una de las principales ventajas de imprimir en la consola es que el desarrollador puede ver el flujo de los valores de una vez, sin tener que hacer clic en los pasos, etc.
Pero la desventaja es que su código está lleno de todas estas declaraciones de impresión que luego deben eliminarse.
(¿Es posible tal vez decirle al depurador que imprima solo ciertos valores en un registro ?, los puntos de interrupción se pueden agregar o eliminar fácilmente sin modificar el código).
Todavía uso la impresión de consola como método principal de depuración, me pregunto qué tan común / efectivo es esto en comparación con algo más.