让你的 JS 代码变得干净优雅且可维护

拒绝魔法

众所周知,魔法是这样的:

图片

哦,不是。。

在编程的世界里也有魔法,一般称其为:魔法数字,魔法变量,魔法字符串。例如这样:

const a = await abcdefg();
console.log(a === 200);
const b = await asdfgh();
if (b === 0) {
else if (b === 1) {
else if (b === 2) {};
for (let i = 0; i < 10; i++) {};

以上直接出现的,莫名其妙的变量名,字符串以及判断条件数字,就叫魔法。。。

这种写法写出来的代码晦涩难懂,难以维护,隐藏 BUG 多,除非你准备给接手的人埋坑,或者准备辞职,不然千万别这么写(容易被打断腿,👨‍🦽 )

那么怎么写才更优雅?

语义化

首先便是语义化。一个是变量,常量的语义化,例如:

const SUCCESS_STATUS = 200;
const requestStatus = await getStatus();
console.log(requestStatus === SUCCESS_STATUS);
const userRole = await getUserRole();
const GUEST_CODE = 0;
const USER_CODE = 1;
const ADMIN_CODE = 2;
if (userRole === GUEST_CODE) {
else if (userRole === USER_CODE) {
else if (userRole === ADMIN_CODE) {};
const MAX_NUM = 10;
const MIN_NUM = 0;
for (let currentNum = MIN_NUM; currentNum < MAX_NUM; currentNum++) {};

一般的规则就是变量用小写,常量用大写,把变量名语义化,那么当你看到这段代码的时候,一眼就能知道它是做什么的,而不是非得要浪费时间看完上下文,或者是猜。

枚举

对于上面判断 userRole 的代码,其实我们可以用更优雅的方式去实现,那就是 枚举

按照维基百科的说明:在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

其实就是组织收集有关联变量的一种方式。枚举的好处在于方便多状态的管理,以及可读性更强。例如:

const ROLES = {
  GUEST0,
  USER1,
  ADMIN2
};
const userRole = await getUserRole();
if (userRole === ROLES.GUEST) {
else if (userRole === ROLES.USER) {
else if (userRole === ROLES.ADMIN) {};

通过枚举的方式归纳起来,维护起来更方便,而且要添加状态直接在 ROLES 对象里写就行,更方便快捷。

策略模式

维基百科上说:策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

上面的代码依旧是可优化的,在这里我们可以利用策略模式来做进一层的优化。

具体的例子就是如下:

const ROLES = {
  GUEST0,
  USER1,
  ADMIN2
};
const ROLE_METHODS = {
  [ROLES.GUEST]() {},
  [ROLES.USER]() {},
  [ROLES.ADMIN]() {},
};
const userRole = await getUserRole();
ROLE_METHODS[userRole]();

通过上面的写法,我们可以知道,当我们需要增加角色,或者修改角色数字的时候,只需要修改 ROLES 里对应的字段,以及 ROLE_METHODS 里的方法即可,这样我们就可以将可能很冗长的 if...else 代码给抽离出来,颗粒度更细,更好维护。

更在状态

除了上面的方式之外,我们还可以利用“ 状态 ”的概念来写代码。在看代码之前,我们先了解下什么是 “有限状态机”。

根据维基百科的解释:有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机(英语:finite-state automation,缩写:FSA),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。

例如我们熟悉的 Promise ,它就是在状态集:PENDINFULFILLEDREJECTED  之间单向流转的有限状态机。

状态机的概念跟策略模式类似,实现方式也类似,这里面最大的不同是在于 “语义” 。

策略模式更适合于互不依赖,同时只能存在一个状态的场景,例如:

const 吃 = {
  沙县大酒店() {
    吃云吞()
  },
  开封菜() {
    吃汉堡()
  },
  在家() {
    吃外卖()
  }
};

这里面如果我们肚子饿了,就只能在 沙县大酒店()开封菜()在家() 这几个状态里选。

你不能都吃,当然以下情况除外。。。

图片

如果是状态模式,则会有这种情况:

const 打工人 = {
  起床() {},
  上班() {},
  加班() {},
  下班() {}
};
// 早上6点
打工人.起床();
// 早上9点
打工人.上班();
// 晚上6点
打工人.加班();
// 晚上12点
打工人.下班();

这里的打工人根据不同的时间,进行不同的任务,便是打工人模式,哦不,状态模式。这里的时间就是状态。

我们举个实际的业务例子,就是订单列表页,通常我们的订单可能有这几种状态:

图片

不同的状态展示的 UI 也不同,所以我们以不同的状态划分好模块之后,代码写起来就会清晰很多,我们以 Vue 代码为例:

// contants.js
export const ORDER_STATUS = {
  INIT0// 初始化
  CREATED1// 订单创建
  ARREARAGE2// 待支付
  PURCHASED3// 已购买
  SHIPPED4// 已发货
  COMPLETED5 // 已完成
};
// order.vue


让你的 JS 代码变得干净优雅且可维护

拒绝魔法众所周知,魔法是这样的:哦,不是。。在编程的世界里也…软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。上面的代码依旧是可优化的,在这里我们可以利用策略模式来做进一层的优化。具体的例子就是如下:const??=?{??:?,??:?,??:?};const?_?=?{…?:?,?//?待支付??:?,?//?已购买??:?,?/

17个机器学习的常用算法

根据数据类型的不同,对一个问题的建模有不同的方式。在机器学习…的分类类别;如何选择一个最佳的值,这取决于数据。一般情况下,在分类时较大的值能够减小噪声的影响。但会使类别之间的界限变得模糊。一个较好的值可通过各种启发式技术来获取,比如,交叉验证。另外噪声和非相关性特征向量的存在会使近邻算法的准确性减小。…点。来源:图灵人工智能仅用于学术分享,版权属于原作者。- -

互联网技术团队如何搭建自己的管理体系

背景现实中没有找到一个现成的体系将管理经验很好地归纳到一起,…求、技术架构三者之间的相互协同。由于多数互联网团队所做的业务都远谈不上成熟,支持它的技术团队在管理上也就不会有稳定的状态,持续改进是常态。要点:ean & aizen定量分析方案收集制度建设按强制程度排列:制度 > 规范 > 方法。制度建设…团队都可以根据实践经验整理出自己的管理体系,并且随着经验积累

为什么要学习少儿编程?这些理由你无法拒绝

快速上手,机器人可以连接很多传感器,让机器人实现很多功能,机器人搭建+编程的学习方式更生动,在学习编程的同时也可以激发孩子的创新能力。在幼儿园接触过简单机器人搭建、编程的小朋友,小学-年级再接触机器人编程,一点儿都不费劲!然而之前毫无基础,等小学-年级才开