项目开发中碰到的一些常见的不规范的代码
从事java EE开发4年多了,从2011年尾开始参与一个大型电子商务系统,一直做到现在。项目在2012年10月完成了验收,2012年11月开始转运维,巧的是自己跟另外一个同事被客户指定为长期固定运维人员。就这样开始了1年多了运维工作。虽说是运维,但我们不需要管理服务器,不需要管理数据库,做的工作就是修改上生产后项目出现的一些问题(处理用户报障),同时开发一些新的需求(开发新功能),以及不断的优化重构项目源码,处理一些原功能存在的严重性能问题,提炼或从新定义共用的业务API等。
下面列举一些我这1年多运维工作中碰到的一些常见的不规范的代码。(之前有整理过文档,所以现在写这个博文一些内容直接copy过来的)
一、存在警告的代码。
1、冗余转换。
2、集合类未使用泛型。
3、定义未使用的变量或方法。
4、import引入了过多的未用到的类。
二、其它不规范的代码
5、在spring容器中存在的bean却使用new方式来构建实例。
6、业务层捕获了异常却不抛出,导致事物无法回滚,而且异常没有抛出,但功能出错时,使用火狐的firebug插件也看不到错误信息,加大的代码的调式难度。
7、大量定义辅助性的vo类。(个人建议,开发业务功能时,尽可能使用pojo,封装数据或接收参数pojo搞不定的时候使用Map<String, Object>,而不用再定义一个java类,因为里面大量的字段跟pojo是重复的,大量的setter,getter操作也影响性能)
8、NullPointException,在对一个对象进行使用前,没有判断是否非空导致的空指针异常。
9、业务代码写到了controller层。(这样写不但降低了代码的可读性,而且如果controller中写了增、删、改的业务代码时也破坏了事物的完整性,一些对spring理解不深,对事物控制没什么概念的新手经常这样搞)
10、常量类的大量重复定义。(开发时可能各个开发人员很少去看别人的代码,如果项目经理没有统筹规范好的话,很容易导致开发人员自己定义常量自己用,而有些常量是整个系统可以共用的,大量的重复定义加大了维护的难度。)
11、在js中拼写HTML代码。(对于很多jQuery用的不熟的新手经常这样搞)
12、与金额有关的字段,很多被定义成了double类型,其实double是存在精度问题的,应该采用BigDecimal替换之。(运维期修改了很多这样的代码)
以上列举了12种常见的不规范代码,下面我贴一些代码举例说明。
1、冗余转换。
上图中因为List使用了泛型,下面的for循环中就不需要强制转型了。(当然转了也不会有错)
2、集合类未使用泛型。
上诉报警告的代码虽然也没错,但jdk1.5就推出了泛型,所以用集合类时应该养成使用泛型的习惯。
3、定义未使用的变量或方法。
上诉报警告的代码编译也不会错,但是既然一个变量定义了没有用到,就应该删掉。
多定义一个变量,应该就会多占用一点内存。
4、import引入了过多的未用到的类。
这个问题同样也不会引起编译错误,但没用到的类没必要引入进来。可通过按ctrl+shift+o来去除多余的import,也可通过设置eclipse,在保存java文件时自动删除这些多余的import,eclipse的设置方式如下图:
5、在spring容器中存在的bean却使用new方式来构建实例。
我见的最多的是使用在业务bean中注入dataSource,然后new 一个JdbcTemplate对象,其实JdbcTemplate对象也是在spring定义了的,所以直接注入JdbcTemplate对象即可。而且spring容器默认的bean的scope是single=true,即单实例,直接注入JdbcTemplate对象可以避免大量JdbcTemplate实例占用内存(虽然会被gc自动回收掉)。
如下图:
上图注入的是一个dataSource,其实可以直接注入JdbcTemplate对象的,因为JdbcTemplate对象也定义在了spring容器中,见下图:
所以前面的代码可修改为直接注入JdbcTemplate对象,修改后如下图:
6、业务层捕获了异常却不抛出。
直接打印了一下,写这样代码的开发人员明显是刚从学校出来的。
7、大量定义辅助性的vo类。
如上图代码,会员各种数据按业务需要分别存放在dealer表跟dealer_personal_info表,当视图层需要会员数据时,需要将这两个表的一些数据进行返回。一些开发人员首先想到的就是新建一个vo类,里面定义好视图层需要的所有字段,然后从数据库查询数据封装好这个vo类并进行返回。这样做其实对性能影响挺大的,特别当查询很多数据,在一个循环里大量的setter getter。让我来重构这个代码,首先我就会删掉DealerInfoVo.java这个类,然后将会员数据封装到一个Map<String, Object>中,然后返回给视图层使用。
修改后的代码如下图:
现在都流行“约定优于配置”,更应该采用Map的方式。
8、NullPointException,在对一个对象进行使用前,没有判断是否非空导致的空指针异常。
这个不举例了,有个1年开发经验的朋友都知道。
9、业务代码写到了controller层。
有开发经验的朋友都应该知道业务代码不能写在controller层,而要写到业务层或说应用层。
10、常量类的大量重复定义。
为避免大量重复的枚举常量定义,我的建议及现在的做法就是使用枚举类。首先把所有数据表字段有枚举值的字段定义一个枚举类,在开发时告知大家对于数据表枚举字段不允许定义常量,而要统一使用对应的枚举类。
以上是个人这些年的一些开发经验总结和见解,特同大家分享,欢迎指正,讨论。
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