工作3個月,第一次加入純後臺的程式改造,程式中,業務流程是有n個確定的對數據檢測項,檢測項有個開關,開了就檢測blablabla,每個檢測項為一個類,內方法不是static。 在原程式中流程為:對所有檢測項目用if判斷其是否為打開,然後實例化,調用方法。這樣的代碼重覆挺多的,能有上500行了,除了各 ...
工作3個月,第一次加入純後臺的程式改造,程式中,業務流程是有n個確定的對數據檢測項,檢測項有個開關,開了就檢測blablabla,每個檢測項為一個類,內方法不是static。
在原程式中流程為:對所有檢測項目用if判斷其是否為打開,然後實例化,調用方法。這樣的代碼重覆挺多的,能有上500行了,除了各自實例化,剩下對返回信息的處理都是重覆的。
看著不爽,所以就手賤了,全部改掉了。
改之前:
if("1".equals(Check1Map.get("swich"))){
Check1 check1 = new Check1();
errorMessage = check1.Checked(args);
if(!"".equals(errorMessage) && rerrorMessage !=null){
outMessage.add(errorMessage);
}
}
if("1".equals(Check2Map.get("swich")) ){
Check2 check2 = new Check2();
errorMessage = check2.Checked(args);
if(!"".equals(errorMessage) && rerrorMessage !=null){
outMessage.add(errorMessage);
}
}
我是這樣改的,在從資料庫取出檢測項map時只取出開啟的檢測項,放到一個大的map中,用檢測項名稱迴圈,不再現場實例化,而是定義了一個static map 成員變數,
在其中放入實例化好的檢測項實例,給所有檢測項實現了一個介面,這樣通過迴圈取得的檢測名稱。具體代碼如下
成員變數類:
public class CheckedModel {
private static final Map<String, CheckedService> checkeds = new HashMap<String, CheckedService>(){
private static final long serialVersionUID = 1L; {
put("c1", new Checked1());
put("c2", new Checked2());
}
};
public Map<String, CheckedService> getCheckeds() {
return checkeds;
}
}
檢測流程代碼:
其中CHECKED_MODEL為成員變數 就是 上面checkeds;
for(String bh : openCheckMap.keySet()){
try {
Map<String, Object> checkMap = openCheckMap.get(bh);
errorMessage = CHECKED_MODEL.getCheckeds().get(bh).Checked(args);
if(!"".equals(errorMessage) && rerrorMessage !=null){
outMessage.add(errorMessage);
}
} catch (Exception e) {
logger.error("系統拋出異常信息:", e);
}
}
這麼做的原因一個是不喜歡用if一個一個判斷之後一個一個實例化的去做, 重覆代碼太多了。所以想用for迴圈來取代if。在調用檢測方法時用了下多態,方便使用吧算是。
然後選擇用static是喜歡把程式運行時的實例化操作提前到項目載入時,希望減少在檢測時的耗能。不知到這樣是不是能提升一些性能。
不知道這個樣的思路是否可行,是否還有其他的方法代替
if("1".equals(ToolUtil.getKeyOfMapToString(xmMap, "kqbs")) ){
//實例化A1處理類
A1ServiceImpl a1ServiceImpl = new A1ServiceImpl();
//調用檢測方法
returnMessageEntity = a1ServiceImpl.Checked(jdbcTemplate,state,jcxmBH,dbSessionId , confirm,xmMap, deptCode,doctorCode,patData, hospitalMap);
//更新全局變數狀態
state=returnMessageEntity.checkState;
//如果提示信息不為空,添加到集合中
if(!"".equals(returnMessageEntity.getCheckOutMessage()) && returnMessageEntity.getCheckOutMessage() !=null){
outMessage.append(returnMessageEntity.getCheckOutMessage() );
}
}
/**
* 項目編號: A7
* 項目名稱:行政許可權_切口手術預防用藥療程限制
* I,II類切口手術預防用抗菌藥療程(24小時)限定及48小時審核 --目前是所有手術都限定
*/
jcxmBH="A7";
//取得對應檢測項目信息
xmMap =(Map<String, String>) openSwichMap.get(jcxmBH);
//判斷檢測項目開啟標示: 1 開啟;0 關閉
if("1".equals(ToolUtil.getKeyOfMapToString(xmMap, "kqbs")) ){
//實例化A1處理類
A7ServiceImpl a7ServiceImpl = new A7ServiceImpl();
//調用檢測方法
returnMessageEntity = a7ServiceImpl.Checked( jdbcTemplate,state,jcxmBH,dbSessionId,confirm, xmMap,deptCode,doctorCode,patData, bzh, operationData ) ;
//預防用抗菌藥24小時-48小時申請審批,更新為已經使用,預判標識【confirm】為"save""all"時候,記錄
specOpera_kbn =returnMessageEntity.getSpecOpera_kbn();
//更新全局變數狀態
state=returnMessageEntity.checkState;
//如果提示信息不為空,添加到集合中
if(!"".equals(returnMessageEntity.getCheckOutMessage()) && returnMessageEntity.getCheckOutMessage() !=null){
outMessage.append(returnMessageEntity.getCheckOutMessage() );
}
}