本文转载自微信公众号《程序员鱼皮》,作者鱼皮。转载本文请联系程序员Yupi公众号。大家好,我是Yupi。今天通过一个事件,给大家分享一个写代码的重要技巧。前段时间开源了编程导航项目中的一段代码。实现的功能是当用户操作失败时,页面会弹出错误框,提示“操作失败”。代码如下://错误提示constERROR_MESSAGE="Operationfailed";//删除资源constresult=deleteResource();if(!result){alert(ERROR_MESSAGE);}然而没想到有同学直接留言说我这样写代码是多余的!为什么我要给“Operationfailed”这个字符串定义一个常量?这样写就可以了://删除资源constresult=deleteResource();if(!result){alert("Operationfailed");}看起来代码变得更精简了,但其实这是一个普通的编程误会,魔法值的问题。法力什么是法力?听起来有点像游戏中的蓝槽MP哈哈。其实魔法值跟MP一点关系都没有!魔法值是指代码中没有任何定义,像魔法一样凭空出现的值。可以是数字,字符串等,例如://outputconsole.log(1);//弹出警告框alert("dog");为什么要给这个值起个名字“魔法值”呢,因为它对代码的影响非常不好!magic值的问题首先,magic值会严重影响代码的可读性和可维护性。像上面这样的magicstrings貌似没问题,但是如果magic值是一个数字,就必须通过阅读其他代码来推断,比如:if(a==1){alert("good");}elseif(a==2){alert("bad");}elseif(a==3){...}你能通过这段代码知道数字1、2和3的含义吗?有同学说,难道我自己写的代码还看不懂吗?别担心,一个月后你会再次阅读这段代码。如果你记性好,自己做项目的时候追求一些效率也无所谓。但是如果和其他同学一起做项目和维护代码,写出具有神奇价值的代码,无疑会让别人难以理解。如果你不写评论,他们可能恨不得要你的命。其次,mana也会影响开发的效率和准确性。还是以一开始的代码为例,我的同学并没有完整地阅读代码文件,其实在这个文件中,我不止一次使用了常量ERROR_MESSAGE://错误信息constERROR_MESSAGE="operationfailed";//删除资源constresult=deleteResource();if(!result){alert(ERROR_MESSAGE);}//修改资源constresult=updateResource();if(!result){alert(ERROR_MESSAGE);}...如果像他说的同上,不定义常量,直接使用magicstrings,那么每次要弹出“操作失败”,都得反复敲这几个字,既浪费时间又冒错别字的风险。但是,如果您使用预定义常量,则可以轻松利用开发工具提供的代码提示和完成功能。代码完成此外,魔法值还影响代码的可修改性。如果同一个魔术字符串在代码中多次出现,那么当我想修改字符串的文本时,我必须手动找到该字符串并逐个修改,即使我可以使用提供的搜索和全局替换功能通过开发工具,但是再次检查很麻烦。alert("您的操作失败");alert("您的操作失败");alert("您的操作失败");如果字符串被定义为常量,只需在定义处修改它的值即可。此时的常量名看起来就像是一个指向魔法值的指针。constERROR_MESSAGE="您的操作失败"alert("ERROR_MESSAGE");alert("ERROR_MESSAGE");alert("ERROR_MESSAGE");解决magic值正是因为magic值对代码的危害很大,所以在各种代码规范中,都建议开发者不要使用magic值。解决魔法值的方法很简单。其实就是上面说的,就是为一系列相同的值定义一个常量。注意是常量,不是变量!因为魔法值的内容一般是固定的,所以不会修改它的结构。对于一系列的魔法值,建议将其定义为枚举或单独的常量类。例如,资源有很多审计状态,所有状态都可以集中定义。JavaScript代码:constREVIEW_STATUS={//待审核WAITING:0,//通过PASS:1,//拒绝REJECT:2}Java代码:publicenumReviewStatus{WAITING,PASS,REJECT}希望这次分享对大家有所帮助,请停止编写糟糕的代码!
