iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 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://www.lsjlt.com/news/85596.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分析JavaScript代码整洁之道
    本篇内容主要讲解“分析JavaScript代码整洁之道”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript代码整洁之道”吧!1. 用命名的变量...
    99+
    2024-04-02
  • 代码整洁之道的方法有哪些
    这篇文章主要讲解了“代码整洁之道的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“代码整洁之道的方法有哪些”吧!可读的代码是可维护的在这篇短文中,我...
    99+
    2024-04-02
  • 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
  • 高效整洁CSS代码原则有哪些
    今天就跟大家聊聊有关高效整洁CSS代码原则有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 适当的代码注释代码注释可以让别人更容易读懂你的代...
    99+
    2024-04-02
  • JavaScript模块化:让代码更整洁、更高效的魔法秘诀
    众所周知,JavaScript模块化是一项非常有用的技术,它可以帮助开发者编写更整洁、更高效的代码。那么,JavaScript模块化究竟是如何实现的呢?在本文中,我们将详细介绍JavaScript模块化的实现原理,并通过一些示例演示如何使...
    99+
    2024-02-26
    JavaScript、代码模块化、代码组织、可维护性、可重用性
  • Golang之美:简洁易懂的代码
    标题:Golang简洁之美:代码简单易懂 Go语言(Golang)自诞生以来便以其简洁、高效的特点受到了广泛青睐。作为一门静态类型的编程语言,Go语言在语法设计上追求简单、清晰,鼓励开...
    99+
    2024-02-25
    golang 简洁 易懂 go语言
  • 您是否知道这些函数可以使您的 JavaScript 代码更简洁?
    JavaScript 是一种十分强大的编程语言,但是它的语法有时候会让人感到头疼。如果您正在寻找一些方法来使您的代码更简洁,那么您来对地方了!本文将介绍几个有用的函数,这些函数可以使您的 JavaScript 代码更加简洁。 Array....
    99+
    2023-11-05
    编程算法 函数 javascript
  • VUE Mixins 实践之道:组件复用与代码简洁的实战攻略
    Vue Mixins 是 Vue.js 提供的组件复用机制,它允许开发者在多个组件中共享代码。这不仅可以使代码更简洁,还可提高可维护性。在本文中,我们将通过多个实用示例,深入剖析 Vue Mixins 的应用之道,助力开发者提升代码的可...
    99+
    2024-02-13
    Vue Mixins 组件复用 代码简洁 Vue.js
  • Node.js ESLint:让你的代码更整洁、更规范
    如何使用 ESLint 安装 ESLint 要在你的项目中使用 ESLint,首先需要安装它。你可以使用 npm 或 yarn 来安装 ESLint。 npm install eslint --save-dev // or yarn ...
    99+
    2024-02-13
    ESLint JavaScript 代码检查 规则 扩展
  • GoFmt命令:代码格式化利器,保持代码整洁美观
    gofmt 命令是一个代码格式化工具,可自动格式化 go 源代码,使其符合 go 语言风格指南的约定,从而提高代码的可读性、一致性和美观性。使用方法:在终端输入 gofmt source...
    99+
    2024-04-08
    编程 代码格式化
  • JavaScript中null实例代码分析
    这篇“JavaScript中null实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • javascript入门实例代码分析
    这篇文章主要介绍“javascript入门实例代码分析”,在日常操作中,相信很多人在javascript入门实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java...
    99+
    2024-04-02
  • 21 个简洁的 JavaScript单行代码技巧
    JavaScript 发展至今已经变得越来越强大,且广泛用于前端和后端开发。 作为一名前端程序员,不断的学习精进技巧,了解JS的最新发展也是非常必要的,而简洁的一行代码示例就是很好的方法。 今天,我们有 21 个JavaScript单行代码...
    99+
    2023-10-21
    okhttp
  • Springboot整合Dubbo之代码集成和发布的示例分析
    这篇文章主要介绍了Springboot整合Dubbo之代码集成和发布的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1. boot-dubbo-api相关打...
    99+
    2023-05-30
    springboot dubbo
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作