Предположим, я использую C ++. Теперь у меня есть такой код:
int flag;
// ...
while (!TimeToExitLoop()) {
Func();
}
Цикл while
будет выполняться огромное количество раз, а Func
критичная по времени функция, например:
void Func() {
// some big stuff ...
if (flag > 1) {
// logic 1 ...
}
else {
// logic 2 ...
}
}
Кроме того, значение flag
не изменится в пределах цикла while
. Поэтому лучше переместить условный оператор if
из цикла while
и определить две отдельные функции для этих двух условий, например:
int flag;
// ...
if (flag > 1) {
while (!TimeToExitLoop()) {
Func_FlagBiggerThanOne();
}
}
else {
while (!TimeToExitLoop()) {
Func_FlagNoBiggerThanOne();
}
}
Однако это приведет к повторению "больших вещей" в Func
на Func_FlagBiggerThanOne
и Func_FlagNoBiggerThanOne
:
void Func_FlagBiggerThanOne() {
// big stuff ...
// logic 1 ...
}
void Func_FlagNoBiggerThanOne() {
// big stuff ...
// logic 2 ...
}
что нарушит принцип «Не повторяйся». Мы не можем поместить этот «большой материал» в какую-либо функцию, потому что вызов этой функции займет больше времени, чем исходный оператор if
. Одно из решений - определить макрос для этого большого материала, но что, если «логика 1» и «логика 2» будут использовать переменные, определенные в «большом материале»? Хотя макрос все еще работает, что может привести к некрасивому коду, читатель программы может подумать: «А где, черт возьми, эти переменные определены?»
Func
находится в другом файле, потому чтоflag
явно глобален. - person lijie   schedule 24.11.2010