Троичные операторы имеют тенденцию вводить ошибки / дефекты?

StackOverflow https://stackoverflow.com/questions/1626231

Вопрос

В моем кабинете возникла дискуссия об использовании троичных операторов. У этого обсуждения есть две стороны.

Сторона 1) Тернарные операторы просты в написании и чтении, поэтому удобство - это чистая экономия средств.

Сторона 2) То, что троичные операторы трудно поддерживать, потому что они требуют избыточного оттока кода, если они когда-либо должны быть изменены, чтобы быть даже малейшим немного сложнее.

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

<Ч>

Моя теория состоит в том, что лучший код - это код, который можно легко изменять и адаптировать, и что чем меньше сложности требует изменение, тем меньше шансов на перерыв. Пример:

$id = $user->isRegistered() ? $user->id : null;

Хорошо, так что это полностью верно, но что происходит, когда код должен измениться, чтобы стать чем-то более сложным?

$id = null;
if ($user->isRegistered() || $user->hasEmail()) {
    $id = $user->id;
}

Любой здравомыслящий программист посмотрел бы на троицу и преобразовал бы в стандартный if / else. Однако это потребовало изменения в 4 строки по сравнению с начальным:

if ($user->isRegistered()) {
    $id = $user->id;
}

Что потребует изменения только в одну строку.

Это было полезно?

Решение

Я обнаружил, что, как только вы привыкнете к синтаксису, оба варианта будут одинаково удобочитаемы (при условии, что вы не выберете слишком много), и для меня это не проблема.

Что касается того, что более эффективно по времени, я собираюсь ответить на неприятный вопрос - почему вас это волнует? Любой из вариантов занимает менее 20 секунд для преобразования в эквивалентный оператор if.

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

Другие советы

Я бы остановился на операторе ternery в вашем примере.

   $id = ($user->isRegistered() ||  $user->hasEmail())? $user->id : null;

Пока единственная "ветвь" Чтобы определить, какое значение должно быть присвоено переменной, оператор ternery более читабелен, чем предложения if-else, поскольку он потенциально не дублирует выполняемую функцию (в данном случае - это код " $ id). = & Quot;)      Если логические условия становятся сложными, упростите их.

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;

Мне нравится использовать троичный оператор всякий раз, когда у меня есть однострочное выражение, значение которого зависит от соответствующего логического условия. Фактически, если мне нужно выбрать между присвоением переменной и выбрать между выражением 1 и выражением 2, я часто использую троичную форму.

Однако, если выражения имеют побочный эффект, я сразу же переписываю все это как выражение if (). Использование троичного оператора для управления потоком довольно запутанно для большинства людей.

Тройные операции имеют свое место; обычно это упрощает код при выполнении тривиальной задачи. Однако в какой-то момент вам может понадобиться переосмыслить свою стратегию, если условное утверждение становится слишком сложным. Это определяет, когда эта точка является , которая становится проблемой. Только опыт может помочь вам.

Итак, я не думаю, что есть одно "право" отвечайте, пока конечный результат является чистым, читаемым и обслуживаемым кодом. Дополнительные строки кода для оператора if даже не должны учитываться при принятии этого определения (поскольку число строк кода не обязательно коррелирует 1 к 1 со сложностью кода .)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top