Троичные операторы имеют тенденцию вводить ошибки / дефекты?
-
06-07-2019 - |
Вопрос
В моем кабинете возникла дискуссия об использовании троичных операторов. У этого обсуждения есть две стороны.
Сторона 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 со сложностью кода .) р>