【发布时间】:2018-10-30 03:22:43
【问题描述】:
我已经阅读了很多类似问题的答案以及一些教程,但没有一个能解决我的主要困惑。我是本地 Java 编码员,但我也使用 Swift 编程。
我为什么要使用可选项而不是空值?
我读到这样可以减少空值检查和错误,但这些都是必要的,或者通过干净的编程很容易避免。
我也读过它,所以所有引用都成功(https://softwareengineering.stackexchange.com/a/309137/227611 和val length = text?.length)。但我认为这是一件坏事或用词不当。如果我调用长度函数,我希望它包含一个长度。如果没有,代码应该就在那里处理它,而不是继续。
我错过了什么?
【问题讨论】:
-
我不知道它如何应用于 Java/kotlin,但是在 Swift 中,如果您将一个值声明为“可选”,那么开发人员会更加重视如何决定处理这些值——比如打开它们或检查它们,以及编译器级别的检查。 Java 和 ObjC 中的许多问题归结为“假设”值的状态,这会导致运行时崩溃。因此,可选是使开发人员更加了解潜在风险的语言方式。 Optionals 还向外界提供了一个契约,让人们知道一个值可能没有被初始化
-
@MadProgrammer 有效的推理,而不是微不足道的。但是这不能通过明确的文档来解决吗? IE:如果允许变量为空,则在文档中指定为空。如果它再次为空,或者在它应该发生的时候你没有处理空,那就是一个错误。
-
“文档明确” ???? ...对不起,但我看到了太多与现实相矛盾的文档。通过使用可选项,您正在提供“自我记录代码”。一个 API 为什么要故意在这个主题上含糊其辞,因为开发人员还没有想到要提及(是的,你一直都看到这一点),或者 API 足够抽象以至于不知道一个值是否可以为空。
-
"explicit with documentation" 你总是希望编译器为你做尽可能多的工作。人类并不完美。我们依靠这些工具来捕捉我们的错误。在编译期间捕获它们比在运行时(或者当我们最终开始阅读文档时......)要好得多。如果您不必阅读文档即可了解 API 的合同,那么 API 不是更有用吗?我完全支持可靠而详细的文档,但我更支持没有隐藏陷阱的简单 API。
-
这个问题不适用于 Kotlin。 Kotlin 通常使用的是 explicitly 可空类型、explicitly 非空类型和空安全运算符,而不是可选类型。尽管 Swift 可选类型和 Kotlin 可空类型的语法非常相似,但它们本质上是不同的。
标签: swift kotlin null optional