文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

我被喷了:这样写代码是多此一举?

2024-12-03 05:36

关注

本文转载自微信公众号「程序员鱼皮」,作者鱼皮。转载本文请联系程序员鱼皮公众号。

大家好,我是鱼皮,今天通过一件事情,分享写代码时的一个重要小技巧。

前段时间,我在编程导航项目中开源了一段代码,实现的功能是,当用户的操作失败时,会在页面上弹出一个错误框,并提示 “操作失败”,代码如下:

  1. // 错误提示 
  2. const ERROR_MESSAGE = "操作失败"
  3.  
  4. // 删除资源 
  5. const result = deleteResource();  
  6. if(!result) { 
  7.   alert(ERROR_MESSAGE); 

然而没想到,有位同学直接留言说我这么写代码是多此一举!为什么要单独给 “操作失败” 这个字符串定义一个常量呢?直接这么写不就好了:

  1. // 删除资源 
  2. const result = deleteResource();  
  3. if(!result) { 
  4.   alert("操作失败"); 

似乎代码变得更精简了,但其实这是一个常见的编程误区,魔法值 问题。

魔法值

什么是魔法值呢?听起来有点像游戏的蓝槽 MP 哈哈。

[[396357]]

其实,魔法值和 MP 一点关系都没有!

魔法值指的是代码中没有任何定义,直接像魔法一样凭空出现的值,可以是数字、字符串等,比如:

  1. // 输出 
  2. console.log(1); 
  3. // 弹出警告框 
  4. alert("dog"); 

为什么要给这种值一个名号 “魔法值” 呢,因为它对代码的影响非常恶劣!

魔法值的问题

首先,魔法值会严重影响代码的 可读性 和 可维护性。

像上面的魔法字符串看起来好像没什么问题,但如果魔法值是数字,就必须通过阅读其他代码才能推断出来,比如:

  1. if (a == 1) { 
  2.   alert("good"); 
  3. else if (a == 2) { 
  4.   alert("bad"); 
  5. else if (a == 3) { 
  6.   ... 

只凭这样一段代码,你能知道数字 1、2、3 分别是什么意思吗?

有同学说了,我自己写的代码难道还会看不懂么?别急,过一个月你再来阅读下这段代码。

如果你的记忆力很好,自己一个做项目的时候追求点效率倒也无所谓了。但要是和其他同学一起做项目、维护代码,写带有魔法值的代码无疑会让他人难以理解,如果再不写注释,可能他们连杀了你的心都会有了。

第二,魔法值还会影响开发的 效率和准确性。

还是拿开头那段代码为例,喷我的同学根本没有把代码文件完整读完,其实在该文件中,我不止一次使用到了 ERROR_MESSAGE 这一常量:

  1. // 错误提示 
  2. const ERROR_MESSAGE = "操作失败"
  3.  
  4. // 删除资源 
  5. const result = deleteResource();  
  6. if(!result) { 
  7.   alert(ERROR_MESSAGE); 
  8. // 修改资源 
  9. const result = updateResource();  
  10. if(!result) { 
  11.   alert(ERROR_MESSAGE); 
  12.  
  13. ... 

如果像他说的一样,不去定义常量,而是直接用魔法字符串,那么每次要弹出 “操作失败” 时,我都要重复去打这几个字,浪费时间的同时,还存在打错字的风险。而如果使用预定义的常量,就能很轻松地利用开发工具提供的代码提示和补全功能。

代码补全

此外,魔法值还会影响代码的 易修改性。

假如说同一个魔法字符串在代码中多次出现,那当我要修改字符串文案时,就要人工一个个地去找到这个字符串进行修改,即使可以用开发工具提供的搜索和全局替换功能,但也要去检查一遍,非常麻烦。

  1. alert("你操作失败了"); 
  2. alert("你操作失败了"); 
  3. alert("你操作失败了"); 

而如果将字符串定义为常量,只用在定义处修改它的值即可。此时的常量名,倒像是魔法值的一个指针了。

  1. const ERROR_MESSAGE = "你操作失败了" 
  2. alert("ERROR_MESSAGE"); 
  3. alert("ERROR_MESSAGE"); 
  4. alert("ERROR_MESSAGE"); 

解决魔法值

正因为魔法值对代码有很大的危害,所以各种代码规范中,都建议开发者不要使用魔法值。

解决魔法值的方式很简单,其实上面已经讲到了,就是为一系列相同的值定义一个 常量。注意是常量,不是变量!因为魔法值的内容一般是固定的,其本身结构不会被修改。

对于一系列的魔法值,建议定义为一个枚举或单独的常量类,比如资源有很多审核状态,可以把所有状态集中定义。

JavaScript 代码:

  1. const REVIEW_STATUS = { 
  2.   // 待审核 
  3.   WAITING: 0, 
  4.   // 通过 
  5.   PASS: 1, 
  6.   // 拒绝 
  7.   REJECT: 2 

Java 代码:

  1. public enum ReviewStatus { 
  2.   WAITING, PASS, REJECT 

 

希望本期分享对大家有帮助,千万不要再写烂代码啦!

 

来源:程序员鱼皮内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