0

我可以确定名为 returnlist() 的“我的代码”永远不会返回 null。因此,当我在增强的 for 循环中循环时,我不做任何空指针检查。但是,从维护的角度来看,这似乎不是一个好的做法,因为将来有人可能会无意中修改代码库,或者有人会覆盖这个调用,而被覆盖的函数可能不够谨慎,无法返回空集合。

   public class ExtendedForLoop {

    public List<Integer> returnList() {
        // compute.
        if list == null ? Collections.emptyCollections : list;
    }

    public static void main(String args[]) {
        for (Integer i : returnList()) { 
            System.out.println(i);
        }
}

因此,使问题具有通用性,该问题旨在了解在何处绘制权衡线的最佳实践。我完全理解这种情况没有明确的规则,只是寻求最佳实践。

  1. 在自己编写的代码中添加过多的检查会增加混乱,但可以确保其免受未来修改的影响。

  2. 减少检查,因为“你知道它不会返回 null”使代码干净,但我们面临意外修改的风险。

4

2 回答 2

1

如果您关心代码演变的这一方面,您应该:

  1. 编写正确的javadoc 文档
  2. 编写适当的单元测试
  3. 设置 CI 环境

文档旨在供开发人员使用,但处于压力下的开发人员采用快速阅读技术会降低他们对细节的理解。

如果您编写一个断言代码的所有必需属性的测试,您可以从客户端中删除此类检查。但是,请注意必须保留测试。虽然 CI 默认情况下会确保所有正在运行的测试都通过,但它没有说明缺少测试。

不幸的是,您无法强制要求所有必需的单元测试都已在 CI 过程中编写。您所能做的就是强制执行100% 的最低代码覆盖率,以确保对代码的审查次数最少
但是代码不会是完美的,尽管如此。

最好的做法是诚实地做你得到报酬的事情。
这意味着,如果您正在编写一个不需要可靠的原型或应用程序,您不应该关心这些问题!

相反,如果您正在编写(比如说)手术机器人的控制器,您应该确保至少 100% 的测试覆盖率,以及完全更新的文档(并且仍然准备好造成一些死亡)。

可靠性与其他任何特性一样:应该被估计、支付和衡量。

于 2013-08-13T14:22:04.917 回答
0

这就是 javadoc 的用途:
只需添加:

/**
* @return the list, or an empty List. Never returns null!
*/
public List<Integer> returnList()

此外,如果代码在安装在 400.000 辆汽车中的嵌入式设备中运行,您可以额外进行空检查,尽管您可以确定。您希望避免在所有情况下都回调该设备。

如果它在一台服务器上运行,您可以依赖正确的实现。

于 2013-08-12T19:38:31.770 回答