Java代码整洁之道
什么是坏代码?
我们在做代码review的时候,通常会从这⼏个⽅⾯”挑刺“,⼀般出现了以下的问题,你的代码就是坏代码:过⼤的类:⼀个类做了太多的事情;
依恋情节:⼀个类的实现⼤量引⽤另⼀个类的数据;
过度设计:过多的抽象和代理;
难于理解:命名杂乱,结构混乱,难于阅读和理解;
过长的⽅法:函数体超过N⾏,实现了多个逻辑;
自学java从哪里开始过长的参数列:⽅法难于使⽤和理解;
临时变量过多:临时变量不易于理解和抽取;
重复代码:拷贝粘贴再修改的痕迹(提取公共逻辑);
好代码设计原则
好的代码应该遵循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、要在⽅法定义分句中定义具体的异常。这种写法,表⽰该⽅法会抛出所有受检查异常,这不是⼀个良好的编程习惯。在这种情况下,我们最好抛出⾜够具体的异常,以便调⽤者进⾏合适的捕获和处理,如下:
5、异常处理的成本⾮常⾼,所以我们⼀般仅在异常情况下使⽤异常,在可恢复的异常情况下使⽤异常;
6、尽量使⽤标准异常;
7、正确包装异常类型,⽐如客户端代码都是对SQLException⽆能为⼒的,不要犹豫,把它转换为⼀个unchecked exception;
8、避免在finally语句块中抛出异常。finally代码块也可能再次抛出异常。如果同时抛出两个异常,则第⼀个异常的调⽤栈会丢失。在finally语句块中最好只做打印错误信息或者关闭资源等操作,避免在finally语句块中再次抛出异常。
⼀些⼯具
1、CODELF 命名辅助⼯具;
2、Sonar / findbugs 代码质量检测⼯具;
特别感谢
特别感谢美团王超⽼师分享的整洁代码,本⽂主体内容参考⾃其讲解,特别感谢!本⽂仅供学习使⽤!
我的视频课
下⾯是我录制的⼀些视频课,欢迎⼤家围观~
JVM是Java中重要的也是较难理解的内容;
⾯试者对JVM的了解程度某种程度上反映了⾯试者技术深度,所以JVM也是⾯试时经常考察的内容;
本课程从JVM运⾏流程、数据运⾏时区域组成部分、类加载机制、垃圾回收机制、内存模型、常见⾯试题讲解等⾓度出发,帮你彻底搞定JVM,拿下⼼仪Offer;
本课程包含了Android中的App启动优化、UI优化、内存优化、图⽚优化、耗电量等常见的性能优化场景,通过学习此课程,你将对整个Android性能优化体系有清晰的认识。
性能优化作为Android⾼级开发的必备技能,也是⼤⼚⾯试必考的题⽬,是体现⼀个⼈技术深度最好的试⾦⽯。
排序算法是我们⾯试被问到最多的基础算法,本课程详细介绍了七种排序算法,包括插⼊排序、选择排序、冒泡排序、谢尔排序、快速排序、堆积排序和⼆路并归排序。每种算法都详细介绍了核⼼思想、详细步骤、时间复杂度和代码实现,希望帮助⼤家深⼊理解排序算法,搞定⾯试!
本课程为Android HyBrid App开发实战课程,由浅⼊深,从三种App的历史和特点开始,介绍了Android WebView的使⽤、Java和JS交互的原⽣⽅式、著名的WebView安全漏洞、JSBridge的原理和使⽤,最后通过⼀个⽹上商城的实战综合全部内容,让同学们掌握并深⼊理解Android HyBrid App开
发。
介绍⼈⼯智能AI的诞⽣历史和到现在为⽌的不同发展阶段;介绍了AI领域中常见的名词概念和其关系,包括机器学习、深度学习、神经⽹络结构搜索 NAS、⽣成对抗⽹络 GAN等;最后对AI发展做出展望。
本课程属于导论课程,旨在帮助同学们从宏观层⾯把握AI,建⽴AI的知识体系。
本课程详细介绍了Java中的注解机制,包括注解的定义和分类,注解的使⽤和⾃定义,注解的源码和架构分析;
本课程语⾔简单凝练,视频短⼩精悍,让你⼀次彻底搞懂Java注解! public void testMethod () throws Exception { .... }
1
2
3
反射是Java中重要的也是较难理解的内容;
本课程从反射的定义、作⽤、原理和使⽤出发,全⽅位帮你彻底搞定反射;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论