返回顶部
首页 > 资讯 > 前端开发 > VUE >分析JavaScript代码整洁之道
  • 536
分享到

分析JavaScript代码整洁之道

2024-04-02 19:04:59 536人浏览 泡泡鱼
摘要

本篇内容主要讲解“分析javascript代码整洁之道”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript代码整洁之道”吧!1. 用命名的变量

本篇内容主要讲解“分析javascript代码整洁之道”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript代码整洁之道”吧!

1. 用命名的变量代替数组下标

// bad
const address = "One Infinite Loop, Cupertino 95014";
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
saveCityZipCode(
  // 下标1,2不易于理解
  address.match(cityZipCodeRegex)[1],
  address.match(cityZipCodeRegex)[2]
);
// Good
const address = "One Infinite Loop, Cupertino 95014";
const cityZipCodeRegex = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/;
// 使用数组解构更好的命名变量
const [, city, zipCode] = address.match(cityZipCodeRegex) || [];
saveCityZipCode(city, zipCode);

2. 函数的参数最好<=2个,尽量避免3个。

如果有很多参数就利用object传递,并使用解构。

3. 一个函数只做一件事。

好处在于compose, test, and reason about。

4. 不要自行扩展原型

如果想扩展原型,可以先继承再添加方法,防止污染。

// bad
Array.prototype.diff = function diff(comparisonArray) {
  const hash = new Set(comparisonArray);
  return this.filter(elem => !hash.has(elem));
};
// good
class SuperArray extends Array {
  diff(comparisonArray) {
    const hash = new Set(comparisonArray);
    return this.filter(elem => !hash.has(elem));
  }
}

5. 用多态来代替条件语句

// bad
if (type === 'text') {
    // do something
} else if (type === 'select') {
    // do something else
}

个人写这种代码的一种常用方式是:

const control = {
    text: {
        mapper() {},
        restore(){},
        name: 'this is a text field',
    },
    select: {
        mapper() {},
        restore(){},
        name: 'this is a select field',
    }
}
control[type].mapper();

实际上就是多态(polymorphism),也可以考虑用class的方式,大概这样:

class Field {
    ...
}
class TextField extends Field {
    mapper(){}
    restore(){}
    name = 'this is a text field';
}
class SelectField extends Field {
    mapper(){}
    restore(){}
    name = 'this i```s a select field';
}
  1. 使用getter和setter函数。

// bad
function makeBankAccount() {
  // ...
  return {
    balance: 0
    // ...
  };
}
const account = makeBankAccount();
account.balance = 100;
// good
function makeBankAccount() {
  // this one is private
  let balance = 0;
  // a "getter", made public via the returned object below
  function getBalance() {
    return balance;
  }
  // a "setter", made public via the returned object below
  function setBalance(amount) {
    // ... validate before updating the balance
    balance = amount;
  }
  return {
    // ...
    getBalance,
    setBalance
  };
}
const account = makeBankAccount();
account.setBalance(100);

你可以在getter和setter里面做很多事情而不需要修改每一个.balance的地方。

7. Prefer composition over inheritance

尽量用组合来代替继承,什么情况下用继承:

Your inheritance represents an "is-a" relationship and not a "has-a" relationship (Human->Animal vs. User->UserDetails).
You can reuse code from the base classes (Humans can move like all animals).
You want to make global changes to derived classes by changing a base class. (Change the caloric expenditure of all animals when they move).

8. SOLID

Single Responsibility Principle 单一职责原则

There should never be more than one reason for a class to change,一个类被改变的原因数量应该尽可能降低。如果一个类中---功能太多,当你修改其中一点时会无法估量任何引用该类的模块所受到的影响。

Open/Closed Principle 开放封闭原则

用户可以在不修改内部实现的前提下自行扩展功能。例如有一个Http模块,内部会根据环境判断用哪个adaptor。如果用户要添加adaptor就必须修改Http模块。

