Немає абсолютно ніяких причин для повернення true
успіху, якщо ви не повернетеся false
до невдачі. Як повинен виглядати код клієнта?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
У такому випадку абоненту в будь-якому випадку потрібен блок пробування, але тоді він може краще написати:
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
.
Загалом, є три способи проектування несправних режимів.
- Повернути справжнє / хибне
- Використовуйте
void
, киньте (перевірено) виняток
- повернути проміжний результат результату .
Повернення true
/false
Це використовується в деяких старих, в основному, API стилів. Мінуси - це очевидність, ви поняття не маєте, що пішло не так. 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
. Ви очікуєте, що завантаження файлу завершиться, а коли воно не відбудеться, його виняткове. Але абонент змушений керувати цим режимом відмови, і ви можете повернути Виняток, який належним чином описує, яка помилка виникла.