三元运算符是否会出现错误/缺陷注入?
-
06-07-2019 - |
题
我的办公室已经讨论过使用三元运算符。这个讨论有两个方面。
方面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
语句的额外代码行(因为代码行数不一定与代码的复杂性一对一相关。)