Language agnostic 只要不影响可读性,在程序流中使用简单的三元大小写可以吗?

Language agnostic 只要不影响可读性,在程序流中使用简单的三元大小写可以吗?,language-agnostic,coding-style,ternary-operator,Language Agnostic,Coding Style,Ternary Operator,在阅读了和之后,我发现三元运算符的简单用法被普遍接受,因为它们不会损害可读性。我还得出结论,当您不想让三元块的一侧返回null时,它完全是一种浪费。。然而,我在重构我的网站时遇到了这种情况,这让我很恼火: if ($success) { $database->commit(); } else { $database->rollback(); } 我将其重构为 $success ? $database->commit() : $database->roll

在阅读了和之后,我发现三元运算符的简单用法被普遍接受,因为它们不会损害可读性。我还得出结论,当您不想让三元块的一侧返回null时,它完全是一种浪费。。然而,我在重构我的网站时遇到了这种情况,这让我很恼火:

if ($success) {
    $database->commit();
} else {
    $database->rollback();
}
我将其重构为

$success ? $database->commit() : $database->rollback();

我对它很满意。。但我内心深处的某种东西让我来到这里寻求帮助。除外,你认为这是一个好的用例吗?我想知道这是否是一个好的使用,因为我从来没有这样做过,或者因为它真的是一个坏的做法?这对我来说似乎并不难,但对其他人来说,这似乎很难理解吗?这取决于语言吗。。如在C、C++、或java中,这会有多大的错误吗?< P/> < P>我会更倾向于使用它,以防这两个动作互相排斥和/或相反(但彼此相关),例如:

$success ? go_up() : go_down();
对于两个不相关的操作,我不太倾向于使用它,原因是其中一个分支将来需要扩展的可能性更高。如果是这种情况,您将再次需要将其重写为
If-else
语句。假设你有:

$success ? do_abc() : do_xyz();
如果在某个时刻您决定第一个分支也需要
do_def()
,那么您需要再次将整个过程重写为
If-else
语句

然而,三元运算符更常用的用法是:

$var = $success ? UP : DOWN;

这样,您将它作为表达式而不是语句进行计算。

不,它不正常。您正在将看起来像语句的内容转换为看起来像表达式的内容。事实上,如果
commit()
rollback()
返回
void
,这至少不会在Java中编译(不确定提到的其他代码)


如果您想要一个单行程序,您应该在
$database
对象上创建另一个方法,例如
$database->endTransaction($success)
,它在内部执行
If
语句。

真正的问题是,“三元形式的可读性是否比If形式强?”。我想不是。但是这是一个风格的问题,而不是功能的问题。

我很确定,如果
commit()
rollback()
方法返回类型是
void
或没有公共超类型,它将不会在Java中编译。至于为什么让语句看起来像表达式是错误的,那就更微妙了。表达式通常不应该有副作用-它不是人们所期望的,它使控制流不清楚。我非常喜欢这个答案,因为它从我的特定服务调用中删除了重复的三元代码,并将其推到一个集中的位置。我肯定在实施这一点,谢谢:)我误解了你说的第一句话,但我现在明白你的意思了。我并没有意识到Java的这一点,我想了想,我仍然可能不会在内部执行if语句,但我会继续在该函数中使用三元运算符,就像这样:return$success$this->commit():$this->rollback();这一切都是为了在保持简洁的同时保持清晰。“表达一般不应该有副作用——只是它不是人们所期望的”——这根本不是语言不可知论。一个可能的领头羊:如果你的语言有
++
--
操作符,那么表达式可能会有副作用,或者至少是那些甚至有模糊现实期望的人。如果语言没有这些运算符或等效运算符,那么通过省略它们,它就在某种程度上防止了表达式中的副作用,因此也许值得使用该约束进行编程。@abelito:例如,Python没有
++
--
。Python中没有严格的规则规定表达式不能有副作用,它们可以而且有时会有副作用。但作为一种风格,Python库倾向于定义变异函数返回
None
,只是为了促使用户将任何具有副作用的语句作为独立语句编写。经典的例子是
mylist.sort()
修改列表,不返回任何内容,因此不太可能将其用作更大语句的一部分
sorted(mylist)
返回一些内容:列表的副本,原始的未修改。这是一种有用的风格。是的,这种用法肯定有一个小的利基,我完全同意最终需要扩展。我只是想到了提交本身由于任何原因失败的情况,我需要捕获它并在屏幕上显示给用户。。好吧,突然之间,我也需要记录这一成功并将其归还。我喜欢你的使用指南。Ramon提出了一个非常好的替代方案,建议将此逻辑从服务调用中推出,并引入服务本身,以供重用。然而,我认为你的回答的前半部分解释了一些关于以这种方式使用三元运算符的坚实指导方针。我仍然不相信在这种语言中没有语言的位置。考虑到三元表达式需要两个函数具有返回值,即使调用代码忽略它们。如果函数后来被修改为不返回值,比如说因为返回值到处都被忽略,那么您的三元表达式将需要修改——以适应它已经忽略的返回值的缺失。“如果”语句更能适应变化。