关闭

代码应该写的更简洁更优化

407人阅读 评论(0) 收藏 举报

 

背景

今天终于完成了实时监控模块数据导出功能的设计,本来只需要半天就可以解决的问题,让我来做足足做了两天,这样的效率已经很低了,写出的代码质量,用老大的话来说,那叫惨不忍睹,这里我还是好好反思一次。

分析一

导出这个功能在我刚进公司那段时间做过一次,是对历史数据的导出,当时因为历史数据和实时数据的内容大体相似,因此按照实时数据的做法来做,没有出现比较难做的内容。本次实时监控数据的导出功能与历史数据导出略有不同,但是我在做该模块时,遇到了比较大困难,究其原因是我没有对数据导出功能的本质有所了解。下面是历史数据导出功能的方法与实时监控数据导出功能的方法的源代码:

  1. 历史数据导出功能的方法
     
    1  
    2 //历史数据查询
    3 private Map<String, Object> getHistoryInfoDatas(int page, int rows,String enterpriseName,String createTime,String query, int isBackUp) throws Exception {
    4     // 瓶装查询条件sql
    5     StringBuffer querySql = new StringBuffer("status = ?");
    6     List<Object> objs = new ArrayList<Object>();
    7     objs.add(0);
    8     MenuElementPrivilege mep = this.getMenuElementPrivilege();
    9     if(enterpriseName != null && !"".equals(enterpriseName)){
    10       querySql.append(" and ").append("enterpriseEnglishName = ?");
    11       objs.add(enterpriseName);
    12       if(mep!=null&&mep.getMerData()!=null){
    13         if(mep.getMerData().contains(enterpriseName)){
    14           querySql.append(" and ").append("(enterpriseEnglishName = ?)");
    15           objs.add(enterpriseName);
    16         }else{
    17           querySql.append(" and ").append("(enterpriseEnglishName = ?)");
    18           objs.add("enterpriseEnglishName");
    19         }
    20       }
    21     }else{
    22       if(mep!=null&&mep.getMerData()!=null){
    23         StringBuffer str = new StringBuffer();
    24         String [] datas = mep.getMerData().split(",");
    25         for(int i = 0; i < datas.length; i++) {
    26           str.append("'").append(datas[i]).append("'");
    27           if(i!=datas.length-1)
    28             str.append(",");
    29         }
    30         querySql.append(" and ").append("(enterpriseEnglishName in ("+str.toString()+"))");
    31       }
    32     }
    33     if(null!=createTime&&!"".equals(createTime)){
    34       querySql.append(" and ");
    35       querySql.append("DATE_FORMAT(createTime,'%Y-%m-%d') = '");
    36       querySql.append(createTime);
    37       querySql.append("'");
    38     }
    39     if (query != null && !"".equals(query)) {
    40       querySql.append(" and ").append(" (code = ? or classes like ? or typeName like ? or medicineName like ? )");
    41       objs.add(query);
    42       objs.add("%"+query+"%");
    43       objs.add("%"+query+"%");
    44       objs.add("%"+query+"%");
    45  
    46     }
    47  
    48  
    49     if(isBackUp == 1){
    50       querySql.append(" and ").append(" isBackUp = 1 ");
    51       objs.add("%"+isBackUp+"%");
    52     }  else if(isBackUp == 0){
    53  
    54       querySql.append(" and ").append(" isBackUp = 0 ");
    55       objs.add("%"+isBackUp+"%");
    56     }
    57  
    58  
    59     // 查询总条数
    60     long count = HistoryInfo.count(HistoryInfo.class, querySql.toString(), objs.toArray());
    61     if (page == 0 && rows == 0) {
    62       page = 1;
    63       rows = (int) count;
    64     }
    65  
    66     // 根据条件查询数据集
    67     List<HistoryInfo> list = HistoryInfo.findAll(HistoryInfo.class,querySql.toString(), objs.toArray(), "createTime desc", rows, (page - 1) * rows);
    68     Map<String,Object> result = new HashMap<String,Object>();
    69     result.put("total",count);
    70     result.put("rows", list);
    71     return result;
    72   }
    73  
    74  
    75 //历史数据导出
    76 public View HistoryInfoExcel(int page , int rows,String enterpriseName,String createTime,String query,int isBackUp) throws Exception{
    77     Map<String,Object> result = this.getHistoryInfoDatas(page,rows, enterpriseName, createTime, query ,isBackUp);
    78     List<HistoryInfo> list = (List<HistoryInfo>) result.get("rows");
    79     MenuElementPrivilege mep = this.getMenuElementPrivilege();
    80     //long time = System.currentTimeMillis();
    81     //为统一Excel命名,改变获取当前时间的方式    edit by caojianglong 2013-4-25
    82     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    83     String time = sdf.format(new Date());
    84     this.getSession().setAttribute("time", time);
    85     historyInfoService.exportHistoryInfo(page,time,list,mep!=null?mep.getMerShow():null);
    86  
    87     return new JsonView("success:true");
    88   }
  1. 实时监控数据导出功能的方法
     
    1  
    2 //实时监控数据查询
    3 public View getAmountData(@Bind(prefix="query")MonitorQuery query,int page,int rows,String sort,String order) throws ActiveRecordException{
    4     query = checkQuery(query);
    5  
    6     List<Monitor> totalList = monitorService.getAmountMonitorList(query,0,0,sort,order);
    7     long count = totalList == null || totalList.isEmpty() ? 0 :totalList.size();
    8  
    9     //分页查询数据并计算计划达标率
    10     List<Monitor> list = monitorService.getAmountMonitorList(query,page,rows,sort,order);
    11     ListUtil.appendPlanTargetRate(list,false);
    12  
    13     //将数据封装为json发送到前台
    14     Map<String,Object> result = new HashMap<String,Object>();
    15     result.put("total", count);
    16     result.put("rows", list);
    17  
    18     return new JsonView(result);
    19   }
    20 //实时监控数据导出
    21 public View  exportExcel(String queryType,String code,String medicineName,String entpCode,int page,int rows,String sort,String order) throws Exception{
    22     //封装查询参数
    23     MonitorQuery query = new MonitorQuery();
    24     query.setCode("null".equals(code)?null:code);
    25     query.setEntpCode(entpCode);
    26     query.setMedicineName("null".equals(medicineName)?null:URLDecoder.decode(medicineName,"UTF-8"));
    27  
    28     //参数检查和授权检查
    29     query = checkQuery(query);
    30  
    31     List<Monitor> list = null;
    32     if("money".equals(queryType)){
    33       list = monitorService.getMoneyMonitorList(query,0,0,sort,order);
    34       ListUtil.appendPlanTargetRate(list,true);
    35     }else{
    36       list = monitorService.getAmountMonitorList(query,0,0,sort,order);
    37       ListUtil.appendPlanTargetRate(list,false);
    38     }
    39  
    40     MenuElementPrivilege mep = this.getMenuElementPrivilege();
    41  
    42     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    43     String time = sdf.format(new Date());
    44     this.getSession().setAttribute("time", time);
    45  
    46     monitorService.exportMonitor(page, time, list,mep!=null?mep.getMerShow():null,queryType);
    47     return new JsonView("success:true");
    48   }
    49  

通过观察会发现历史数据模块里历史数据查询为map类型,而实时监控数据查询为View类型。所以我错以为导出时调用的表格数据位map类型,面对一个查询结果为View类型的方法我就无所适从,后来老大提醒后才明白最终传入到导出方法里的为list类型,这才恍然大悟。 这说明在上一次完成历史数据导出功能时,我只是照猫画虎的做了一番,而没有真正理解该做法的真正意思。

分析二

对于能够重用的代码一定要想办法将其重用,这样不但会影响程序的效率,也会使程序读起来清晰明了

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25226次
    • 积分:608
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章分类