ins*_*ect 3 java error-handling error-checking
我们通常会在业务逻辑中进行不必要的检查以避免失败.
例如.
1. public ObjectABC funcABC(){
ObjectABC obj = new ObjectABC;
..........
..........
//its never set to null here.
..........
return obj;
}
ObjectABC o = funABC();
if(o!=null){
//do something
}
Run Code Online (Sandbox Code Playgroud)
如果我们确定它永远不会为null,为什么我们需要这个null检查?这是一个好习惯吗?
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;
Run Code Online (Sandbox Code Playgroud)
我们需要'totalPpl<pplReached'检查吗?
问题是:我们不是通过进行此类检查来吞下一些基本问题吗?通过进行这些检查可以避免理想地显示的问题.
推荐的方式是什么?
想想你的观众.检查是值得的
如果null上面的检查不属于这些,或者有一个更简单的机制可以做同样的事情,那么就把它留下来.
更简单的机制通常包括,
assert导致代码提前失败,并传达意图而不要求您输入永远不会达到的错误处理代码而不会混淆代码覆盖工具在这种情况下,我建议添加注释
public @Nonnull ObjectABC funcABC(){
Run Code Online (Sandbox Code Playgroud)
将findbugs集成到您的构建过程中,并可能替换
if(o!=null){
//do something
}
Run Code Online (Sandbox Code Playgroud)
同
assert o != null: "funcABC() should have allocated a new instance or failed."
Run Code Online (Sandbox Code Playgroud)
我们不是通过这样的检查吞下一些基本问题吗?
根据经验,
asserts有助于仔细检查您的假设.如果您无法将断言汇集到您的代码中并快速告知哪些被侵犯,那么您的根本问题在于您没有快速的方法来针对代表性数据运行代码以解决问题.最后,按合同设计是一种编程方法,许多人发现它对业务逻辑代码很有用.即使您无法说服您的团队采用特定的工具和实践,阅读DbC仍然可以帮助您推理并解释如何在代码库中强制执行重要的不变量.
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |