Возвращает False VS, повторяя ошибку

Я пытаюсь понять основную разницу между возвратом false из оператора и повторением ошибки, побуждающей пользователя исправить свою отправку.

Давайте возьмем следующую функцию, которая используется для получения URL-адреса Google Currency Convert API, и проанализируем еще 3 параметра, $amount, $from, $to. Я использую explode для получения числовых значений, возвращаемых API в пределах "".

function currency_convert($googleCurrencyApi, $amount, $from, $to) {

    $result = file_get_contents($googleCurrencyApi . $amount . $from . '=?' . $to);
    $expl = explode('"', $result);

    if ($expl[1] == '' || $expl[3] == '') {
        return false;
    } else {
        return array(
            $expl[1],
            $expl[3]
        );
    }
}

В чем преимущество возврата false, если утверждение верно, по сравнению с повторением конструктивного сообщения? Я вижу, что return false регулярно используется на многих форумах и т. д.

Заранее спасибо.


person keenProgrammer    schedule 09.02.2012    source источник
comment
Потому что вы будете смешивать свою логику и отображаемый код. Используйте логику, чтобы определить, что отправить пользователю. Используя ваш пример, если он проверен и в порядке, вы распечатываете, что все в порядке? Нет, вы продолжаете обработку. Если это не подтверждается, вы не можете обработать, поэтому вы говорите, что не можете продолжить.   -  person MetalFrog    schedule 09.02.2012
comment
Отличный вопрос. Хотя я давно перестал делать и то, и другое.   -  person Madara's Ghost    schedule 09.02.2012


Ответы (4)


Ни то, ни другое, мы в 2012 году, сгенерируйте исключение и обработайте его как хотите.

function currency_convert($googleCurrencyApi, $amount, $from, $to) {

    $result = file_get_contents($googleCurrencyApi . $amount . $from . '=?' . $to);
    $expl = explode('"', $result);

    if ($expl[1] == '' || $expl[3] == '') {
        throw new Exception('An error has occured. Describe the error here');
    }
    return array(
        $expl[1],
        $expl[3]
    );
}

Чем, когда вы вызываете функцию:

try { currency_convert($googleApi, $amount, $from, $to) }
catch (Exception $e) { /* Do whatever you want with $e */ }

Прочитайте об исключениях и блокировке try, catch здесь

Преимущества

  • Если его не обработать, скрипт остановится, быстро выявив, где проблема.
  • Если его обработать, его можно легко обработать так, как если бы произошло return false.
  • Исключение останавливает функцию, то есть оператор return никогда не прибудет.
  • Исключение может отображать конструктивное сообщение для пользователя, и разработчикам может быть полезно увидеть, в чем заключалась ошибка.
  • Исключения — это объекты, классы которых могут быть расширены, поэтому вы можете эффективно создавать множество типов ошибок и исключений, например, но не ограничиваясь ими: IllegalArgumentException, MathException, FileReadException, ReallyAwesomeException и затем обрабатывать каждый по-разному

    try { /* Code Here */ }
    catch (IllegalArgumentException $e) { echo 'Illegal Argument!'; }
    catch (Exception $e) { echo 'General Error! '. $e->getMessage(); }
    
person Madara's Ghost    schedule 09.02.2012

Нет никакого преимущества одного над другим, все зависит от того, как вы структурируете свой код. Вы можете вернуть false методу на стороне клиента, который отображает ошибку.

Все дело в том, что вы делаете с возвращаемым значением. Если false, отобразить «сбой», иначе «успех».

person Mob    schedule 09.02.2012

Почему? Так как:

  1. Повторное использование кодов может изменить это проще, и они могут изменить то, что нужно делать.
  2. Вы можете сделать и проверить проще, за один шаг.
  3. Повторение ошибки не будет конструктивным со стороны кода, только со стороны пользователя. Возврат false хорош для обоих.
person axiomer    schedule 09.02.2012

Функции/методы должны выводить что-либо только в том случае, если это уже их цель. Чтобы привести пример:

Плохой:

function showSomething($something) {
    $something = doSomething($something);
    echo $something;
}

function doSomething($something) {
    if (empty($something)) {
        echo 'ERROR!';
    }

    return $something;
}

Хорошо:

function showSomething($something) {
    $something = doSomething($something);
    if ($something === FALSE) {
        echo 'ERROR!';
    } else {
        echo $something;
    }
}

function doSomething($something) {
    if (empty($something)) {
        return FALSE;
    }

    return $something;
}
person FtDRbwLXw6    schedule 09.02.2012