2012-06-18 2 views
1

Когда я пишу функцию определения пользователя, должен ли я вернуть 0, если функция выполнена успешно или имеет значение, отличное от нуля?Кодирующая парадигма: должен ли я вернуться 0, если функция успешна?

Мне лично нравится возвращать 0, если моя функция успешна, но я всегда вижу обработку ошибок больше, чем (!var) и меньше, как (var != NULL). Так что было бы лучше вернуть некоторую ценность, например, 1, как известно, TRUE, даже в небулевой ситуации?

Что предлагает переполнение стека?

Причина, почему я спрашиваю, потому что я написал, не булеву оболочку для WINAPI BOOL CreateProcessW и выбросил мой код, потому что я был в обертке returning 0 и прежде, чем я проверял, если TRUE.

+3

Я думаю, что этот вопрос по своей сути субъективен. Я бы предложил просто использовать любое соглашение, которое будет использоваться остальной частью проекта, над которым вы работаете. – templatetypedef

+0

Проголосовало за закрытие; Очень субъективно. –

ответ

1

Я считаю, что проще вернуть ненулевое значение в случае успеха, потому что тогда вы можете сказать что-то вроде:

int result = foo() 
if (!result) { .. } 

, гораздо более ясно на намерение. Часто NULL возвращается в исключительных случаях или случаях ошибок, поэтому возвращение NULL на успех является интуитивно понятным.

Однако лучшим решением было бы использовать перечисления для всех кодов ошибок и проверять их, а не использовать что-то вроде !result. Это позволит вам обрабатывать случай, когда есть несколько кодов ошибок.

+1

Я понимаю, но как бы вы добавили более точную обработку ошибок в определенную вами функцию, если все, что вы можете вернуть, является 'NULL', когда есть ошибка? – user1450236

+0

@ user1450236 вы не можете, поэтому вы не всегда можете это сделать. Вы должны сделать только это, есть только один код ошибки (0). В других случаях вы можете вернуть 0 на успех. Таким образом, вы когда-нибудь пишете «чище» код. Просто убедитесь, что вы четко указываете в документации, какие могут быть все коды возврата. – Oleksi

0

Я бы сказал, просто выбрать один и быть последовательным. Если вы работаете с каким-либо другим приложением значительным образом, старайтесь соответствовать этому коду.

Мне нравится возвращать 0 на успех, а затем использовать ненулевые числа для различных условий ошибки. Если вы используете 0 в качестве своей ошибки, вы можете получить только одну возвращаемую ошибку, не вдаваясь в более сложную обработку ошибок. Но проверка на! Foo() может показаться противостоящей интуитивной.

0

Это действительно субъективный вопрос, но, как правило, я предлагаю вернуть коды ошибок enum'd и явно проверять условия, которые вы ожидаете. Это позволяет избежать ситуаций, в которых вы оказались.

Консистенция важнее любой схемы.

Смежные вопросы