// bad
class ajaxAdapter extends Adapter {
  constructor() {
    super();
    this.name = "ajaxAdapter";
  }
}
class nodeAdapter extends Adapter {
  constructor() {
    super();
    this.name = "nodeAdapter";
  }
}
class HttpRequester {
  constructor(adapter) {
    this.adapter = adapter;
  }
  fetch(url) {
    if (this.adapter.name === "ajaxAdapter") {
      return makeAjaxCall(url).then(response => {
        // transfORM response and return
      });
    } else if (this.adapter.name === "nodeAdapter") {
      return makeHttpCall(url).then(response => {
        // transform response and return
      });
    }
  }
}
function makeAjaxCall(url) {
  // request and return promise
}
function makeHttpCall(url) {
  // request and return promise
}
// good
class AjaxAdapter extends Adapter {
  constructor() {
    super();
    this.name = "ajaxAdapter";
  }
  request(url) {
    // request and return promise
  }
}
class NodeAdapter extends Adapter {
  constructor() {
    super();
    this.name = "nodeAdapter";
  }
  request(url) {
    // request and return promise
  }
}
class HttpRequester {
  constructor(adapter) {
    this.adapter = adapter;
  }
  fetch(url) {
    return this.adapter.request(url).then(response => {
      // transform response and return
    });
  }
}

Liskov Substitution Principle 里式替换原则

父类和子类应该可以被交换使用而不会出错。

// bad
class Rectangle {
  constructor() {
    this.width = 0;
    this.height = 0;
  }
  setColor(color) {
    // ...
  }
  render(area) {
    // ...
  }
  setWidth(width) {
    this.width = width;
  }
  setHeight(height) {
    this.height = height;
  }
  getArea() {
    return this.width * this.height;
  }
}
class Square extends Rectangle {
  setWidth(width) {
    this.width = width;
    this.height = width;
  }
  setHeight(height) {
    this.width = height;
    this.height = height;
  }
}
function renderLargeRectangles(rectangles) {
  rectangles.forEach(rectangle => {
    rectangle.setWidth(4);
    rectangle.setHeight(5);
    const area = rectangle.getArea(); // BAD: Returns 25 for Square. Should be 20.
    rectangle.render(area);
  });
}
const rectangles = [new Rectangle(), new Rectangle(), new Square()];
renderLargeRectangles(rectangles);

上面的Rectangle不能直接替换Square,因为会导致计算面积错误,考虑将计算面积的方法抽象出来:

class Shape {
  setColor(color) {
    // ...
  }
  render(area) {
    // ...
  }
}
class Rectangle extends Shape {
  constructor(width, height) {
    super();
    this.width = width;
    this.height = height;
  }
  getArea() {
    return this.width * this.height;
  }
}
class Square extends Shape {
  constructor(length) {
    super();
    this.length = length;
  }
  getArea() {
    return this.length * this.length;
  }
}
function renderLargeShapes(shapes) {
  shapes.forEach(shape => {
    const area = shape.getArea();
    shape.render(area);
  });
}
const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)];
renderLargeShapes(shapes);

Interface Segregation Principle 接口隔离原则

Clients should not be forced to depend upon interfaces that they do not use。举例来说,一个功能模块需要设计必须传的参数和可选参数,不应该强迫用户使用可选参数。

Dependency Inversion Principle 依赖注入原则

// bad
class InventoryRequester {
  constructor() {
    this.REQ_METHODS = ["HTTP"];
  }
  requestItem(item) {
    // ...
  }
}
class InventoryTracker {
  constructor(items) {
    this.items = items;
    // BAD: We have created a dependency on a specific request implementation.
    // We should just have requestItems depend on a request method: `request`
    this.requester = new InventoryRequester();
  }
  requestItems() {
    this.items.forEach(item => {
      this.requester.requestItem(item);
    });
  }
}
const inventoryTracker = new InventoryTracker(["apples", "bananas"]);
inventoryTracker.requestItems();

