我们通常会在业务逻辑中进行不必要的检查以避免失败。
EG。
1. public ObjectABC funcABC(){
ObjectABC obj = new ObjectABC;
..........
..........
//its never set to null here.
..........
return obj;
}
ObjectABC o = funABC();
if(o!=null){
//do something
}
如果我们确定它永远不会为空,为什么我们需要这个空检查? 这是一个好习惯吗?
2. int pplReached = funA(..,..,..);
int totalPpl = funB(..,..,..);
funA() just puts a few more restriction over result of funB().
Double percentage = (totalPpl==0||totalPpl<pplReached) ? 0.0 : pplReached/totalPpl;
我们需要'totalPpl<pplReached'
检查吗?
问题是:我们不是通过进行此类检查来吞下一些基本问题吗?通过进行这些检查可以避免理想地显示的问题。
推荐的方式是什么?
答案 0 :(得分:8)
想想你的观众。
时检查是值得的如果你上面的null
检查不属于这些,或者有一个更简单的机制可以做同样的事情,那就把它留下来。
更简单的机制通常包括
assert
导致代码提前失败,并传达意图而不要求您输入永远不会达到的错误处理代码且不会混淆代码覆盖率工具在这种情况下,我建议添加注释
public @Nonnull ObjectABC funcABC(){
将findbugs集成到您的构建过程中,并可能替换
if(o!=null){
//do something
}
与
assert o != null: "funcABC() should have allocated a new instance or failed."
我们不是通过进行此类检查来吞下一些基本问题吗?
根据经验,
assert
有助于仔细检查您的假设。如果您无法将断言汇集到您的代码中并快速告知哪些被侵犯,那么您的根本问题就是您没有快速的方法来针对代表性数据运行代码以解决问题。最后,design by contract是一种编程方法,许多人发现它对业务逻辑代码很有用。即使您无法说服您的团队采用特定的工具和实践,阅读DbC仍然可以帮助您推理并解释如何在代码库中强制执行重要的不变量。