Джоэл Спольски не прав.Возвращение статуса с помощью кодов ошибок / возврата означает, что вы не можете доверять результатам любого вызова метода - возвращаемое значение должно быть проверено и обработано.
Это означает, что каждый вызов метода, возвращающий такое значение, вводит по крайней мереодна точка выбора (или более, в зависимости от домена возвращаемого значения) и, таким образом, больше возможных путей выполнения через код.Все это должно быть проверено.
Затем этот код, предполагая, что контракт Method1 () и Method2 () должен либо успешно выполнить, либо выдать исключение, имеет 1 возможный поток через него .:
foo.Method(...) ;
bar.Method(...) ;
Если эти методы показывают статус через код возврата, он внезапно становится очень запутанным очень быстро.Просто возвращение двоичного значения:
bool fooSuccess = foo.Method(...);
if ( fooSuccess )
{
bool barSuccess = bar.Method(...);
if ( barSuccess )
{
// The normal course of events -- do the usual thing
}
else
{
// deal with bar.Method() failure
}
}
else // foo.Method() failed
{
// deal with foo.Method() failure
}
Возврат кодов состояния вместо выдачи исключений
- усложняет тестирование
- усложняет понимание кода
- почти наверняка будут содержать ошибки, потому что разработчики не собираются регистрировать и тестировать каждый возможный случай (в конце концов, как часто вы действительно видели ошибку ввода-вывода?).
Вызывающий должен бытьпроверка, чтобы убедиться, что все не так просто перед вызовом метода (например, Проверка на наличие файла. Если файл не существует, не пытайтесь открыть его).
Обеспечить выполнение контрактов вашегоМетод:
- Предварительные условия. Вызывающий гарантирует, что они верны до вызова метода.
- Постусловия. Callee гарантирует, что это правдаследующий вызов метода.
- Инвариантные условия. Callee гарантирует, что они всегда верны.
Бросьте исключение, если контракт нарушен.Затем выведите исключение, если произойдет что-то неожиданное.
Ваш код должен быть строгим дисциплинарным.