云中风扬

导航

不要在你优雅的代码中出现魔法值!!!

魔法值,听着感觉像游戏中的技能条一样,其实一点关系也没有;

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

如果你正在浏览的代码中出现了魔法值,直接听我的,拿起刀,帮他重新做人。

接下来,举个例子:

第一

首先魔法值非常影响代码的可读性,可扩展性,可维护性。

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

上面的代码谁能告诉我1,2,3是什么意思???

如果有人说上面是我自己写的代码,我还能看不懂吗?

可以,同学你非常有勇气,等你等一个月,两个月,半年,一年之后你在来看,如果你记忆力好能记住,那算你牛,但是如果你如果跟同事,朋友一起开发,搞一个所谓的魔法值,能记住还可以。

但是如果你自己也不记得,而且连个注释也没有,那兄弟建议你连夜跑路把,不然我都担心你,活不过明天。

第二

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

// 错误提示
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");

第三

解决魔法值

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

  解决魔法值的方法很简单,就是为同一系列的相同的值定义一个常量。注意是常量,不是变量!!

因为魔法值的内容一般是固定的。其本身结构不会被修改。

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

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

 

posted on 2022-04-12 16:26  Lucky洋同学  阅读(303)  评论(0)    收藏  举报