猿问

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

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

什么是魔术数字?

为甚麽要避免呢?

有合适的案例吗?



小怪兽爱吃肉
浏览 724回答 4
4回答

拉莫斯之舞

幻数是代码中数字的直接用法。例如,如果您有(在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中满是示例,如Integer, Character和Math上课。PS:像FindBugs和PMD这样的静态分析工具可以在代码中检测到神奇数字的使用,并建议进行重构。

人到中年有点甜

魔术数字是一个硬编码的值,可能会在稍后阶段改变,但因此很难更新。例如,假设您有一个页面,它在“您的订单”概述页中显示最后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 = 25或TCPPacketSize = whatever(不确定这是否标准化)。而且,仅在1函数中定义的所有内容都可能是可以接受的,但这取决于上下文。
随时随地看视频慕课网APP
我要回答