gpt4 book ai didi

parameters - 我们应该允许空/空参数吗?

转载 作者:行者123 更新时间:2023-12-04 03:09:54 30 4
gpt4 key购买 nike

最近,我与一位同事讨论了是否应该将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?



这类似于您的妻子告诉您从冰箱中取出购物 list ,然后拿起冰箱上的所有物品。如果列表上没有任何内容(空集合),则您一无所有回到家中,而您已经完全按照要求完成了。如果您去冰箱却找不到购物 list ( 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?



就像其他人所说的那样,该方法应保证它会起作用,但是其文档说它会起作用。如果契约(Contract)规定该方法将在存在 null参数的情况下返回特定结果,则由调用方确定它知道正在传递 null并能够处理结果。

程序在存在合理但可疑数据的情​​况下应如何表现取决于很多事情,例如,程序继续运行的重要性或继续处理此类数据是否会对其他任何事情产生不利影响。这是您(开发人员)根据您的判断逐案做出的决定。任何想知道在每种情况下都应该始终是一种方法的人还没有足够仔细地研究问题。

如果您选择不引发异常(例如,将 false返回 overlaps(null)),则始终可以选择记录以下事实:您看到可疑的事物以及可用的任何其他信息(堆栈跟踪等)。这使您可以选择带外处理,以便程序继续运行。

关于parameters - 我们应该允许空/空参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3768860/

30 4 0