當業務代碼的充斥着大量的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");
}
}
這樣就能主要關注業務代碼,而將異常邏輯集中處理。當然,實際開發中,異常情況很多,需要仔細設計各種異常。