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

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

分析二

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

相关文章推荐

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

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

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

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

正则表达式,让代码更简洁

正则表达式——古老而又强大的文本处理工具。仅用一段简短的表达式语句,就能快速地实现一个复杂的业务逻辑。掌握正则表达式,让你的开发效率有一个质的飞跃。 正则表达式经常被用于字段或任意字符串的校验,...

Spring Boot集成lombok让代码更简洁

转:http://www.jianshu.com/p/dd5349ac8473 lombok的威力简化代码 IntelliJ IDEA安装lombok插件1.菜单栏File > Se...

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

首先感谢 开源作者 /** * Created by jianghejie on 15/11/26. */ 的无私奉献  我是在他的基础上做的修改 以前一直是用的XListV...

代码简洁之道:使代码更完美

  • 2011年08月21日 10:57
  • 432KB
  • 下载

kotlin-for-android简介 (让你的Android代码更简洁)

Kotlin是众多基于JVM的语言之一,它一开始是作为android 开发中java语言的可能的代替者出现的。java是世界上使用最多的语言之一,而伴随着其他语言的发展使得程序员编程越来越容易,...

android开发之&万能Adapter,让你的代码更简洁

今天给大家分享一个万能adapter,自认为特别好用,哈哈! 直接上代码 public class TagBaseAdapter extends BaseAdapter { private ...

依赖注入——让iOS代码更简洁

依赖注入可以通过初始化方法(或构造函数)传递所需要的参数,或者通过属性(setter)传递,依赖注入使代码更简洁易读,更容易维护...

360防窃听比上次写的更简洁方便使用

思路:点击按钮,开启一个服务,在服务里直接调用打电话“10086”,在服务中监听电话状态,通话状态用遮挡物遮住,挂断则消失并停止该服务,如果想盖住360的防窃听,可以延迟0.8s在把遮盖物显示出来,就...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:代码应该写的更简洁更优化
举报原因:
原因补充:

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