上面例子在于,InventoryTracker内部实例化了InventoryRequester,也就意味着high-level的模块需要知道low-level模块的细节(比如实例化InventoryRequester需要知道它的构造参数等,或者说需要import该模块,造成耦合)。

// good
class InventoryTracker {
  constructor(items, requester) {
    this.items = items;
    this.requester = requester;
  }
  requestItems() {
    this.items.forEach(item => {
      this.requester.requestItem(item);
    });
  }
}
class InventoryRequesterV1 {
  constructor() {
    this.REQ_METHODS = ["HTTP"];
  }
  requestItem(item) {
    // ...
  }
}
class InventoryRequesterV2 {
  constructor() {
    this.REQ_METHODS = ["WS"];
  }
  requestItem(item) {
    // ...
  }
}
// By constructing our dependencies externally and injecting them, we can easily
// substitute our request module for a fancy new one that uses websockets.
const inventoryTracker = new InventoryTracker(
  ["apples", "bananas"],
  new InventoryRequesterV2()
);
inventoryTracker.requestItems();

直接传入low-level的实例而不需要考虑它是如何被实例化的,high-level只需要依赖抽象的接口就可以完成对子模块的调用。

9. 注释

Comments are an apology, not a requirement. Good code mostly documents itself. 好的代码是自解释的。

你会经常地遇到 bug 和其它一些问题。这可能会让人沮丧,但你要尽量保持冷静,并系统地去思考。记住实践是解决问题的最佳方法。

到此,相信大家对“分析JavaScript代码整洁之道”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 分析JavaScript代码整洁之道

