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

原创 2013年12月03日 17:57:41

 

背景

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

分析一

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

  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类型,这才恍然大悟。 这说明在上一次完成历史数据导出功能时,我只是照猫画虎的做了一番,而没有真正理解该做法的真正意思。

分析二

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

如何让你的代码变得清晰整洁

摘要:烂代码不一定是问题,只要它们没有出错,没有人会对它嗤之以鼻。但不幸的是,它们没被发现的概率太小了。错误会被发现。需要新的功能,新系统发布了。现在你不得不面对这堆恐怖的代码,试着去清理它们。 ...
  • fuyuwei2015
  • fuyuwei2015
  • 2015年06月18日 21:22
  • 1194

如何写出优雅的java代码

一、不要使用魔法数字,尽量定义枚举、常量、宏:  我常常见到表示各种状态的数字,0,1,2....,我真的不知道这表示什么含义,如果  你在不在文档中说明的话,这个东东过几天连你自己都不知道个一二...
  • u011700281
  • u011700281
  • 2014年03月20日 15:35
  • 2506

C#代码精简优化技巧总结

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 在我们写代码的时候可以使用一些...
  • yangli_sky
  • yangli_sky
  • 2014年01月17日 12:01
  • 1580

用新语法写更简洁的ABAP代码

相比其他语言,ABAP可能有很多特有的长处,但简洁从来就不是它的优点之一。 不像其他语言通过Library提供常用功能,ABAP大量使用内置声明(Built-In Statement) 来完善自身,...
  • zhongguomao
  • zhongguomao
  • 2017年04月13日 16:49
  • 1025

38条PHP优化代码!让你的程序更简洁!

其实,很多在刚刚入行做程序员的同学,往往会进入到一个误区,就是不达目的决不罢休!在通常情况下,新手程序员的代码写的会比较繁琐,整体来说就是因为对于代码的不熟悉!所以,在你成为真正大牛的时候再回头看看之...
  • wocong6078
  • wocong6078
  • 2017年07月18日 10:27
  • 309

38条PHP优化代码!让你的程序更简洁!

1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4;2.echo的效率高于print,因为echo没有返回值,print返回一个整型;3.在循环之前设置循环的最大次数,而非在在循环中;4....
  • u010265663
  • u010265663
  • 2017年12月19日 18:04
  • 29

XRecyclerView实现RecyclerView下拉刷新上来加载 自己做了部分修改,使代码更简洁易用

首先感谢 开源作者 /** * Created by jianghejie on 15/11/26. */ 的无私奉献  我是在他的基础上做的修改 以前一直是用的XListV...
  • liuwei522176950
  • liuwei522176950
  • 2016年03月24日 10:50
  • 9469

Java编程思想(02)——重构让代码更简洁(二)

尽量简洁 重构前 f ( flag == 1 ){ return true; } else{ return false; } 重构后 return flag == ...
  • ljtyzhr
  • ljtyzhr
  • 2015年02月27日 21:54
  • 609

Java编程思想(04)——重构让代码更简洁(四)

使用类替换类型代码 重构前 public class LabelComparator implements Comparator, Serializable { private stat...
  • ljtyzhr
  • ljtyzhr
  • 2015年02月28日 23:15
  • 432

Spring Boot集成lombok让代码更简洁

转:http://www.jianshu.com/p/dd5349ac8473 lombok的威力简化代码 IntelliJ IDEA安装lombok插件1.菜单栏File > Se...
  • zmken497300
  • zmken497300
  • 2017年08月09日 15:14
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码应该写的更简洁更优化
举报原因:
原因补充:

(最多只允许输入30个字)