为什么算法中会出现magic number

算法中会出现magic number的原因:1、经验所得;2、代码多次计算;3、缺少宏定义或常量;4、代码重构不彻底。经验所得是指一段代码经过多次测验,发现某个数字可以在某种情况下最接近你最想要的结果,那么这个数字就会变成magic number。

一、算法中会出现magic number的原因

1、经验所得

经验所得是指一段代码经过多次测验,发现某个数字可以在某种情况下最接近你最想要的结果,那么这个数字就会变成magic number。例子:如果平常随机种子都用时间戳,但突然用一个特定的数字做随机种子,往往随机出来的结果都比较好。

2、代码多次计算

代码在多次计算后,得出一个结果用于最终程序。例如一个展开式中的某个系数,用于某迭代过程;或者是在预处理过程中得出的结果直接使用到最终程序中等等。例子:quake3中的sqrt。

3、缺少宏定义或常量

在修改代码时,可能会忽略一些常量的值,特别是嵌套深度很深的条件语句中的常量,导致代码中存在未被修改的“Magic Numbers”。

4、代码重构不彻底

在编写代码时,可能会缺乏合适的宏定义或常量,这可能导致在代码中使用硬编码的数字(“Magic Numbers”)。

二、magic number简介

魔术数字(magic number)是程式设计中所谓的直接写在程式码里的具体数值(如“10”“123”等以数字直接写出的值)。虽然程式作者写的时候自己能了解数值的意义,但对其他程式员而言,甚至制作者本人经过一段时间后,会难以了解这个数值的用途,只能苦笑讽刺“这个数值的意义虽然不懂,不过至少程式会动,真是个魔术般的数字”而得名。

所谓魔数和魔字符串就是指在代码中出现但没有解释的数字常量或字符串,又称魔法值。如果在某个程序中你使用了魔数,那么在几个月或几年后你将很可能不知道它的含义是什么。大多数情况下,我们都是通过扩展名来识别一个文件的类型的,比如我们看到一个.txt类型的文件我们就知道他是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,识别一个文件的类型就用到了我们提到的“魔数”。很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)这几个字节的内容也被称为魔数,因为根据这几个字节的内容就可以确定文件类型。有了这些魔术数字,我们就可以很方便的区别不同的文件。

三、magic number分类

1、有害的magic number

指的是代码中出现的没有说明的数字。代码中突然出现一个没说明用途的数字会让其它阅读代码、维护代码的的人非常难受。例如:

const int N = 2073600;
for (int i=0; i<N; i++)
 { ......

看代码的人需要猜2073600是什么意思,而且特别难猜。改成这样就清楚多了:

const int WIDTH = 1920;
const int HEIGHT = 1080;
int totalPixels = WIDTH * HEIGHT;

这里的“魔数”就是指代码中直接出现的数字。现代编程规范比较忌讳这样写代码,一方面看不懂意思,另一方面如果2073600这个数字多次出现,一旦需要修改的时候就需要全部找出来改掉,一旦少改一处就会产生BUG,非常麻烦。我们在编程中要尽可能避免使用“魔数”,例如写3.1416这种数字,也应该改为数学库中的π常数,例如Unity中的Mathf.PI

2、有益的magic number

最典型的例子就是现代3D游戏之父约翰·卡马克在雷神之锤中的那个魔数:

i = 0x5f3759df - ( i >> 1 );

配合前后的代码,这句代码可以快速计算一个数字的平方根的倒数。具体推导过程比较复杂,涉及到浮点数的原理。这个操作给了其它人非常大的震撼,是那个年代的大神级编程技术的缩影,所以被人们怀着敬仰之情称之为“魔数”,全称为“如魔法一样神奇的数字”。

3、一般的magic number

某些具有特定格式的文件,喜欢在文件开头写几个特殊的字符以表明自己的身份,以便验明正身。例如常见的几种图片格式的文件:

  • JPEG (jpg),文件头:FFD8FF 
  • PNG (png),文件头:89504E47 
  • GIF (gif),文件头:47494638 
  • Windows Bitmap (bmp),文件头:424D 

如果你用16进制编辑器打开一个文件,它的开头不是FFD8FF,那就不是jpg文件。这个魔数一般会在相关文件标准中进行规定,所有人都要遵守。

延伸阅读

如何避免magic number

为避免因“Magic Number”造成的问题,可以通过引入常量、枚举及其他宏定义等方式来减少硬编码的数字的使用,使代码更加灵活、易读和维护。同时,还可以通过编写注释来解释“Magic Number”的含义,从而帮助开发人员更好地理解它们的作用。

文章标题:为什么算法中会出现magic number,发布者:Z, ZLW,转载请注明出处:https://worktile.com/kb/p/49370

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Z, ZLW的头像Z, ZLW
上一篇 2023年4月15日
下一篇 2023年4月15日

相关推荐

  • 会员管理需要做什么项目

    会员管理需要做的项目包括:1、会员信息管理、2、会员等级设置、3、会员积分系统、4、会员消费记录、5、会员行为数据分析、6、会员营销活动策划、7、会员服务与反馈。其中,会员信息管理是基础,它涉及到会员信息的收集、整理和更新,是所有会员管理工作的基础。只有充分了解会员,才能更好地为他们提供服务,提高他…

    2024年8月6日
    000
  • 什么是项目课程管理理念

    项目课程管理理念是一种将项目管理的方法和技巧应用于教育课程设计和实施中的理念,旨在通过系统化的项目管理流程来提升教育质量、提高学生参与度、确保课程目标的实现。强调目标明确、计划周密、过程监控、成果评价。其中,目标明确是关键,项目课程管理理念要求在课程设计初期就明确课程的教育目标,以便在后续的教学过程…

    2024年8月6日
    000
  • 项目管理大师兄叫什么

    项目管理大师兄是指PingCode和Worktile。 PingCode和Worktile是两款在项目管理领域中备受推崇的工具,它们在项目规划、任务分配、进度跟踪和团队协作等方面提供了全面的支持。PingCode以其强大的功能、灵活的配置、广泛的集成能力而著称,可以帮助团队高效管理复杂项目;而Wor…

    2024年8月6日
    000
  • 什么是灵活应用项目管理

    灵活应用项目管理是一种全新的项目管理方式,通过将传统的严格项目管理模式转变为更加灵活、自由的方式,使得项目能够根据实际情况进行调整,以达成更加优质的项目结果。灵活应用项目管理主要包括以下几个方面:一、项目的灵活管理、二、团队的自主协作、三、客户的主动参与、四、使用专业的项目管理工具。其中,项目的灵活…

    2024年8月6日
    000
  • 项目管理说的是什么行业

    项目管理不限于特定行业,它是一种涵盖各个领域的管理理念和方法。无论是IT、制造、建筑、医疗、教育,还是娱乐、零售等行业,都需要项目管理。项目管理能够帮助企业更有效地完成工作,提高效率,降低成本,提升竞争力。它的核心是通过科学的方法和技术,对项目的资源、时间、成本等进行有效的管理和控制,以实现项目目标…

    2024年8月6日
    000

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部