Design patterns 三元运算符是否倾向于错误/缺陷注入?

Design patterns 三元运算符是否倾向于错误/缺陷注入?,design-patterns,formatting,ternary-operator,Design Patterns,Formatting,Ternary Operator,关于三元运算符的使用,我的办公室里进行了一次讨论。这一讨论有两个方面 第1方面)三值运算符易于写入和读取,因此方便是一种净成本节约 第二方面)三值运算符很难维护,因为如果它们需要修改为甚至稍微复杂一点,就需要额外的代码搅动 额外的书呆子点,如果你能引用顶级机构在这方面所做的任何实际研究。。。我很想看看这方面的硬数据 我的理论是,最好的代码是可以轻松更改和适应的代码,更改所需的复杂性越低,中断的机会就越小。例如: $id = $user->isRegistered() ? $user-&g

关于三元运算符的使用,我的办公室里进行了一次讨论。这一讨论有两个方面

第1方面)三值运算符易于写入和读取,因此方便是一种净成本节约

第二方面)三值运算符很难维护,因为如果它们需要修改为甚至稍微复杂一点,就需要额外的代码搅动

额外的书呆子点,如果你能引用顶级机构在这方面所做的任何实际研究。。。我很想看看这方面的硬数据


我的理论是,最好的代码是可以轻松更改和适应的代码,更改所需的复杂性越低,中断的机会就越小。例如:

$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;
}

这只需要一行更改。

在您的示例中,我坚持使用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;

我发现,一旦你习惯了语法,这两个选项的可读性都是一样的(只要你都不过火),所以这对我来说不是问题

至于哪个更省时,我将用一个令人讨厌的问题来回答——你为什么在意?任何一个选项都需要不到20秒的时间来转换为等效的if语句


就我个人而言,当我想办法缩短编程时间时,这是一种拖延。当我专注于完成工作时,我的工作效果最好,让小的可读性细节通过经验自行解决。

每当我有一行表达式,其中值取决于适当的布尔条件时,我喜欢使用三元运算符。实际上,如果我需要在赋值给变量之间进行选择,并且可以在表达式1和表达式2之间进行选择,那么我通常使用三元


但是,如果表达式有副作用,那么我将立即将整个内容重写为if()语句。使用三元运算符进行流量控制对大多数人来说是相当混乱的。

三元运算符有其位置;通常是在执行琐碎任务时简化代码。然而,在某些时候,如果条件语句变得太复杂,您可能需要重新考虑您的策略。它决定了什么时候这一点成为挑战。只有经验才能指引你


因此,我认为只要最终结果是干净、可读和可维护的代码,就没有一个“正确”的答案。在进行此项确定时,甚至不应考虑
if
语句的额外代码行数(因为代码行数不一定与代码的复杂性一一对应)。

无论如何,我认为尝试用PHP编写漂亮的代码已经是一场失败的战斗。不要参与花费超过任何可能的好处的讨论。为了清晰起见,我将把
$isReg | | hasEmail
分组在parens中。显然,我的示例很简单。ass真正的痛苦在于需要添加then或else子句。如果它们都做相同的事情(设置$id的值),那么无论条件多么复杂,使用三元运算符仍然更简单,因为它将复杂性隔离在它所属的区域(在条件中)不是通过在每个嵌套的if或elseif子句中重复“$id=”部分来混淆问题……但是,1个缺陷的成本是否超过了使用三元组所节省的时间?也就是说,他们的门槛可能是什么,使三元值?我会接受这个答案,但不知道是否有人可以找到任何硬数据。没有问题-我总是喜欢考虑问题的目的之前,我真的试图用硬数据回答它;P