Допустим, у нас есть такая функция:
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;
}
Теперь по какой-то причине наш код не работает. Возможно, он выдает ошибку, возможно, он возвращает неправильное значение, возможно, он застрял в бесконечном цикле.
Первым делом любого программиста первого года обучения является вывод на консоль / стандартный вывод (научившись печатать Hello World, прежде чем научиться использовать отладчик).
Например, для отладки этого кода они могут сделать следующее:
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;
}
Теперь они запускают код, получают распечатку большой консоли, через которую они могут проследить, где что-то идет не так.
Альтернативой, конечно, является установка точек останова и пошаговое выполнение кода в каждой точке.
Одним из основных преимуществ печати на консоли является то, что разработчик может видеть поток значений за один раз, не нажимая на шаги и т. Д.
Но недостатком является то, что ваш код тогда полон всех этих операторов печати, которые затем необходимо удалить.
(Возможно ли, возможно, сказать отладчику печатать только определенные значения в журнале ?, точки останова могут быть легко добавлены или удалены без фактического изменения кода.)
Я все еще использую консольную печать в качестве основного метода отладки, мне интересно, насколько это распространено / эффективно по сравнению с чем-то еще.