Я также не согласен с вашим учителем в этом конкретном случае. Возможно, он был так привязан к общему хорошему уроку, чтобы избегать негативов, где позитив будет хорошо, что он не видел это дерево для леса.
Вот проблема. Сегодня вы слушаете его и превращаете свой код в:
// Print black stripe on odd numbers
int zebra(int num) {
if (num % 2 == 1) {
// Number is odd
printf("*****\n");
}
}
В следующем месяце вы снова посмотрите на это и решите, что вам не нравятся магические константы (возможно, он тоже учит вас этой нелюбви). Таким образом, вы измените свой код:
#define ZEBRA_PITCH 2
[snip pages and pages, these might even be in separate files - .h and .c]
// Print black stripe on non-multiples of ZEBRA_PITCH
int zebra(int num) {
if (num % ZEBRA_PITCH == 1) {
// Number is not a multiple of ZEBRA_PITCH
printf("*****\n");
}
}
и мир кажется нормальным. Ваш вывод не изменился, и ваш набор регрессионных тестов прошел.
Но вы еще не закончили. Вы хотите поддержать мутантов зебр, чьи черные полосы толще, чем их белые полосы. Из прошлых месяцев вы помните, что изначально кодировали его так, что ваш код печатает черную полосу там, где ее не должно быть - на четных числах. Так что все, что вам нужно сделать, это разделить, скажем, на 3, а не на 2, и все должно быть сделано. Правильно? Ну:
#define DEFAULT_ZEBRA_PITCH 2
[snip pages and pages, these might even be in separate files - .h and .c]
// Print black stripe on non-multiples of pitch
int zebra(int num, int pitch) {
if (num % pitch == 1) {
// Number is odd
printf("*****\n");
}
}
Эй, что это? Теперь у вас есть в основном - белые зебры, где вы ожидали, что они будут в основном черными!
Проблема здесь в том, как думать о числах. Является ли число «нечетным», потому что оно не четное или потому, что при делении на 2 остаток равен 1? Иногда ваш проблемный домен будет предлагать предпочтение одному, и в этих случаях я бы посоветовал вам написать свой код, чтобы выразить эту идиому, а не зацикливаться на упрощенных правилах, таких как «не проверять отрицания».