今天通过一件事情,分享写代码时的一个重要小技巧。

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

// 错误提示
const ERROR_MESSAGE = "操作失败";// 删除资源
const result = deleteResource();
if(!result) {alert(ERROR_MESSAGE);
}

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

// 删除资源
const result = deleteResource();
if(!result) {alert("操作失败");
}

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

魔法值

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

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

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

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

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

魔法值的问题

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

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

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

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

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

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

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

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

// 错误提示
const ERROR_MESSAGE = "操作失败";// 删除资源
const result = deleteResource();
if(!result) {alert(ERROR_MESSAGE);
}
// 修改资源
const result = updateResource();
if(!result) {alert(ERROR_MESSAGE);
}...

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

代码补全

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

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

alert("你操作失败了");
alert("你操作失败了");
alert("你操作失败了");

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

const ERROR_MESSAGE = "你操作失败了"
alert("ERROR_MESSAGE");
alert("ERROR_MESSAGE");
alert("ERROR_MESSAGE");

解决魔法值

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

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

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

JavaScript 代码:

const REVIEW_STATUS = {// 待审核WAITING: 0,// 通过PASS: 1,// 拒绝REJECT: 2
}

Java 代码:

public enum ReviewStatus {WAITING, PASS, REJECT
}

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

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

  1. python在哪里写代码比较适合-AI辅助写代码,Python之父都爱不释手的工具

    我刚看到这个工具的时候,也是一脸懵x,AI?机器学习?辅助?如果能全自动写出代码得多好,不过真要是这样,在座各位的就业危机就彻底来了. 言归正传,这个工具是-- kite 这是一款IDE插件,使用机器 ...

  2. 详解python框架django为例,还没开始写代码前的花式坑——解决办法和排错思路。pycharm解释器配置,虚拟环境venv配置,使用命令行。

    如果你现在赶项目,就直接跳到符合的标题查看解决办法.如果你对理论思考不太感冒,也可以直接跳到指定标题. 如果你是学习者,极客,时间充足,希望你能够耐心的看下去,因为你在这里,不仅仅可以找到解决办法,更 ...

  3. python写代码工具_AI辅助写代码,Python之父都爱不释手的工具

    我刚看到这个工具的时候,也是一脸懵x,AI?机器学习?辅助?如果能全自动写出代码得多好,不过真要是这样,在座各位的就业危机就彻底来了. 言归正传,这个工具是-- kite 这是一款IDE插件,使用机器 ...

  4. 用Macbook-苹果系统写代码出现显示问题Text input context does not respond to _valueForTIProperty:

    Macbook / 苹果系统写代码出现显示问题 当使用Mac系统,在写代码的时候,如果是有一个GUI显示界面,然后你又去点击这个界面.此时,将报错. 我的源代码,是读取图片,显示图片. import ...

  5. server vscode中的live_太方便了!这款神器能在浏览器中运行 VS Code,随时随地写代码...

    最近看到 iPadOS 出来了,各种牛逼的操作真的很有吸引力,于是咬咬牙买了 iPad air.买来之后,当然是研究怎么提高效率了,于是就寻找.研究各种高效的软件.折腾了一段时间,各种 APP 都找得 ...

  6. 写代码可能是成为软件工程师最容易的部分

    当然,写代码是超级重要的,但是我认为它只是整个过程中的一小部分,且不一定是最难学的. 学习如何写代码要花些时间,但是只要有足够的训练(每天写代码,坚持数年),你就能真正擅长它. 你知道的,我相信在某种 ...

  7. 别只顾着写代码,学会这 25 条比涨工资都重要,你信不?

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取4T学习资料 如果每个程序开发人员都只是周 ...

  8. 985大学的高材生只会写代码片段,丢人吗?

    很多同学在学习编程的时候都会遇到各种各样的难题,比如:没有合适的资料.学习过于碎片化.资料的质量层次不齐.看了很多视频自己动手时却还是不会.接触不到完整项目.无法检测自己的编程水平是不是企业所认可的- ...

  9. 程序员门槛再被“神器”降低:只要会英文,就能写代码!

    近日,OpenAI带着他们最新.最神自动编码神器Codex霸榜各大科技媒体头条,我们知道OpenAI是微软投资的通用人工智能平台,而GitHub是微软旗下的代码托管平台,这样微软出算力.OpenAI出 ...

最新文章

  1. 阿里腾讯裁员冲上热搜,消息称最高涉及30%,官方未回应
  2. python编译成exe速度会变快吗_python如何编译成exe
  3. mysql bin的过期时间_Mysql设置binlog过期时间并自动删除
  4. python持久层框架_想设计一个Python的持久层框架
  5. MySQL中实现并、交、差
  6. LeNet-5——CNN经典网络模型详解(pytorch实现)
  7. mugen4g补丁如何使用_《守望先锋联赛》宣布采用英雄池机制及游戏补丁更新方式详解...
  8. windows远程连接linux中mysql数据库
  9. MATLAB-典型动态系统建模与仿真
  10. bp神经网络的算法步骤,BP神经网络算法流程图
  11. 深棕颜色html的色号,棕色rgb颜色值 有谁知道咖啡色的RGB值?
  12. 加拿大前十大学计算机硕士学费,2018年加拿大各大学硕士学费一览表!
  13. LeetCode:714. 买卖股票的最佳时机含手续费(python)
  14. LPMS1000-全自动压力校验系统
  15. 【分享】微信公众号在 “集简云平台“ 集成应用的常见问题与解决方案
  16. Android 对话框(Dialogs)
  17. [Golang]写文件的权限定义perm
  18. 408王道计算机网络强化——传输层和应用层
  19. 蓝桥杯——算法基础 逗志芃的暴走PYTHON
  20. 【无障碍】tabindex

热门文章

  1. delay在java中有什么用_java中DelayQueue的使用
  2. python 有什么一般人不知道的缺点_关于python,你知道它的优缺点吗?
  3. 10无法更新系统_华为EMUI系统或停留安卓11,无法更新
  4. 文字 竖排居中_学会了这几招,瞬间就搞定PPT文字排版问题!
  5. 什么是堆栈?内存中划分出按FIL0方式操作的特殊区域,叫做堆栈
  6. 3-8:类与对象下篇——友元函数、友元类和内部类
  7. numpy的常用函数 不断更新
  8. JS 原型对象(prototype)
  9. C/C++获取指定网口的IP地址
  10. twisted系列教程七–小插曲,延迟对象