- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我与一位同事讨论了是否应该将null或空集合作为方法参数传递。我的感觉是,这将导致异常,因为它破坏了方法的“契约”,即使它不一定破坏方法的执行。这也具有“快速失败”的优势。我的同事认为,这会导致使用“非空/非空”检查乱扔代码,即使这并不重要。
我可以理解他的观点,但是允许使用null或空参数会使我感到不安。延迟故障可能会掩盖问题的真正原因!
让我们举两个具体的例子:
1)给定我们有一个具有overlays(Interval)方法的Interval类,如果将null用作参数传递该怎么办?我的感觉是,我们应该抛出一个IllegalArgumentException来让调用者知道某事可能是错误的,但是我的同事觉得返回false就足够了,因为在他使用它的情况下,第二个Interval是否是完全无关紧要的。是否为null(最重要的是它们是否重叠)。
2)给定类似fetchByIds(Collection ids)的方法,如果提供了空集合,应该怎么办?我想再次警告调用者发生了异常情况,但是我的同事只收到一个空列表就可以了,因为他再也不在乎是否有ID。
被调用代码的责任在哪里结束?在这两种情况下,调用代码都不介意参数为null还是为空,但是在其他情况下,这可能指向可能的错误。一种方法应该只保证只要遵守前提条件就不会中断,还是应该尝试找出潜在的错误调用?
编辑:我看到了很多很好的答案,并且大多数人倾向于说将其定义为契约(Contract)/在文档中并坚持使用,但是我希望您对何时允许和何时不允许(如果有的话)发表意见。在特定示例中,您会怎么做?鉴于90%的使用情况,不验证输入内容就可以了,您是否仍将验证是否可以清除其余10%的错误,还是宁愿解决出现的错误并避免不必要的null/empty检查?
最佳答案
您的案例是可以很好地映射到现实世界的两种不同情况:
1) Given we have an Interval class with an overlaps(Interval) method, what should happen if a null is passed as the parameter? My feeling is that we should throw an IllegalArgumentException to let the caller know something is probably wrong, but my co-worker feels returning false is sufficient...
null
就像问“鸭子之间有什么区别?”,由于缺少信息,您无法回答。您不能平底锅说“没有区别”,因为您不知道丢失的信息是另一只鸭子(没有区别)还是水牛(有很大区别)。如果契约(Contract)规定调用者必须提供一些要比较的内容,并且调用者没有坚持到底,那么这就是抛出异常的一个很好的理由。
2) Given a method like fetchByIds(Collection ids), what should happen if an empty collection is provided?
null
),则通过告诉妻子那里没有购物 list 来引发异常(exception),她可以决定是否真的要告诉您它在厨房的 table 上还是忘记整个事情。
Should a method only guarantee that it won't break as long as the preconditions are adhered to, or should it try to identify potential buggy invocations as well?
null
参数的情况下返回特定结果,则由调用方确定它知道正在传递
null
并能够处理结果。
false
返回
overlaps(null)
),则始终可以选择记录以下事实:您看到可疑的事物以及可用的任何其他信息(堆栈跟踪等)。这使您可以选择带外处理,以便程序继续运行。
关于parameters - 我们应该允许空/空参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768860/
目前我正在尝试创建一个 Web 部署包。所以我在我的项目的根目录中添加了一个 parameters.xml 并指定了一些自定义参数。 我发现我的很多参数都部分相同。所以我想做某种参数引用。寻找这个,我
如何设置我的 Symfony 2 项目以使用 parameters.yml 而不是 parameters.ini? 在 Controller 中,我可以像这样从 parameters.ini 中获取变
有什么建议说明为什么此 AWS CloudFormation 不断回滚吗? { "Description" : "Single Instance", "Resources" : {
PARAMETERS: p_1 TYPE i, p_2 TYPE i. 因此在初始屏幕中,我看到了 2 个文本框,每个参数一个。 如果我填写其中一个,但不按回车键,然后我在第二个上调用 F4 帮助,我
我需要存储 Parameter由 Build() 返回作为 Parameter (因为我将参数存储在一个数组中,另一种方法就是为每个参数数量复制粘贴相同的类太多,因为 c# 没有可变参数泛型)。 问题
我正在为我的 CS 类(class)做作业,它使用了 const,我对何时使用它们感到有点困惑。 这3个函数有什么区别? int const function(parameters) int fu
在 xgboost 的文档中,我读到: base_score [default=0.5] : the initial prediction score of all instances, global
我正在创建一个新的 REST 服务。 向 REST 服务传递参数的标准是什么。在 Java 的不同 REST 实现中,您可以将参数配置为路径的一部分或请求参数。例如, 路径参数 http://www.
在我的程序中,我需要验证传递给程序的参数是一个整数,所以我创建了这个小函数来处理用户键入“1st”而不是“1”的情况。 问题是它根本不起作用。我尝试调试,我只能告诉你参数是 12,long 是 2。(
谁能告诉我如何使用存储在 &rest 指定值中的参数。 我已经阅读了很多,似乎作者只知道如何列出所有参数。 (defun test (a &rest b) b) 这很高兴看到,但并不是很有用。 到目前
我使用 git 有一段时间了,但大多数时候我更喜欢与 Intelij IDEA 的集成。现在,为了扩展我对系统的知识和理解,我决定更多地使用命令行。我观察到的是有两种类型的参数: --paramete
我正在用 RAML 编写一些 REST 文档,但我被卡住了。 我的问题: - 我有一个用于搜索的 GET 请求,它可以采用参数“id”或( 独占或 )“引用”。拥有 只有其中之一 是必须的。 我知道怎
我定义了一个这样的 Action : /secure/listaAnnunci.action /login.jsp 我可以从 Action 内部访问参数吗?谢谢 最佳答案 您需要实现 S
我有一个 TeamCity 8.0.3 项目,其中包含多个配置,其中有一个通用参数(定义为项目参数):targetServerIP .这些配置之一是“一键部署”,它通过使用快照依赖项启动其他配置。我已
try{ Class.forName("com.mysql.jdbc.Driver"); mycon = DriverManager.getConnec
我在实际的 javascript 项目中遇到了一个非常奇怪的情况。我创建了一个自定义事件并将数组放入该事件 $.publish("merilon/TablesLoaded", getTables())
在使用参数数组进行插入/更新期间,可以忽略一个/一些特定行的一个/一些参数。 我提供了一个简单的例子。想象一下,我们有一个包含 3 列的表:X、Y 和 Z。我们想在 block 中执行更新(如果缺少某
如何编写接受未定义参数的函数?我想它可以像那样工作: void foo(void undefined_param) { if(typeof(undefined_param) == int) {
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PDO版本问题 Invalid parameter number: no
Jenkins 管道作业如下所示: 部分 Jenkinsfile(我们使用脚本化管道)是: properties([parameters([string(defaultValue: "", descr
我是一名优秀的程序员,十分优秀!