为了账号安全,请及时绑定邮箱和手机立即绑定

什么是神奇的数字,为什么它是坏的?

什么是神奇的数字,为什么它是坏的?

什么是神奇的数字,为什么它是坏的?什么是魔术数字?为甚麽要避免呢?有合适的案例吗?
查看完整描述

4 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

幻数是代码中数字的直接用法。

例如,如果您有(在Java中):

public class Foo {
    public void setPassword(String password) {
         // don't do this
         if (password.length() > 7) {
              throw new InvalidArgumentException("password");
         }
    }}

这应重新考虑到:

public class Foo {
    public static final int MAX_PASSWORD_SIZE = 7;

    public void setPassword(String password) {
         if (password.length() > MAX_PASSWORD_SIZE) {
              throw new InvalidArgumentException("password");
         }
    }}

它提高了代码的可读性,并且更易于维护。假设我在GUI中设置了密码字段的大小。如果我使用一个神奇的数字,每当最大尺寸发生变化时,我必须在两个代码位置进行更改。如果我忘了一个,这会导致不一致。

JDK中满是示例,如IntegerCharacterMath上课。

PS:像FindBugs和PMD这样的静态分析工具可以在代码中检测到神奇数字的使用,并建议进行重构。


查看完整回答
反对 回复 2019-05-30
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

魔术数字是一个硬编码的值,可能会在稍后阶段改变,但因此很难更新。

例如,假设您有一个页面,它在“您的订单”概述页中显示最后50个订单。50是这里的魔术数字,因为它不是通过标准或惯例来设定的,这是一个你在规范中列出的原因组成的数字。

现在,您要做的是在不同的地方拥有50-您的SQL脚本(SELECT TOP 50 * FROM orders),您的网站(最后50个订单),您的订单登录(for (i = 0; i < 50; i++)可能还有很多其他地方。

现在,当某人决定改变50到25的时候会发生什么呢?还是75岁?或者153?你现在必须在所有的地方替换50,你很可能会错过它。查找/替换可能不起作用,因为50可能用于其他事情,而盲目地用25替换50可能会产生其他一些不良副作用(例如,Session.Timeout = 50调用,也被设置为25,用户开始报告太频繁的超时)。

此外,代码可能很难理解,即“if a < 50 then bla-如果您在一个复杂的函数中遇到这种情况,其他不熟悉代码的开发人员可能会问自己“WTF是50?”

这就是为什么最好把这些模棱两可的任意数字放在第一位-“const int NumOrdersToDisplay = 50“,因为这样可以提高代码的可读性(”if a < NumOrdersToDisplay“,这也意味着您只需要在一个定义良好的地方更改它。

魔术数字合适的地方是通过标准定义的一切,即SmtpClient.DefaultPort = 25TCPPacketSize = whatever(不确定这是否标准化)。而且,仅在1函数中定义的所有内容都可能是可以接受的,但这取决于上下文。


查看完整回答
反对 回复 2019-05-30
  • 4 回答
  • 0 关注
  • 723 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信