троичный или что-то подобное для выбора функции? - PullRequest
0 голосов
/ 28 июля 2011

Я работаю с автоматизированным тестированием Drupal на PHP.Это класс, в котором меня интересуют два метода: pass() и fail().Каждый из них выдает отдельную строку на странице результатов, указывающую, прошла ли конкретная операция или нет, например,

if ( $value == "expected_value" ) {
  $this->pass("Looking for expected value");
} else {
  $this->fail("Looking for expected value");
}

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

$function = ($value == "expected_value") ? "pass" : "fail" ;
$this->$function("Looking for expected value.");

Это самый лаконичный и элегантный способ, которым я могу сформулировать эту логику?Я попытался

$this->(($value == "expected_value") ? "pass" : "fail")("Looking for expected value.");

Но я получил ошибку разбора.Есть ли способ свести его к одной строке, как троичное назначение?

Редактировать Я понимаю, что многословие не является структурой if-else, но я повторяю одно и то же сообщение дважды,Мне кажется, что должен быть способ выразить это, когда я объявляю сообщение только один раз.Конечно, я мог бы поместить это в переменную, но это заняло бы дополнительное пространство, и я также передал это дважды.

Вот еще один способ сформулировать мой вопрос: есть ли способ, которым я могу определить эту логику, выражая только Looking for expected value один раз?

Ответы [ 2 ]

8 голосов
/ 28 июля 2011

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

Тем не менее

($value == $expectedValue) ? $this->pass() : $this->fail();
1 голос
/ 28 июля 2011

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

call_user_func(
  array($this,$value == "expected_value"?'pass':'fail'),
  "Looking for expected value."
)
...