对于职场新人,其编码习惯往往比较随意,所写出来的代码可读性实在是难以恭维,今天Manager对我所写的代码进行了一次漫长的Code Reviewer,发现了非常多的问题,先总结如下,也好勉励自己,慢慢码畜路上也能写出优秀的代码。
1. 注释、注释、注释
我想这是中国式程序员常见的问题吧,大都很少写注释,不过对于在公司需要实际运行、或者上线的代码,写注释就非常有必要了,结合中国式国情,至少能够保证:每个类有功能及作者信息(一是能够发现每个类的功能是否单一问题,二是出现问题也能快速追踪),复杂函数需要有注释
2. 关于函数返回值
在Java代码中,通常有两种结束函数的方式,一种是return语句,另一种是抛出异常,一种较好的设计方法是使用return返回正确的结果,通过抛出异常返回错误的结果。上层代码可以通过异常发现底层代码的错误,并做相应的处理。
3. 关于日志
通常情况下,非最顶层代码不要抛出大于debug级别的日志,所有的日志应该由顶层代码完成,如实现一个SDK,是不应该打日志的(至少不应该有大于debug级别的日志),因为SDK是提供给其它程序调用的。在抛出大于debug级别的日志时,可以先判断日志级别在打日志,这样可以提高程序运行时的效率。示例如下:
if (logger.isEnabledFor(Level.FATAL)) {
forcedLog(logger, Level.FATAL, message);
}
4. 关于异常
一直觉得Java异常是一件非常烦人的事情,但Java异常机制的设计却是非常优秀的,前面提到,可以使用抛出异常使得函数出现错误时返回,然后上层代码通过不同的异常决定下一步应该怎么进行。总的来说,异常的使用应该合理,当前层次能够处理的就处理,无法处理的就抛给上层,不要简单的通过Exception将所有的异常都拦截下来,或者简单的调用ex.printStackTrace()打印错误堆栈,对于正式项目来说,ex.printStackTrace()是不允许出现在代码中的,在出现异常的地方,应该记录日志,或者抛出新的异常。
5. finally关键字的使用
对于释放资源相关的操作,如conn.close()等操作需要放在finally里面完成,如果不是,当close()前面的代码出现异常,可能根本就执行不到close()方法,这样可能导致连接其实没有关闭,从而影响JVM对无效对象的回收,从而造成对内存的浪费。
6. 关于数据库
首先应该确认项目是否需要事务操作。如果需要使用到事务,应该设置
conn.setAutoCommit(false),从而关闭自动提交SQL语句,然后按照事务指定的方式提交SQL语句。其次对于SQL语句,不要出现“*”这样的关键字,应该明确指定应该使用的字段,即使是所有字段都需要使用。如selct *以及select count(*)这样的方式就非常不好,可以使用count(primary_key)代替count(*)。
7. 类中成员变量声明是均明确初始化。
8. 对每一个函数的参数值做合法性验证。
9. 对每一个实体类实现hashCode()和toString()方法。
10. 开发之前设定整个项目环境的编码,如UTF-8就是一个非常好的选择。
2012.9.12添加
单个方法应避免多个返回点
尽量简化if-else的编写,多个if语句能够合成的尽量合成为一个if语句
方法的参数能够使用final的尽量加上final标识
总的来说就是要:减少写代码的随意性,提高代码的可控性。
暂时就这么多了,如您有更好的习惯,请您一定要分享给我。