【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 中宝贵的群聊讨论同步到公共领域。 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通、讨论应该是透明、包容并且方便所有成员访问的。这意味着社区中的任何人都应该能够参与讨论和决策过…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
