大家好,如果您还对magicnumber是什么意思?用法、例句不太了解,没有关系,今天就由本站为大家分享magicnumber是什么意思?用法、例句的知识,包括如何处理代码中的魔术数字(Magic Number)的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
我真的很不喜欢“魔术数字(MagicNumber)”这个说法。我看到很多人都搞错了。我见过不少次codereview,有人一看到代码中的任何数字,就会评论说,"这是一个魔术数字,一定要把它放到文件前面并定义一个名字。"
(我也比较怀疑把所有的变量都放在文件最前面的必要性,这个话题下次再聊)。
我觉得可以在代码中使用各种数字,只是你需要注意操作方式。
什么是魔术数字?
通过谷歌搜索,你可以得到一堆蹩脚的定义,但底线是,一个魔术数字,是你的代码中很难推理的数字。
fungenerate{for(iin0until52){deck[i]=uniqueCard}}
52是哪里来的?
原来这段代码是要生成一副扑克牌,因为52是一副扑克牌的数量,因此我们可以给这个数字起个名字。
constvalnumberOfCardsInADeck=52fungenerate{for(iin0untilnumberOfCardsInADeck){deck[i]=uniqueCard}}
这样就得到可读性更强、可维护性更强的代码。很好,你已经掌握了编写干净代码的方法。
但是,这只是冰山一角。这个例子的问题是,开发者很容易就能从代码的其他部分中找出52是什么,这是一个相当简单的魔法数字。
魔法数字真正让你头痛的地方是,不理解它从哪里来的,拿下面调整搜索算法的代码来说吧。
funsearch(query:String){find(query,2.4f,10.234f,999,Int.MAX_VALUE,false)}
这一堆数字到底是什么意思?要理解这些数字是干什么用的并不容易。
魔法数字的问题是什么?
假设你的应用规模越来越大,需要搜索的东西越来越多,突然间你的搜索结果并没有得到你想要的结果。
我们有这样的问题:当我搜索麦片时,结果中没有出现麦片,尽管我知道它在里面。
所以在这个算法被调整了四年之后,你需要改变这些值来修复这个bug,该如何入手?
这就是魔法数字的问题。如果把这些数字用长长的描述性的名字组合在一起,再加上代码文档,详细说明改变它们对搜索结果的影响,维护起来会更简单。
constvalsearchWeight=2.4f//Howspecificyourquerymustbe.IncreasethisnumbertogetmorefuzzyresultsconstvalsearchSpread=10.234f//Howspreadtheresultare.SelectsmorewordsinarowinthedatabaseconstvalsearchPageSize=999//ThenumberofresultswewantpersearchpageconstvalsearchMaxResults=Int.MAX_VALUE//WewanteverypossibleresultfromthesearchconstvalshouldSearchIndex=false//Wedon'twanttosearchindiciesfunsearch(query:String){find(query,searchWeight,searchSpread,searchPageSize,searchMaxResults,shouldSearchIndex)}//Callsourweightedsearchalgorithim.Readthedocsaboutthisalogirthimatfoo.bar.comfunfind(query:String,weight:Float,spread:Float,pageSize:Int,maxResults:Int,index:Boolean){}
你会不会觉得维护这个代码更舒服?如果有人能用这个文档来解决这个bug,那就更有底气了。
什么不是魔法数字?
现实中,难于推理的数字并不像容易推理的数字那样经常出现,以这些硬编码的数字为例
view.height=42
这不是一个魔法数字。我重复一遍:这不是一个魔法数字。
我知道,这是在对一些Java纯洁主义和有洁癖的人发神经了。
但这个数字并不难理解。它的作用完全是自成一体的:这个视图的高度是42,仅此而已。如果再给它另外起个名字,又能增加什么价值?
constvalviewHeight=42funbuildView{view.height=viewHeight}
这不过是臃肿的代码罢了。这似乎是个小例子,但这种无谓地给数字命名的想法很快就会使UI代码的大小膨胀,只会增加无意义代码的行数。
那我的代码中到底能不能用数字呢?
当然可以。世界上有很多好的代码都是用数字来写的。你只需要牢记几件事就可以了。
确保你的数字是容易理解—比如小学生都可以理解这个数字的作用。
如果你要改变一个数字,调整一些东西,或者在纸上做一些计算来得到一个硬编码的数字,要解释清楚。在代码中,就在数字旁边。或者至少在提交中说明。对硬编码数字的更改要有解释。
奖励:确保你的硬编码数字是DRY(非重复的)。
这不是火箭科学,但使用你的数字有很多微妙的地方。
你应该可以搞定这些,谢谢你的阅读!
https://medium.com/better-programming/magic-numbers-are-not-that-magic-132297d435f5
本文由高可用架构翻译。技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。
改变互联网的构建方式
文章到此结束,如果本次分享的magicnumber是什么意思?用法、例句和如何处理代码中的魔术数字(Magic Number)的问题解决了您的问题,那么我们由衷的感到高兴!