为什么阿里巴巴java开发手册中不允许魔法值出现在代码中?
道理很简单,阿里巴巴规模很大,员工很多,员工的流动也很频繁,试想一下一位代码中满是魔法值的老员工辞职了,让接替他的新员工怎么办?又让阿里巴巴怎么办?
作为互联网龙头企业,阿里巴巴没有那么多时间去让新员工适应老员工的代码写作风格,高效是它永恒的追求,所以才有了这么一套标准化的代码写作规范。
其实大多数的开发规范都会禁止魔法值(未经预先定义的变量)的使用,因为它存在着很多的弊端。
- 魔法值容易出错。当在代码中多次使用同样字面值时,如果出现了拼写错误,那么程序将会发生不可预料的错误,而且这种错误难以在前期发现。而如果使用变量,IDE和编译器等就可比较容易发现错误,减少像题中出现键值不相同的情况发生。
- 魔法值难以修改维护。当我们需要修改多次出现的魔法值时,我们就要进行查找之后再修改,有时一些魔法值容易与其他代码混淆,此时修改工作就十分困难了。而预先定义的变量仅需修改一处就可以了,明显更为方便。
- 魔法值降低代码可读性。当代码中遍布魔法值,尤其是一些魔法数字的时候,除非有详尽的注释,否则其他人很难弄清魔法值的含义,代码开发者自己也不容易记得。而使用合适的名称进行变量命名,可读性就会大大增加。
在开发中应养成良好的编码习惯,避免魔法值的使用,提高代码的正确性和可维护性。
因为魔法值就像魔法一样,没人能懂啊。
比如我写一段程序
if (var == "2"){
} else if(var == "5"{
}
你看到这个代码能够知道 2 和5 分别代表什么意思吗? 是不是很懵。
写这样的代码,当时可能记得是什么意思,如果几个月后,后者作者离职了,
其他人再维护这样的代码,就搞不懂了。
这个案例描述是有问题的。故障的原因不是魔法值,而是拷贝错了且没有测试。不允许魔法值只是最大限度的避免Java编码人为因素导致的错误,但是跨语言的还是可能出错。
对于任何语言这一点都是互通的。
一个未经定义的字面值会造成很多不可预知的错误。
如果这个字面值是一个全局缓存中某个常用数据的键,这个常用数据在系统很多模块都用到了。
当从全局缓存中访问这个数据时,如果键没有预先定义,那么复制10次都不出错的可能会增大。
当然,这不是最重要的问题。更重要的是,如果有一天项目经理或者其他人觉得这个名字有问题,给改了个名字。那么,10个使用的地方,漏改的可能会更大。
还有更麻烦的是,当有人给缓存放另外的值得时候,可能不记得这个名字的缓存已经被占用了,然后把自己的值放进去了。这时候,使用这个缓存的其他模块就要不得不接受,缓存已经不是自己想要的事实。
使用预先声明的常亮能极大的避免这两种事情的发生。当然,不能完全避免,毕竟会有人不按规范来。
阿里巴巴的开发手册是他们自己开发过程中经验的总结,不能说是最好,但一定比大多数项目小组的规范要好很多。
有人说阿里的网站是php,但阿里的系统服务用的是Spring Cloud做的是服务集群。这部分完全是J***a实现的,阿里还是Apache基金会的重要成员,阿里自己重写了MySQL并应用在双十一,这些都不胜枚举。
魔法值一直都是编程的一大难题。我在开发中最讨厌别人用魔法值,因为我需要用这个值的时候,只能手动***或者手敲(很容易出错)。如果用静态常量我可以通过IDEA的代码提示获取到这个值,这样一来 方便很多了啊。