?: 、null-safety 和 Elvis 运算符的有效性?
Effectiveness of ?: , null-safety and Elvis operator?
我指的是 Null-Safety in Kotlin:
我的一个同事总是这样写:
bob ?: return
bob.department ?: return
bob.department.head ?: return
bob.department.head.name()
可读性是他的论点。这对我来说不是很喜欢 Kotlin,而且过于复杂。我当然更喜欢:
bob?.department?.head?.name()
一些arguments/docs/links不使用upper方式会很有帮助。
我想知道使用upper方式有什么缺点吗?
另外,我可以想象一些编译器优化不会很好,做上面的方法?
编辑:
根据 SVN 的历史记载:
if (bob != null) {
if (bob.department != null) {
if (bob.department.head != null) bob.department.head.name()
}
}
您的版本含义不同:如果任何相关值是 null
,您的版本计算结果为 null
,而不计算表达式的其余部分,而您同事的 return
立即不执行函数的其余部分。
(当然,如果这就是函数的结尾,效果可能是一样的;我们不能在没有看到一些上下文的情况下判断。)
所以选择哪一个取决于 null
值 是否应该 中止后面的一切。
但总的来说,根据我的经验,您的版本更为常见。它还有两个优点:它更简洁(当所有其他条件都相同时,这是一件好事™恕我直言),重复更少(因此遵循 DRY);并且当有人后来添加额外的行时不太可能引起意外,所以他们不必回溯并找出他们没有被执行的原因。
至于可读性,像您这样的行是 Kotlin 中的常见习语,因此开发人员确实应该发现它们具有足够的可读性。事实上,能够避免像您同事那样的长链测试(Java 中需要)是 ?.
安全调用运算符的主要优点之一!
我指的是 Null-Safety in Kotlin:
我的一个同事总是这样写:
bob ?: return
bob.department ?: return
bob.department.head ?: return
bob.department.head.name()
可读性是他的论点。这对我来说不是很喜欢 Kotlin,而且过于复杂。我当然更喜欢:
bob?.department?.head?.name()
一些arguments/docs/links不使用upper方式会很有帮助。
我想知道使用upper方式有什么缺点吗? 另外,我可以想象一些编译器优化不会很好,做上面的方法?
编辑: 根据 SVN 的历史记载:
if (bob != null) {
if (bob.department != null) {
if (bob.department.head != null) bob.department.head.name()
}
}
您的版本含义不同:如果任何相关值是 null
,您的版本计算结果为 null
,而不计算表达式的其余部分,而您同事的 return
立即不执行函数的其余部分。
(当然,如果这就是函数的结尾,效果可能是一样的;我们不能在没有看到一些上下文的情况下判断。)
所以选择哪一个取决于 null
值 是否应该 中止后面的一切。
但总的来说,根据我的经验,您的版本更为常见。它还有两个优点:它更简洁(当所有其他条件都相同时,这是一件好事™恕我直言),重复更少(因此遵循 DRY);并且当有人后来添加额外的行时不太可能引起意外,所以他们不必回溯并找出他们没有被执行的原因。
至于可读性,像您这样的行是 Kotlin 中的常见习语,因此开发人员确实应该发现它们具有足够的可读性。事实上,能够避免像您同事那样的长链测试(Java 中需要)是 ?.
安全调用运算符的主要优点之一!