Троичные операторы имеют тенденцию вводить ошибки / дефекты? - PullRequest
0 голосов
/ 26 октября 2009

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

Сторона 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;
}

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

Ответы [ 4 ]

6 голосов
/ 26 октября 2009

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

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

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

3 голосов
/ 26 октября 2009

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

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

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

   bool $isReg    = $user->isRegistered(),
        $hasEmail = $user->hasEmail();
   $id = ($isReg || $hasEmail)?  $user->id : null;
1 голос
/ 26 октября 2009

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

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

0 голосов
/ 26 октября 2009

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

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

...