【Java代码与架构之完美优化】篇1:代码质量优化通用准则
工欲善其事,必先利其器
1. 避免使用空块
常见空块一般有以下几种情况:
- 多余的分号:
if(xxx);
- 多余的大括号:
if(xxx){这里没有内容}
- 空finall语句:
try{...}catch(...){...}finally{这里没有内容}
空块的存在,很容易引起误解。过一段时间,可能程序员自己都不知道这个地方为什么会有这样的代码?是写漏了?还是失误?百思不得其解,是删除还是继续调查需求文档?带来了不必要的麻烦。
为了避免这些问题,不该要的代码都应该及时的删掉。有时候由于设计上的原因,一段临时的代码无法确定其内容,可以通过//TODO
定义一个空块标记,等需求确定了再把代码补上。
2. 避免使用空类
空类是除了默认的构造器之外没有其他任何代码。
public class Test{ //这里没有任何代码 }
有些架构中,为了使各层文件齐全,即使类没有被任何代码使用,也会定义一些空类,这样的设计是不好的,不但增加了文本管理成本,并且比空块带来的烦恼更多,因为空块是类内部的影响,而这里是类与类架构之间的影响。
不应该画蛇添足,对于没有价值的类就应该直接删掉。
3. 去掉多余的import
类头部存在多种多余的或无用的import
import java.lang.*;
对于没有使用的类,引入后往往会引起误解。而且,不用使用“*”引入包下面所有的类,用到哪个就引入哪个,否则会降低程序的可读性。
为了使代码更加简洁、明了,该引入的一个不能少,不该引入的一个也不能多。对于import java.lang.*;
下的包使默认引入的,这是基本常识,因而不需要再次引入了。
4. 删除无效代码
程序中存在未被使用的临时变量、成员变量、方法、参数、类等,也就是说这些是不起任何作用的无效代码。
很多程序员都有一种心态:自己精心写出来的代码,不忍心删除或优化。但是,自己在写程序时无意间留下的代码可能会给后期维护带来更大的成本。
对于这些代码应该直接删掉。
5. 制定命名体系规约
在开发中,很多变量名、方法名、类名、包名等杂乱无章,没有规范。
没有命名体系的命名会带来很多问题:
- 系统理解成本
- 沟通成本
- 维护成本
- 管理成本
- 极高的系统坏死风险
因此,每一个研发人员,都要提高对命名规范的意识,高层应该制定一套通用编程命名规范
和系统的命名标准
。
6. 去掉重复代码
重复代码即多个类里面包含相同的代码片段或方法。
如果系统里同一个类或不同类中存在很多重复代码,一旦业务需求变更,就不知道该修改哪一处代码,如果忘记了修改任何一处代码都会产生BUG。
因而对于多余的代码,考虑将其和删除,或考虑提取出来作为工具类使用。
7. 保持switch语句完整性
在switch语句中省略break或default都是错误的行为。
不说逻辑上的错误,省略break或default都会导致代码的可读性变差。
备注:
在jdk8之后的版本中推出了新的语法格式,可以省略break。详细可见我的另一篇文章【JDK 17 新特性】jdk8~jdk17新特性
8. 大写“L”代替小写“l”定义long类型变量
long i = 1l;
long类型的变量定义,都需要在后边跟上小写l
或大写L
,而小写l
与数字1
十分形似,难以分辨,者大大降低了程序的可读性,因而在定义long类型变量的时候,统一使用大写的L
来标识变量。
9. 避免在一条语句中声明或赋值多个变量
//声明多个变量
long long1,long2;
// 赋值多个变量
long2=long1=1;
在一条赋值表达式语句同时声明或赋值多个变量,会大大降低程序的可读性与可测试性。
同时应该保证语句的单一职责
。
10. 去掉控制标志的临时变量
public String test(int type){// 结果控制标志临时变量resSteing res = "";if(type==1){res = "第一名";}else if(type==2){res = "第二名";}else{res = "第三名";}return res;
}
在传统面向对象的编程语言“单一出口”原则的引导下,哎表达式里,常常会看到有控制结结果的临时变量。
去掉这种临时变量的控制标记会让代码清晰很多。
public String test(int type){if(type==1){return "第一名";}else if(type==2){return "第二名";}else{return "第三名";}
}
11. 避免赋予临时变量过多角色
public static void method(){String temp;// 职责1temp = "This is" + getType();System.out.println(temp);// 职责2temp = "My name is " + getName();System.out.println(temp);
}
单一职责
告诉我们,这种临时变量只因该被赋值一次,如果它们被赋值超过一次,就意味着它们在方法中承担了一个以上的职责,这回令代码阅读者疑惑,大大降低程序的可读性。
因而我们应该增加临时变量,使得每个临时变量只代表一个职责。
public static void method(){// 临时变量1String tempType;// 临时变量2String tempName;tempType= "This is" + getType();System.out.println(tempType);tempName= "My name is " + getName();System.out.println(tempName);
}
12. 避免使用魔法数字
public static void method(int type){if(type==10){//魔法数字10System.out.println("我是白色!");}else if(type==20){//魔法数字20System.out.println("我是黑色!");}
}
魔法数字(Magic Number)是臭名昭著的劣质代码现象之一。如果需要在不同的地点引用同一个逻辑数,就会给程序员带来无限的烦恼。一旦这些数字发生变化,维护起来十分麻烦。
魔法数字的替换手段一般有以下三种:
- 当不是类型码的时候,考虑使用常量代替。
- 当是有限个数的类型码的时候,考虑使用枚举代替。
- 当是不定个数的类型码的时候,考虑使用类代替。
用常量代替示例:
声明常量:
public class Consts{public static int COLOR_WHITE = 10;public static int COLOR_BLANK = 20;
}
在定义常量时,为了方便阅读,通常以功能来命名。不建议在常量名后边加上魔法数字,比如COLOR_WHITE_10
,这样虽然方便阅读,但是在后期常量值修改的时候,一样需要修改使用你常量的地方,不利于维护。
使用常量代替魔法数字:
public static void method(int type){if(type==Consts.COLOR_WHITE_10){//魔法数字10System.out.println("我是白色!");}else if(type==Consts.COLOR_BLANK_20){//魔法数字20System.out.println("我是黑色!");}
}
未完待续。。。
相关文章:

【Java代码与架构之完美优化】篇1:代码质量优化通用准则
工欲善其事,必先利其器 1. 避免使用空块 常见空块一般有以下几种情况: 多余的分号:if(xxx);多余的大括号:if(xxx){这里没有内容}空finall语句:try{...}catch(...){...}finally{这里没有内容} 空块的存在࿰…...

Linux进程间通信详解(最全)
进程间的五种通信方式介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享内存、Socket(套接字&a…...

ROS 摄像头的使用
参考: youtubeArticulated Robotics 作者Josh Newans博客 建议: 这个只是我的看法,强烈建议看原视频或博客 png:无损压缩 jpeg:有损压缩 Driver Node 负责连接硬件设备,读取摄像头数据"ima…...

VR全景云展厅,实现7*24小时的线上宣传能力!
数字化时代,虚拟现实技术的应用越来越广泛,其中VR全景云展厅是一种新兴的展示方式,具有独特的展示优势。随着VR技术的不断发展,越来越多的企业、机构和个人开始使用VR全景云展厅来展示他们的产品和服务。一、展厅营销痛点1、实地到…...

RK3568平台开发系列讲解(显示篇) DRM显示系统组成分析
🚀返回专栏总目录 文章目录 一、DRM Framebuffer二、CRTC三、Planes四、Encoder五、Connector沉淀、分享、成长,让自己和他人都能有所收获!😄 📢让我们分析一下绿框中的五个部件,以及他们的联动。 一、DRM Framebuffer 与 framebuffer一样,是一片存放图像的内存区域,…...

WPF DataGrid控件的使用 使用列模板来进行数据格式的美化
<Grid><Grid.RowDefinitions><RowDefinition Height"0.1*" /><RowDefinition /></Grid.RowDefinitions><Button Content"刷新"FontSize"25"Command"{Binding ExecuteRefreshCommand}" /><Dat…...

elasticsearch自定义企业词典
我们中文分词用的是ik,但是ik只是对基本的中文词进行了分词,而对于企业或者人名没有进行分词。比如,我搜索中国平安,那么ik只能分成中国、平安如果这样,这肯定是不行滴!接下来,俺就教你…...

【AcWing】学了一坤时才明白的一道题
🎆音乐分享 (点击链接可以听哦) The Right Path - Thomas Greenberg 这道题小吉花了一坤时才弄明白,虽然花的时间有点长 但是至少是明白了 😎😎😎😎😎😎 …...

ES6的export和import
ES6中的模块加载ES6 模块是编译时加载,编译时就能确定模块的依赖关系,以及输入和输出的变量,相比于CommonJS 和 AMD 模块都只能在运行时确定输入输出变量的加载效率要高。严格模式ES6 的模块自动采用严格模式,不管你有没有在模块头…...

ASEMI高压MOS管20N60参数,20N60尺寸,20N60体积
编辑-Z ASEMI高压MOS管20N60参数: 型号:20N60 漏极-源极电压(VDS):600V 栅源电压(VGS):30V 漏极电流(ID):20A 功耗(PDÿ…...

【备战面试】TCP的三次握手与四次挥手
本篇总结的是计算机网络知识相关的面试题,后续也会更新其他相关内容 文章目录1、TCP头部结构2、三次握手3、四次挥手4、为什么TCP连接的时候是三次?两次是否可以?5、为什么TCP连接的时候是三次,关闭的时候却是四次?6、…...

【模板进阶】
目录 1. 非类型模板参数 2. 模板的特化 2.1 概念 2.2 函数模板特化 2.3 类模板特化 2.3.1 全特化 3 模板分离编译 3.1 什么是分离编译 3.2 模板的分离编译 4. 模板总结 有需要的老哥可以先看看模板的介绍:http://t.csdn.cn/2TkUYhttp://t.csdn.cn/2TkUY 1. …...

Tech Talk | 电致变色技术带来的智能AR体验
2023年2月27日,小米在2023MWC世界移动通信大会上,正式发布了小米无线AR眼镜探索版。这款产品搭载了创新的数控电致变色镜片,能适应不同光环境,遮光模式可以在观影时更沉浸,通透模式又能让AR虚实结合的体验更生动。“ 本…...

ACWING蓝桥杯每日一题python(持续更新
ACWing蓝桥杯每日一题 一直没时间去总结算法,终于有空可以总结一下刷的acwing了,因为没时间所以最近只刷了ACWING的蓝桥杯每日一题。。。真是该死 1.截断数组 首先我们要知道,如果sum(a)不能被3整除或者len(a) < 3 ,那么他肯…...

【Linux】进程状态(阻塞、挂起、僵尸进程)
文章目录1 阻塞与挂起1.1 阻塞1.2 挂起2 进程状态前言: 当我们在Windows下双击运行一个程序,或是在Linux下通过 ./ 加载运行一个程序,是否就代表对应的进程就一直处在运行状态呢?其实不然,一个进程有许多不同的状态。当…...

规约第二章
文章目录有限域的定义Definition of Finite Field单位元运算举例素数域群阿贝尔群阿贝尔循环群循环子群阿贝尔循环群且阶是素数的有限域的定义Definition of Finite Field 单位元 这里一般只需要记住2个0,1 。0是加法的单位元,1是乘法的单位元。以及逆…...

2019年MathorCup数学建模C题汽配件制造业中的生产排程问题解题全过程文档及程序
2019年第九届MathorCup高校数学建模挑战赛 C题 汽配件制造业中的生产排程问题 原题再现: 整体求解过程概述(摘要) 随着市场竞争日趋激烈,企业开始更加注重低费高效,因此生产排程问题成为众多制造企业关注的热点之一。其中,制造行…...

ARM uboot 的移植3 -从 uboot 官方标准uboot开始移植
一、选择合适的官方原版 uboot 1、官方原版 uboot 的版本 (1) 版本号。刚开始是 1.3.4 样式,后来变成 2009.08 样式。 (2) 新版和旧版的差别。uboot 的架构很早就定下来了,然后里面普遍公用的东西(common 目录下、drivers 目录下、fs 目录…...

华为OD机试 - 快递货车(C 语言解题)【独家】
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:快递货车…...

连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建
NebulaGraph 社区如何构建工具让 Slack、WeChat 中宝贵的群聊讨论同步到公共领域。 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通、讨论应该是透明、包容并且方便所有成员访问的。这意味着社区中的任何人都应该能够参与讨论和决策过…...

数据中台架构体系理解
目前,大部分企业更倾向于数据集中采集、存储,并应用分层建设。这种方式一方面有利于应用系统的快速部署,另一方面也保证了数据的集中管理与运营,体现数据的资产、资源属性。 数据中台的出现弥补了数据开发和应用开发之间由于开发…...

高并发性能指标:QPS、TPS、RT、并发数、吞吐量
QPS(每秒查询) QPS:Queries Per Second意思是“每秒查询率”,一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准 互联网中,作为域名系统服务器的机器的性…...

【微信小程序】-- 案例 - 本地生活(列表页面)(三十)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...

华为OD机试题,用 Java 解【一种字符串压缩表示的解压】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...

所有科研人警惕,掠夺型期刊和劫持型期刊的区别,千万别投错了
当今,新形式的学术出版物——例如数字式或开源式的学术期刊日益普及,热门期刊的数量逐年增长【1】。 人们获取学术出版物也越来越容易,使得更多的科研人员(特别是在低收入国家)能够及时了解各自研究领域的最新发展态势…...

超详细CentOS7 NAT模式(有图形化界面)网络配置
在此附上CentOS7(有可视化界面版)安装教程 超详细VMware CentOS7(有可视化界面版)安装教程 打开VMware—>点击编辑---->选择虚拟网络编辑器 打开虚拟网络编辑器后如下图所示: 从下图中我们看到最下面子网IP为…...

华为OD机试题,用 Java 解【英文输入法】问题
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…...

【Redis】主从集群 实现读写分离(二)
目录 2.Redis主从 2.1.搭建主从架构 2.2.主从数据同步原理 2.2.1.全量同步 2.2.2.增量同步 2.2.3.repl_backlog原理 2.3.主从同步优化 2.4.小结 2.Redis主从 2.1.搭建主从架构 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,…...

【JavaEE】前后端分离实现博客系统(页面构建)
文章目录1 效果展示1.1 博客登录页面1.2 博客列表页面1.3 博客详情页面1.4 博客编辑页面2 页面具体实现2.1 博客列表页的实现2.2 博客详情页的实现2.3 博客登录页面的实现2.4 博客编辑页面的实现写在最后1 效果展示 1.1 博客登录页面 用于实现用户的登录功能,并展…...

MyBatis的基本使用
MyBatis 为啥MyBatis会使用xml 在一个程序中,若需要操作数据表,那么 SQL 语句有两种存放方式:1. 放到 Java 类里面(这个就存在大量的字符串拼接,还有占位符需要处理-----JDBC);2:放…...