过度检查与未来可扩展性权衡

时间:2013-08-12 19:30:18

标签: java design-patterns effective-java

我可以确定名为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”会使代码变得干净,但是我们有意外修改的风险。

2 个答案:

答案 0 :(得分:1)

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

  1. 撰写正确的 javadoc文档
  2. 编写适当的单元测试
  3. 设置CI环境
  4. 文档旨在供开发人员使用,但受压力的开发人员采用快速阅读技术,这会降低他们对细节的理解。

    如果您对代码的所需属性所有进行编码,则可以从客户端删除此类检查。但请注意,测试必须保持不变。虽然CI默认情况下确保所有正在运行的测试都通过,但它没有说明缺少测试。

    不幸的是,您无法强制所有必需的单元测试都已在CI过程中编写。您所能做的就是强制执行最低100%的代码覆盖率,以确保代码的最小次数。
    But the code won't be perfect, nevertheless.

    最佳做法是诚实地做你付出的代价。
    这意味着如果您编写的原型或应用程序不需要可靠,您就不应该关心这些问题!

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

    可靠性与其他任何功能一样:应该对其进行估算,支付和衡量。

答案 1 :(得分:0)

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

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

此外,如果代码在安装在400.000车辆中的嵌入式设备中运行,您可以添加额外的空检查,尽管您确定。你想避免回电那些设备来阻碍所有情况。

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