工作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() );
}
}