Java代码整洁之道

什么是坏代码?

我们在做代码review的时候,通常会从这几个方面”挑刺“,一般出现了以下的问题,你的代码就是坏代码:

  • 过大的类:一个类做了太多的事情;
  • 依恋情节:一个类的实现大量引用另一个类的数据;
  • 过度设计:过多的抽象和代理;
  • 难于理解:命名杂乱,结构混乱,难于阅读和理解;
  • 过长的方法:函数体超过N行,实现了多个逻辑;
  • 过长的参数列:方法难于使用和理解;
  • 临时变量过多:临时变量不易于理解和抽取;
  • 重复代码:拷贝粘贴再修改的痕迹(提取公共逻辑);

好代码设计原则

好的代码应该遵循SOLID原则,SOLD原则如下:
Java代码整洁之道_第1张图片

Java代码整洁之道

本文将从命名整洁、包结构整洁、类整洁、函数整洁、注释整洁、异常整洁,共六个方面介绍Java代码的整洁之道,其他语言也可以参考;

命名整洁

常用的命名规范包括匈牙利命名法、驼峰命名法、帕斯卡命名法、下划线命名法;

在Java中,常用的命名规范如下:

  • 包名小写;
  • 类名帕斯卡;
  • 方法名驼峰;
  • 变量驼峰;
  • 枚举大写;
  • 常量大写;

其中,Java中包命名规范如下:
如果是公司项目,则按以下格式命名:
com.公司名.{业务线}.项目名.模块名

如果是个人项目,则按照以下格式命名:
priv.个人名.项目名.模块名

类命名时要使用名词或者名词结尾,同时避免无意义名词,比如Data、Object等;

对于函数的命名,一般要使用动词开头,比如 addXXX();
同时一般要避免使用get/set开头;

对于变量的命名,要注意长度适中,一般8-20个字母为宜;
同时要避免使用单字母变量,比如 i、j等(即使在for循环中)

包结构整洁

在一个Java项目中,同一个包下面的类要是内聚的,同时具备关联性和相互依赖性;

不同包下面的类一般是无关的、并且没有相互依赖性;

类整洁

在Java中,类的整洁是最难整理的,因为涉及到整个项目的设计;

总的来说,有几条原则吧:

  • 单一职责,即一个类只干一件事;
  • 功能复用优先组合,而非集成;
  • 隔离稳定的部分和变化的部分;

其中第三条可能比较满意理解,我解释一下什么叫做隔离改变?
主要是要做到几件事情:
1、接口隔离原则:一个类对另一个类的依赖应该建立在最小接口上;
2、迪米特法则:一个对象应当对其他对象尽可能少的了解;
常用措施比如:降低成员访问权限,final类, priviate属性方法等;属性获取通过get/set方法,而不是直接object.property;
3、开闭原则:通过新增代码实现新需求,而不是修改已有代码;
4、依赖倒置:依赖抽象,不依赖具体的实现,细节是多变的,抽象是稳定的;

函数整洁

在Java中函数的整洁也是比较难以做到的,为此我们要养成良好的意识;

  • 一个函数只做一件事;
  • 函数的拆分要保持在同一抽象层级;
  • 函数实现要避免隐藏逻辑,函数作用和说明一致;
  • 使用异常代替返回码;

解释一下,什么叫做函数拆分要保持同一抽象层级?如下图:
Java代码整洁之道_第2张图片

再解释一下,如何使用异常代替返回码,如下:
Java代码整洁之道_第3张图片
其实,使用异常代替返回码也可以看成是遵守了一个函数只做一件事的原则,因为异常处理就是一件事情;

注释整洁

注释这块没啥好说的,只需要注意以下几点:

  • 使用正确注释,避免无用废话注释;
  • 注释格式整个团队统一;

个人觉得,代码写得好,易读性高,注释可以少些点;

异常整洁

在Java中要正确的处理异常,要注意以下几点:

  • 分层处理链式传播;
  • 正确使用受检异常与非受检异常;

分层处理,链式传播是指各个层的异常在向上层传递时要带上本层异常的相关信息,方便上层处理;

受检异常和非受检异常关系图如下:
Java代码整洁之道_第4张图片
在处理异常时有几点经验,仅供参考:
1、不要忽略异常,try/catch中要进行处理;
2、不要使用异常来控制流程;
3、不要捕获Throwable类,在应用中不应捕获Throwable类,Error是Throwable类的子类,当应用抛出Errors的时候,一般都是不可恢复的情况;
4、要在方法定义分句中定义具体的异常。这种写法,表示该方法会抛出所有受检查异常,这不是一个良好的编程习惯。在这种情况下,我们最好抛出足够具体的异常,以便调用者进行合适的捕获和处理,如下:

    public void testMethod() throws Exception {
        ....
    }

5、异常处理的成本非常高,所以我们一般仅在异常情况下使用异常,在可恢复的异常情况下使用异常;
6、尽量使用标准异常;
7、正确包装异常类型,比如客户端代码都是对SQLException无能为力的,不要犹豫,把它转换为一个unchecked exception;
8、避免在finally语句块中抛出异常。finally代码块也可能再次抛出异常。如果同时抛出两个异常,则第一个异常的调用栈会丢失。在finally语句块中最好只做打印错误信息或者关闭资源等操作,避免在finally语句块中再次抛出异常。

一些工具

1、CODELF 命名辅助工具;
2、Sonar / findbugs 代码质量检测工具;

特别感谢

特别感谢美团王超老师分享的整洁代码,本文主体内容参考自其讲解,特别感谢!本文仅供学习使用!

你可能感兴趣的:(基本功,#,杂项,#,Java)