我的办公室已经讨论过使用三元运算符。这个讨论有两个方面。

方面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 语句的额外代码行(因为代码行数不一定与代码的复杂性一对一相关。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top