本文链接: https://lsjlt.com/news/85596.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分析JavaScript代码整洁之道
    本篇内容主要讲解“分析JavaScript代码整洁之道”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript代码整洁之道”吧!1. 用命名的变量...
    99+
    2024-04-02
  • 代码整洁之道的方法有哪些
    这篇文章主要讲解了“代码整洁之道的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“代码整洁之道的方法有哪些”吧!可读的代码是可维护的在这篇短文中,我...
    99+
    2024-04-02
  • Laravel 代码简洁之道(Clean Code)
    我最近看到了一条Twitter,其中 @samuelstancl列出了在 Laravel 中编写更干净代码的技巧, 以及一些通用的 Laravel 编码建议。 这些是培养对什么是好的代码和什么是坏的代码的感觉的一个很好的起点 - 所以我在下...
    99+
    2022-06-17
    Laravel 简洁
  • JavaScript如何实现代码整洁
    这篇文章主要介绍JavaScript如何实现代码整洁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述一张幽默的图片:软件质量通过你在阅读代码的时候有多少报怨来进行评估Robert ...
    99+
    2024-04-02
  • PHP 的代码简洁之道(Clean Code PHP)
    介绍 Robert C.Martin’s 的 软件工程师准则 Clean Code 同样适用于 PHP。它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码。 并非所有的准则都必须严格遵守...
    99+
    2023-09-05
    php Clean Code PHP Powered by 金山文档
  • Python 代码整洁之道:封装与抽象类的金科玉律
    ...
    99+
    2024-04-02
  • JavaScript Babel 精要:保持代码整洁优雅
    语法转换 Babel 的核心功能是语法转换。它允许开发者在旧版 JavaScript 中使用 ES6+ 语法,例如箭头函数、类的语法和模板字面值。这种转换简化了代码,使其更简洁、更易于理解。 例如,使用 Babel,可以将 ES6 的箭头...
    99+
    2024-04-02
  • AMD的模块化魔法:让JavaScript代码变得整洁
    模块化是现代JavaScript开发中至关重要的概念,它允许将代码组织成可重用、可维护的模块。AMD(Asynchronous Module Definition)是一种模块化规范,它定义了在异步环境中加载和定义模块的方法。 AMD的优势...
    99+
    2024-02-18
    AMD JavaScript 模块化
  • Stream API 与 Lambda 表达式:简洁、高效的代码之道
    ...
    99+
    2024-04-02
  • Web前端有哪些整洁的代码
    本篇内容主要讲解“Web前端有哪些整洁的代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Web前端有哪些整洁的代码”吧!一、DOCTYPE的声明如果我们想做好...
    99+
    2024-04-02
  • JavaScript模块化:让代码更整洁、更高效的魔法秘诀
    众所周知,JavaScript模块化是一项非常有用的技术,它可以帮助开发者编写更整洁、更高效的代码。那么,JavaScript模块化究竟是如何实现的呢?在本文中,我们将详细介绍JavaScript模块化的实现原理,并通过一些示例演示如何使...
    99+
    2024-02-26
    JavaScript、代码模块化、代码组织、可维护性、可重用性
  • Golang之美:简洁易懂的代码
    标题:Golang简洁之美:代码简单易懂 Go语言(Golang)自诞生以来便以其简洁、高效的特点受到了广泛青睐。作为一门静态类型的编程语言,Go语言在语法设计上追求简单、清晰,鼓励开...
    99+
    2024-02-25
    golang 简洁 易懂 go语言
  • 高效整洁CSS代码原则有哪些
    今天就跟大家聊聊有关高效整洁CSS代码原则有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 适当的代码注释代码注释可以让别人更容易读懂你的代...
    99+
    2024-04-02
  • 您是否知道这些函数可以使您的 JavaScript 代码更简洁?
    JavaScript 是一种十分强大的编程语言,但是它的语法有时候会让人感到头疼。如果您正在寻找一些方法来使您的代码更简洁,那么您来对地方了!本文将介绍几个有用的函数,这些函数可以使您的 JavaScript 代码更加简洁。 Array....
    99+
    2023-11-05
    编程算法 函数 javascript
  • Node.js ESLint:让你的代码更整洁、更规范
    如何使用 ESLint 安装 ESLint 要在你的项目中使用 ESLint,首先需要安装它。你可以使用 npm 或 yarn 来安装 ESLint。 npm install eslint --save-dev // or yarn ...
    99+
    2024-02-13
    ESLint JavaScript 代码检查 规则 扩展
  • VUE Mixins 实践之道:组件复用与代码简洁的实战攻略
    Vue Mixins 是 Vue.js 提供的组件复用机制,它允许开发者在多个组件中共享代码。这不仅可以使代码更简洁,还可提高可维护性。在本文中,我们将通过多个实用示例,深入剖析 Vue Mixins 的应用之道,助力开发者提升代码的可...
    99+
    2024-02-13
    Vue Mixins 组件复用 代码简洁 Vue.js
  • GoFmt命令:代码格式化利器,保持代码整洁美观
    gofmt 命令是一个代码格式化工具,可自动格式化 go 源代码,使其符合 go 语言风格指南的约定,从而提高代码的可读性、一致性和美观性。使用方法:在终端输入 gofmt source...
    99+
    2024-04-08
    编程 代码格式化
  • 21 个简洁的 JavaScript单行代码技巧
    JavaScript 发展至今已经变得越来越强大,且广泛用于前端和后端开发。 作为一名前端程序员,不断的学习精进技巧,了解JS的最新发展也是非常必要的,而简洁的一行代码示例就是很好的方法。 今天,我们有 21 个JavaScript单行代码...
    99+
    2023-10-21
    okhttp
  • JavaScript 模块化新时代:告别混乱,拥抱整洁
    CommonJS 模块化 CommonJS 是早期 JavaScript 模块化的规范,主要用于服务器端开发。它规定了使用 require() 函数导入模块和使用 exports 对象导出模块的机制。CommonJS 模块具有同步加载的特...
    99+
    2024-04-02
  • javascript入门实例代码分析
    这篇文章主要介绍“javascript入门实例代码分析”,在日常操作中,相信很多人在javascript入门实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作