什么是坏代码?
我们在做代码review的时候,通常会从这几个方面”挑刺“,一般出现了以下的问题,你的代码就是坏代码:
- 过大的类:一个类做了太多的事情;
- 依恋情节:一个类的实现大量引用另一个类的数据;
- 过度设计:过多的抽象和代理;
- 难于理解:命名杂乱,结构混乱,难于阅读和理解;
- 过长的方法:函数体超过N行,实现了多个逻辑;
- 过长的参数列:方法难于使用和理解;
- 临时变量过多:临时变量不易于理解和抽取;
- 重复代码:拷贝粘贴再修改的痕迹(提取公共逻辑);
好代码设计原则
好的代码应该遵循SOLID原则,SOLD原则如下:
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中要正确的处理异常,要注意以下几点:
- 分层处理链式传播;
- 正确使用受检异常与非受检异常;
分层处理,链式传播是指各个层的异常在向上层传递时要带上本层异常的相关信息,方便上层处理;
受检异常和非受检异常关系图如下:
在处理异常时有几点经验,仅供参考:
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 代码质量检测工具;
特别感谢
特别感谢美团王超老师分享的整洁代码,本文主体内容参考自其讲解,特别感谢!本文仅供学习使用!
我的视频课
下面是我录制的一些视频课,欢迎大家围观~
《彻底搞定JVM》
JVM是Java中重要的也是较难理解的内容;
面试者对JVM的了解程度某种程度上反映了面试者技术深度,所以JVM也是面试时经常考察的内容;
本课程从JVM运行流程、数据运行时区域组成部分、类加载机制、垃圾回收机制、内存模型、常见面试题讲解等角度出发,帮你彻底搞定JVM,拿下心仪Offer;
《Android性能优化参考》
本课程包含了Android中的App启动优化、UI优化、内存优化、图片优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。
性能优化作为Android高级开发的必备技能,也是大厂面试必考的题目,是体现一个人技术深度最好的试金石。
《面试之排序算法》
排序算法是我们面试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插入排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和二路并归排序。每种算法都详细介绍了核心思想、详细步骤、时间复杂度和代码实现,希望帮助大家深入理解排序算法,搞定面试!
《Android HyBrid App开发实战》
本课程为Android HyBrid App开发实战课程,由浅入深,从三种App的历史和特点开始,介绍了Android WebView的使用、Java和JS交互的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最后通过一个网上商城的实战综合全部内容,让同学们掌握并深入理解Android HyBrid App开发。
《AI导论》
介绍人工智能AI的诞生历史和到现在为止的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经网络结构搜索 NAS、生成对抗网络 GAN等;最后对AI发展做出展望。
本课程属于导论课程,旨在帮助同学们从宏观层面把握AI,建立AI的知识体系。
《Java注解精讲》
本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使用和自定义,注解的源码和架构分析;
本课程语言简单凝练,视频短小精悍,让你一次彻底搞懂Java注解!
《Java反射精讲》
反射是Java中重要的也是较难理解的内容;
本课程从反射的定义、作用、原理和使用出发,全方位帮你彻底搞定反射;