Это синтаксически правильно? - PullRequest
1 голос
/ 25 июля 2011

Я заметил этот фрагмент кода при использовании миграций базы данных CodeIgniter:

$this->migrations->verbose AND print "Creating table '{$table}'...";

$verbose - это значение конфигурации.

У нас в офисе была дискуссия о том, действительно ли этодействительный и читаемый код.Он в основном заменяет необходимость в операторе IF, поскольку выполняет 2-ю часть условия, если первая часть истинна.На самом деле мне это очень нравится, но парни в офисе считают, что это случайность, что это работает и что это будет более читабельным:

if( $this->migrations->verbose ) print "Creating table '{$table}'...";

Как вы думаете?

Ответы [ 7 ]

2 голосов
/ 25 июля 2011

Это называется «оценкой короткого замыкания», и этот метод часто используется в сценариях оболочки - например:

rm thing_to_delete || exit 1

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

1 голос
/ 25 июля 2011

Итак, хотя два фрагмента имеют одинаковый эффект, я бы решительно проголосовал за второй (if (…) print ...).Код - это как общение с другими программистами, так и общение с машиной.Если бы идиомы языка (и, следовательно, программисты, использующие его) должны были использовать оценку короткого замыкания для таких ситуаций, то, вероятно, было бы хорошо.Тем не менее, PHP обычно не использует оценку короткого замыкания в выражениях - большинство программистов PHP (и вообще-то, программистов в целом) здесь делают двойной дубль.

Код для наименьшего удивления и код вашего точного значения.Если это условный тест, который должен выполняться только в том случае, если некоторая переменная имеет значение true, сделайте его реальным условным тестом с использованием конструкции условного теста, то есть здесь if.

1 голос
/ 25 июля 2011

"Это синтаксически правильно?"

Конечно, это так :) В противном случае PHP выдаст вам ошибку разбора.Код работает, а также является семантически правильным PHP.Это очень похоже на использование: $v = $v || "default value"; Чтобы присвоить значение по умолчанию для $v, если его еще нет.

1 голос
/ 25 июля 2011

Это абсолютно верно. Является ли это читабельным или нет, является чисто субъективным. :)

1 голос
/ 25 июля 2011

Это допустимо, но точно не читается.Я не думаю, что попытка ввести синтаксические конструкции в стиле Perl в PHP, даже если они действительно работают, является хорошей идеей.

0 голосов
/ 25 июля 2011

Если читаемость - это сходство кода с описанием на естественном языке того, что код делает на самом деле, то использование if более читабельно.

0 голосов
/ 25 июля 2011

Логические операторы являются короткими замыканиями и операндами оценки слева направо, поэтому этот код делает точно , что версия с оператором if.

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

...