GOOGLE ADS

четверг, 12 мая 2022 г.

Несколько возвращаемых значений для указания успеха/неудачи.

Мне интересно получить отзывы об этой технике, которую я откуда-то взял.

Я использую это, когда функция может либо выполниться успешно, либо завершиться ошибкой, но вы хотели бы получить больше информации о том, почему она не удалась. Стандартным способом сделать то же самое была бы обработка исключений, но я часто нахожу это немного чрезмерным для такого рода вещей, плюс PHP4 не предлагает этого.

По сути, метод включает в себя возврат true в случае успеха и что- то, что соответствует false в случае неудачи. Вот пример, чтобы показать, что я имею в виду:

define ('DUPLICATE_USERNAME', false);
define ('DATABASE_ERROR', 0);
define ('INSUFFICIENT_DETAILS', 0.0);
define ('OK', true);
function createUser($username) {
// create the user and return the appropriate constant from the above
}

Прелесть этого в том, что в вашем вызывающем коде, если вам все равно, ПОЧЕМУ создание пользователя не удалось, вы можете написать простой и читаемый код:

if (createUser('fred')) {
// yay, it worked!
} else {
// aww, it didn't work.
}

Если вы особенно хотите проверить, почему это не сработало (для ведения журнала, отображения пользователю или чего-то еще), используйте сравнение идентификаторов с ===

$status = createUser('fred');
if ($status) {
// yay, it worked!
} else if ($status === DUPLICATE_USERNAME) {
// tell the user about it and get them to try again.
} else {
// aww, it didn't work. log it and show a generic error message? whatever.
}

На мой взгляд, преимущества этого заключаются в том, что это нормальное ожидание, что успешное выполнение такой функции вернет true, а неудача вернет false.

Недостатком является то, что вы можете иметь только 7 "error" return values: false, 0, 0.0, "0", null, "", and (object) null.если вы забудете использовать проверку личности, вы можете неправильно выполнить свою программу. Кто-то еще сказал мне, что использование таких констант, как, enumгде все они приравниваются к false, является "ick".

Итак, переформулируем вопрос: насколько приемлема такая практика? Вы бы порекомендовали другой способ добиться того же результата?


Решение проблемы

Я согласен с другими, которые заявили, что это немного на стороне WTFy. Если это четко задокументированная функциональность, то это не проблема, но я думаю, что было бы безопаснее выбрать альтернативный путь возврата 0 для успеха и целых чисел для кодов ошибок. Если вам не нравится эта идея или идея глобальной переменной последней ошибки, рассмотрите возможность переопределения вашей функции как:

function createUser($username, &$error)

Затем вы можете использовать:

if (createUser('fred', $error)) {
echo 'success';
}
else {
echo $error;
}

Внутри createUser просто заполните $error любой ошибкой, с которой вы столкнулись, и она будет доступна за пределами области действия функции благодаря ссылке.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...