Нет абсолютно никаких причин возвращаться true
в случае успеха, если вы не вернетесь false
в случае неудачи. Как должен выглядеть код клиента?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
В этом случае вызывающему в любом случае нужен блок try-catch, но тогда он может лучше написать:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Таким образом, true
возвращаемое значение совершенно не имеет значения для вызывающей стороны. Так что просто продолжайте метод void
.
В общем, есть три способа создания режимов сбоев.
- Верните true / false
- Использовать
void
, выбрасывать (проверено) исключение
- вернуть промежуточный результат объекта.
Возврат true
/false
Это используется в некоторых старых API, в основном в стиле c. Недостатки - obviuos, вы понятия не имеете, что пошло не так. PHP делает это довольно часто, что приводит к такому коду:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
В многопоточных контекстах это еще хуже.
Бросить (проверено) исключения
Это хороший способ сделать это. В некоторые моменты вы можете ожидать сбой. Java делает это с помощью сокетов. Основным предположением является то, что вызов должен быть успешным, но все знают, что некоторые операции могут завершиться неудачей. Разъемы подключения среди них. Таким образом, вызывающий абонент вынужден справиться с ошибкой. это хороший дизайн, потому что он гарантирует, что вызывающая сторона действительно обрабатывает сбой, и дает вызывающему абоненту элегантный способ справиться с ошибкой.
Возвращаемый результат объекта
Это еще один хороший способ справиться с этим. Его часто используют для разбора или просто вещей, которые необходимо проверить.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Хорошая, чистая логика для звонящего.
Существует немного споров, когда использовать второй случай, а когда использовать третий. Некоторые люди считают, что исключения должны быть исключительными, и что вы не должны проектировать с учетом возможных исключений, и в большинстве случаев будете использовать третьи варианты. Это здорово. Но мы проверили исключения в Java, поэтому я не вижу причин не использовать их. Я использую проверенные исключения, когда основное предположение состоит в том, что вызов должен прерваться (как при использовании сокета), но возможен сбой, и я использую третий вариант, когда очень неясный, должен ли вызов прерваться (как при проверке данных). Но есть разные мнения по этому поводу.
В вашем случае я бы пошел с void
+ Exception
. Вы ожидаете, что загрузка файла завершится, а когда это произойдет, будет исключительной. Но вызывающая сторона вынуждена обрабатывать этот режим сбоя, и вы можете вернуть исключение, которое правильно описывает, какая ошибка произошла.