Вариант 3:
void maybe_foobar() {
if(defined('FOO_BAR_ENABLED')) really_foobar();
}
void really_foobar() {
// do stuff
}
В хороший день я бы придумал имена получше, чем «возможно» и «действительно», но это зависит от того, что делает функция и почему она отключается и включается.
Если нет обстоятельств, при которых кто-либо мог бы действительно «делать что-то», когда FOO_BAR_ENABLED не определен, то я бы выбрал ваш вариант 2 (и, возможно, вызову функцию do_stuff_if_possible
вместо foobar
, если имя foobar
вызывало путаницу в том, влечет ли его вызов на самом деле что-либо). Если «делать что-то» всегда допустимо, но некоторые пользователи делают это условно, то я бы выбрал свой вариант 3.
Вариант 1 приведет к копированию и вставке кода, который почти всегда является плохим знаком.
[Редактировать: вот вариант 4, который, я подозреваю, слишком сложен, но вы никогда не знаете:
void if_enabled(string str, function f) {
if (defined(str + '_ENABLED')) f();
}
Тогда вы называете это с:
if_enabled('FOO_BAR', foobar);
Очевидно, что есть некоторые проблемы, связанные с тем, как ваш язык обрабатывает функции, и есть ли способ передать произвольные параметры и возвращаемое значение через if_enabled
.]