【问题标题】:ternary or something similar for choosing function?三元或类似的选择功能?
【发布时间】:2011-10-15 10:00:12
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您似乎试图通过语法而不是通过设计来简洁。与其尝试压缩代码,不如创建一个可以验证数据并自动调用通过/失败的简单类。尝试从应用程序特定代码中获取“通用”代码。
  • 我同意。无论如何,使用 KingCrunch 的答案中演示的三元,但是这样做是为了替换函数名本身?沿着这条路只有疯狂的谎言。当您在两年内打开它并试图弄清楚到底发生了什么时,好处(我向您保证完全被感知,而不是实际)不值得一秒钟的困惑。

标签: php function ternary-operator


【解决方案1】:

我认为您的原始代码在可读性方面是最好的,但如果您想要更短的代码(尽管不一定优雅),您可以这样做:

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

【讨论】:

  • 我喜欢这个答案,因为它只定义了一次消息:)
  • 是的,这比将消息放入变量更容易。 </sarcasm>
  • 请注意,您可以将函数分配给变量 (php.net/manual/en/functions.variable-functions.php)。我有别名 GD 图像功能,但是我从未尝试过使用 $this-> $foo= $this->bar('baz'); 的任何东西。想法是分配通过或失败函数,而不是在测试中调用它,然后调用变量
【解决方案2】:

我会使用通常的if-elseif-statement,因为它最明显、最易读并且(也许只有我自己)不是“冗长”的,它只是一个if-elseif-statement。

然而

($value == $expectedValue) ? $this->pass() : $this->fail();

【讨论】:

  • 我喜欢它,但我仍然需要输入两次相同的通过/失败消息,或者在前一行的变量中声明它。
  • 我觉得冗长的不是if-elseif,而是我重复了两次相同的消息字符串。在我看来,应该有一种方法只写一次论点。
  • 为什么不管通过还是失败,消息都是一样的?
  • @barfoon 因为 DrupalWebTestCase 类的工作方式。它的输出是一个测试用例表。每一行都是通过或失败,并且只有一条消息:“正在寻找按钮...”“响应为 200...”等。该行突出显示红色或绿色。当测试失败并且该行为红色时(即使内置测试显然打破了恕我直言),它可以防止您给出混合消息“成功执行 X”。即使这是一个愚蠢但真实的例子,为了学习,我想知道表达这一点的其他方式。
  • 但这条信息毫无意义(至少对我而言):如果测试已经通过或失败,则测试不再“寻找价值”。它要么是“通过的值 xy”,要么是“意外的值”。 “寻找价值”听起来更像是一条消息,您应该在测试运行之前返回/输出。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多