为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?
为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?
在阅读《阿里巴巴Java开发手册》时,发现有一条关于关于常量定义的规约,具体内容如下:
图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制粘贴的时候,少复制 _ 的情况发生,这种错误很难去检查到,因为读取缓存不存在,可能会去数据库读取,很难察觉到。
如果在生产环境中,大量的请求进来,缓存全部失效,直接请求数据库,导致数据库连接过多,查询效率变低的问题发生,因此看来魔法值确实应该避免出现在代码中。
另外在 《Clean Code》 和 《重构》 等书中也提到了类似的问题,在代码中出现原始形态数字通常来说是坏现象,应该用命名良好的常量类隐藏它。
静态常量取代魔法值#
像下面这个例子:
Copy
if (billCount > 75) {
//todo
} else {
//todo
}
如果在不了解这块的业务的同事,在读到这块代码的时候,可能会想,75 是什么鬼,为啥和这个数比较,背后深藏着什么秘密吗?可能只有当时的开发人员记得了,导致代码可读性和可维护性极差。
如果声明一个常量,来替换该魔法值,可能就会使代码的可读性和可维护性大大增加。
Copy
static final Integer BASIC_BILL_COUNT = 75;
还有些魔法表达式,比如:
Copy
if (value > 60 && value <= 80 && type = 1) {
// todo
}
比如这个表达式是表示状态为正常且项目活跃,就可以定义:
Copy
boolean isActiveProject = value > 60 && value <= 80 && type = 1;
这样是不是可读性就提高了,一眼就可以看出来这块代码的逻辑。
枚举类取代魔法值#
还有一种消除魔法值的方式是使用枚举类代替,下面让我们举个例子:
Copy
if (eventId == 1) {
System.out.println("睡觉");
} else if (eventId == 2) {
System.out.println("吃饭");
} else if (eventId == 3) {
System.out.println("打豆豆");
}
如上代码是针对事件 id 去执行相应的事件,如果事件比较少,大家还可以勉强记住每个 eventId 对应的含义,但是随着事件 id 的增多,很可能会发生,新来的员工把事件 id 给搞混了,导致执行错误的事件,发生 bug。
那么我们可以使用枚举类来表示相应的事件:
Copy
public enum EventEnum {
/** * 睡觉 */ SLEEP_EVENT(1, "睡觉"), /** * 吃饭 */ EAT_EVENT(2, "吃饭"), /** * 打豆豆 */ FIGHT_PEA_EVENT(3, "打豆豆"); private int eventId; private String desc; EventEnum(int eventId, String desc) { this.eventId = eventId; this.desc = desc; } public int getEventId() { return eventId; } public String getDesc() { return desc; }
}
修改完之后的代码如下:
Copy
if (eventId == EventEnum.SLEEP_EVENT.getEventId()) {
System.out.println("睡觉");
} else if (eventId == EventEnum.EAT_EVENT.getEventId()) {
System.out.println("吃饭");
} else if (eventId == EventEnum.FIGHT_PEA_EVENT.getEventId()) {
System.out.println("打豆豆");
}
是不是可读性急剧提升,还不快看看自己代码中有没有这样的魔法值出现,有的话赶紧改造起来。
还有如果你需要在不同的地点引用同一数值,魔法数会让你烦恼不已,因为一旦这些数字发生改变,就必须在程序中找到所有的魔法值,并将它们全部修改一遍,这样就太费时费力了。
其实不只是 Java 不应该在代码中使用魔法值,其他语言亦是如此。
总结
本文主要介绍了为什么不允许在代码中出现魔法值以及如何将代码中已有的魔法值去除掉。
代码可读性还是比较重要的,你肯定不希望别人在接手你的代码的时候,骂到这数字啥意思,这代码写得跟粑粑一样。
最好的关系就是互相成就,大家的在看、转发、留言三连就是我创作的最大动力。
参考
《Java开发手册》泰山版
作者: 武培轩
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么? 随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 beta 版本的首个,Python 3.9 的功能已经是完善了。在 10 月发布最终版本之前,还会有许多测试和稳定性方面的工作要做。 (译注:beta1 版本发布于 5 月 18 日,作者文章写于 5 月 20,而到本篇译文发布时,beta2 刚好在今天即 6 月 9 日发布,这是一个巧合!) 该发布说明中列出了被 3.9 接受的 7 个 Python 增强提案(PEP)。我们研究了其中的一些 PEP,看到有一些更新。现在似乎是一个介绍 Python 3.9 带来的一些东西的好时机。 1、字符串操作有时最简单(表明上的)的事情最困难,或者至少会引起巨大的讨论。其中大部分的争议是关于命名(还能是什么?),但是给标准字符串对象添加函数,来删除前缀和后缀,这种想法是毫无争议的。 是否可以将那些词缀(前缀和后缀的统称)指定为序列,以便在一次调用中处理多个词缀,这一点尚不明确,最后它被从提案中删除了,等待着其他人再次推动更改。 在 3 月底,D...
- 下一篇
数据库引擎大调查,送 Doris 限量T恤,快来围观!
本次数据库引擎大调查活动将有机会获得幸运好礼,幸运用户将获得Doris联名T恤或开源中国神秘周边大礼,请参与调查的小伙伴儿一定填好联系方式,一旦获奖,开源中国将与您联系确认邮寄地址。赶快行动吧~ 数智时代,数据量呈现爆炸式增长,根据IDC预测,到2025年,全球数据将增长61%,达到175ZB。海量数据不仅带来了数据红利,也让企业的数据系统不堪重负,没有一款性能强大的数据库引擎傍身,何以洞悉数据背后的价值? 面对海量数据,您常用的数据库系统或查询引擎有哪些?他们有哪些优势?在日常工作中遇到过哪些难题?希望社区能提供哪些帮助?有没有想亲自上阵来完善某个开源数据引擎? 那就赶快来参加由Apache Doris联合开源中国发起的数据库引擎大调查吧【传送门】,让我们携手探索,洞悉数据背后的价值。 关于Apache Doris Apache Doris(Incubating) 是一款基于MPP的交互式SQL数仓系统,可以同时提供高并发的在线服务和高吞吐的Adhoc查询能力。 可以通过预聚合的物化视图、二级索引、向量化执行引擎、列式存储、分区裁剪等多种技术提供海量数据集上高效的查询性能。 Apac...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作