Вижу странное рвение параметризовать функции булевыми параметрами. Примеры буду черпать из ядра Linux, ну не из рабочего же кода их брать. :)
Считаю такой подход крайне неинтуитивным. Зачастую по коду, в котором этот метод вызывается, не возможно сказать - что означает false или true. Для того, чтобы это понять - ты должен открыть прототип.
Интуитивная понятность очень важна.
И главное, мне не очень понятно, что люди пытаются на этом выгадать?
Самая главная польза в том, что вместо
Мы будем писать:
В первом примере невозможно точно понять, действительно ли true/false oзначает start/stop... Это может быть какая нибудь совершенно другая отвлеченная вещ - типа сохранять ли контекст или не сохранять. Или печатать сообщение или не печатать...
Выходные же параметры использовать, на мой взгляд, вполне допустимо.
В отличии от входного аргумента здесь мы должны явно задать переменную, и контекст вызова самодостаточен..
Особенно хорошо получается, если не называть переменную bv. (sic)
void imx6sl_set_wait_clk(bool enter);
Считаю такой подход крайне неинтуитивным. Зачастую по коду, в котором этот метод вызывается, не возможно сказать - что означает false или true. Для того, чтобы это понять - ты должен открыть прототип.
Интуитивная понятность очень важна.
И главное, мне не очень понятно, что люди пытаются на этом выгадать?
static void pt_config_start(bool start) { u64 ctl; rdmsrl(MSR_IA32_RTIT_CTL, ctl); if (start) ctl |= RTIT_CTL_TRACEEN; else ctl &= ~RTIT_CTL_TRACEEN; wrmsrl(MSR_IA32_RTIT_CTL, ctl); if (!start) wmb(); }
Причем по коду эту функцию никогда не вызывают с true... :) Но даже если бы true был бы нужен, гораздо понятнее написать две функции:
static void pt_config_start() { u64 ctl; rdmsrl(MSR_IA32_RTIT_CTL, ctl); wrmsrl(MSR_IA32_RTIT_CTL, ctl | RTIT_CTL_TRACEEN); wmb(); } static void pt_config_stop() { u64 ctl; rdmsrl(MSR_IA32_RTIT_CTL, ctl); wrmsrl(MSR_IA32_RTIT_CTL, ctl & ~RTIT_CTL_TRACEEN); }
Но это даже не самая главная польза.
Самая главная польза в том, что вместо
pt_config_start(true); .... pt_config_start(false);
Мы будем писать:
pt_config_start(); .... pt_config_stop();
В первом примере невозможно точно понять, действительно ли true/false oзначает start/stop... Это может быть какая нибудь совершенно другая отвлеченная вещ - типа сохранять ли контекст или не сохранять. Или печатать сообщение или не печатать...
Выходные же параметры использовать, на мой взгляд, вполне допустимо.
int __must_check kstrtobool(const char *s, bool *res);
В отличии от входного аргумента здесь мы должны явно задать переменную, и контекст вызова самодостаточен..
bool bv; rc = kstrtobool(buffer, &bv);
Особенно хорошо получается, если не называть переменную bv. (sic)
0 коммент.:
Отправить комментарий