当业务代码的充斥着大量的null检查时,我真的感到很奔溃,我的业务逻辑真的就只有几行而已。下面的caller方法包含主要的业务逻辑。
private String getDevId(String id){
String ret = queryDevIdFromDB(id);
if (Objects.isNull(ret)) {
return null;
}
return ret;
}
private String queryDevIp(String devId){
String ret = queryDevIpFromDB(id);
if (Objects.isNull(ret)) {
return null;
}
return ret;
}
public long caller(String id) {
//input check
String devId = getDevId(id);
if (Objects.isNull(devInfo)){
Log.error("cannot find this dev: {}", id);
return null;
}
String ip = queryDevIp(devId);
if (Objects.isNull(ip)) {
Log.error("cannot find ip by devId: {}", devId);
}
//do something using this ip
return convertIpToLong(ip);
}
上述实例代码主要目的就是为了根据一个id查询设备的ip,但是充斥着大量的null检查,几乎就是C这种面向过程的编码,很影响阅读和维护。
既然java作为一种面向对象的高级语言,提供了异常机制,我们可以这样来设计这几个方法。
private String getDevId(String id){
String ret = queryDevIdFromDB(id);
if (Objects.isNull(ret)) {
//运行时异常
throw MyRTException("cannot find devId by id: " + id);
}
return ret;
}
private String queryDevIp(String devId){
String ret = queryDevIpFromDB(id);
if (Objects.isNull(ret)) {
throw MyRTException("cannot find ip by devId: " + devId);
}
return ret;
}
public long caller(String id) throw MyException {
//ignore input check
try {
String devId = getDevId(id);
String ip = queryDevIp(devId);
//do something using this ip
return convertIpToLong(ip);
} catch (MyRTException mrte) {
LOG.error("get ip failed: ", mrte);
throws new MyException("get ip failed");
}
}
这样就能主要关注业务代码,而将异常逻辑集中处理。当然,实际开发中,异常情况很多,需要仔细设计各种异常。