“Talk is cheap. Show me the code”相信百分之九十的程序员都听过,如果说有比这句更流行的,应该只有Hello world了。我觉得一份好的代码可以体现程序员很多的优点,而如果经常接手他人的代码,那么更能体会到一份整洁清晰的代码对后来者来说就是雪中送炭,最近读了《代码整洁之道》和《阿里巴巴Java编码规范》顺带花9.9去考了一下阿里规范的认证,就想稍微整理了一些常见且可以显著提高可读性的代码规则。
代码是程序员之间沟通的工具
用代码实现需求,只是万里长征走完了第一步,必须让代码表达自己的设计思想。试想一下,你负责的功能被另外一个同事接手,如果你的代码结构清晰、注释合理,他就不用频繁的询问代码疑点,不用打断你的工作。编写代码的时候,应该考虑到大家的阅读感受,减少阅读障碍,为整个团队创造代码,而不是需要他人做阅读理解一样才能理解你的逻辑。
(一)遵守规范,保持干净、简洁
主要体现在遵守团队制定的规范,比如每个包文件的命名格式;还有统一公共包的使用,比如团队提供了公共类,就不要再去使用其他框架提供的Util工具类(比如CollectUtils,常用的框架就提供了好几个)。很多新手程序员,看到不喜欢的规范就另起炉灶,需要某些工具类也不询问老司机公共库有没有,直接引入自己熟悉的库,可能造成兼容性或者其他问题。
(二)命名的规范
常见的需要注意的命名包括:字段、变量、方法名及参数
// 获取地址
private String getDiZhi();
//修改密码
private void modifyPassword(String password1 ,String password2)
规范的应该这样写:
// 手机号 mobileNo比phone更精确
String mobileNo= “13421800409”;
// 避免英文拼音混杂
private String getAddress();
// 参数的命名
private void modifyPassword(String oldPassowrd,String newPassword)
(三)减少if/else嵌套
过度的if嵌套,可读性极差,哪怕是原作者,时间一长肯定也是一脸问号。
对于if/else嵌套,我们更推荐使用位语句提高可读性
public boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
if (userId != null && StringUtils.isNotBlank(newPassword)
&& SpringUtils.isNotBlank(oldPassword)) {
User user = getUserById(userId);
if(user != null) {
if(user.getPassword().equals(oldPassword) {
return updatePassword(userId, newPassword)
}
}
}
return false;
}
转换成卫语句以后的代码如下:
Public Boolean modifyPassword(Integer userId, String oldPassword, String newPassword) {
if (userId == null || StringUtils.isBlank(newPassword) || StringUtils.isBlank(oldPassword)) {
return false;
}
User user = getUserById(userId);
if(user == null) {
return false;
}
if(!user.getPassword().equals(oldPassword) {
return false;
}
return updatePassword(userId, newPassword);
}
(四)抽离try/catch,抽取超长方法
大家有没有见过一个超长的方法,从头到尾被一个try/catch照顾着?这种不负责的写法相信大家或多或少都遇到,其实并非每行代码都会抛出错误,只要将会抛出错误的业务放在一个独立的方法即可;同时如果一个方法太长,即使没有try/catch,我们也将该业务抽取的更细一点提高可读性
private void doSomething() {
try {
//20行 第一步处理A
......
//20行 第二步处理B
......
//20行 第三步处理C
......
} catch (Exception e) {
logger.error(e);
}
}
===================after======================
private void doSomething() {
//第一步处理A
doSomething1();
//第一步处理B
doSomething2();
//第一步处理C
doSomething3();
}
private void doSomething1(){}
private void doSomething2(){}
private void doSomething3(){
try{
} catch (Exception e) {
logger.error(e);
}
}
(五)如果一个方法参数过多,可以考虑使用对象接收参数;
最常见的实践就是,根据条件查询列表,我们都会封装一个查询对象接收查询条件,而不会方法提供若干个参数接收,同理我们自己写的方法如果参数过多也应该这样实现
网友评论