Js代码简练之道

访客4年前黑客资讯334

简介

若是你关注代码自己和代码的编写方式,而不是只体贴它是否能事情,那么你写代码是有一定的水准。专业开发人员将为未来的自己和“其他人”编写代码,而不仅仅只编写当前能事情就行的代码。

在此基础上,简练代码可以界说为自注释的、易于人明白的、易于更改或扩展的代码。

以下列表一些好编写方式,仅供参考,固然,若是你有更好的方式,迎接留言。


1. 强类型检查

用===取代 ==

// 若是处置欠妥,它会极大地影响程序逻辑。这就像,你想向左走,但由于某种缘故原由,你向右走
0 == false // true
0 === false // false
2 == "2" // true
2 === "2" // false

// 例子
const value = "500";
if (value === 500) {
  console.log(value);
  // 条件不建立,不会进入
}

if (value === "500") {
  console.log(value);
  // 条件建立,会进入
}


2.变量

用着名其意的方式为变量命名,通过这种方式,当一个人看到它们时,易于搜索和明白。

欠好的方式:

let daysSLV = 10;
let y = new Date().getFullYear();

let ok;
if (user.age > 30) {
  ok = true;
}

好的方式:

const MAX_AGE = 30;
let daysSinceLastVisit = 10;
let currentYear = new Date().getFullYear();

...

const isUserOlderThanAllowed = user.age > MAX_AGE;

不要在变量名中添加分外的不需要的单词。

欠好的方式:

let nameValue;
let theProduct;

好的方式:

let name;
let product;

不要简写变量上下文。

欠好的方式:

const users = ["John", "Marco", "Peter"];
users.forEach(u => {
  doSomething();
  doSomethingElse();
  // ...
  // ...
  // ...
  // ...
  // 当上面代码许多的时刻 ,这 `u` 是什么鬼
  register(u);
});

好的方式:

const users = ["John", "Marco", "Peter"];
users.forEach(user => {
  doSomething();
  doSomethingElse();
  // ...
  // ...
  // ...
  // ...
  register(user);
});

不要添加不必要的上下文。

欠好的方式:

const user = {
  userName: "John",
  userSurname: "Doe",
  userAge: "28"
};

...

user.userName;

好的方式:

const user = {
  name: "John",
  surname: "Doe",
  age: "28"
};

...

user.name;


3. 函数

使用长而具有描述性的名称。 考虑到函数示意某种行为,函数名称应该是动词或短​​语,用以说明其背后的意图以及参数的意图。 函数的名字应该说明他们做了什么。

欠好的方式:

function notif(user) {
  // implementation
}

好的方式:

function notifyUser(emailAddress) {
  // implementation
}

制止使用大量参数。 理想情形下,函数应该指定两个或更少的参数。 参数越少,测试函数就越容易,参数多的情形可以使用工具。

欠好的方式:

function getUsers(fields, fromDate, toDate) {
  // implementation
}

好的方式:

function getUsers({ fields, fromDate, toDate }) {
  // implementation
}

getUsers({
  fields: ['name', 'surname', 'email'],
  fromDate: '2019-01-01',
  toDate: '2019-01-18'
});

使用默认参数替换 || 操作

欠好的方式:

function createShape(type) {
  const shapeType = type || "cube";
  // ...
}

好的方式:

function createShape(type = "cube") {
  // ...
}

一个函数应该只做一件事,不要在一个函数中执行多个操作。

欠好的方式:

function notifyUsers(users) {
  users.forEach(user => {
    const userRecord = database.lookup(user);
    if (userRecord.isVerified()) {
      notify(user);
    }
  });
}

好的方式:

function notifyVerifiedUsers(users) {
  users.filter(isUserVerified).forEach(notify);
}

function isUserVerified(user) {
  const userRecord = database.lookup(user);
  return userRecord.isVerified();
}

使用Object.assign设置工具默认值。

欠好的方式:

const shapeConfig = {
  type: "cube",
  width: 200,
  height: null
};

function createShape(config) {
  config.type = config.type || "cube";
  config.width = config.width || 250;
  config.height = config.height|| 250;
}


createShape(shapeConfig);

好的方式:

const shapeConfig = {
  type: "cube",
  width: 200
  // Exclude the 'height' key
};

function createShape(config) {
  config = Object.assign(
    {
      type: "cube",
      width: 250,
      height: 250
    },
    config
  );

  ...
}

createShape(shapeConfig);

不要使用标志作为参数,由于它们告诉函数做的比它应该做的多。

欠好的方式:

function createFile(name, isPublic) {
  if (isPublic) {
    fs.create(`./public/${name}`);
  } else {
    fs.create(name);
  }
}

好的方式:

function createFile(name) {
  fs.create(name);
}

function createPublicFile(name) {
  createFile(`./public/${name}`);
}

不要污染全局变量。 若是需要扩展现有工具,请使用ES类和继续,而不是在原生工具的原型链上建立函数。

欠好的方式:

Array.prototype.myFunc = function myFunc() {
  // implementation
};

好的方式:

class SuperArray extends Array {
  myFunc() {
    // implementation
  }
}


4. 条件

制止使用反面条件。

欠好的方式:

function isUserNotBlocked(user) {
  // implementation
}

if (!isUserNotBlocked(user)) {
  // implementation
}

好的方式:

function isUserBlocked(user) {
  // implementation
}

if (isUserBlocked(user)) {
  // implementation
}

使用条件简写。这可能微不足道,但值得一提。仅对布尔值使用此方式,而且若是你确信该值不会是undefined 或null的,则使用此方式。

欠好的方式:

if (isValid === true) {
  // do something...
}

if (isValid === false) {
  // do something...
}

好的方式:

if (isValid) {
  // do something...
}

if (!isValid) {
  // do something...
}

尽可能制止条件句,而是使用多态性和继续。

欠好的方式:

class Car {
  // ...
  getMaximumSpeed() {
    switch (this.type) {
      case "Ford":
        return this.someFactor() + this.anotherFactor();
      case "Mazda":
        return this.someFactor();
      case "McLaren":
        return this.someFactor() - this.anotherFactor();
    }
  }
}

好的方式:

class Car {
  // ...
}

class Ford extends Car {
  // ...
  getMaximumSpeed() {
    return this.someFactor() + this.anotherFactor();
  }
}

class Mazda extends Car {
  // ...
  getMaximumSpeed() {
    return this.someFactor();
  }
}

class McLaren extends Car {
  // ...
  getMaximumSpeed() {
    return this.someFactor() - this.anotherFactor();
  }
}


5. 类

class 是JavaScript中新的语法糖。一切事情就像以前的原型,只是它现在看起来差别,你应该更喜欢他们比ES5通俗功效。

欠好的方式:

const Person = function(name) {
  if (!(this instanceof Person)) {
    throw new Error("Instantiate Person with `new` keyword");
  }

  this.name = name;
};

Person.prototype.sayHello = function sayHello() { /**/ };

const Student = function(name, school) {
  if (!(this instanceof Student)) {
    throw new Error("Instantiate Student with `new` keyword");
  }

  Person.call(this, name);
  this.school = school;
};

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.printSchoolName = function printSchoolName() { /**/ };

好的方式:

class Person {
  constructor(name) {
    this.name = name;
  }

  sayHello() {
    /* ... */
  }
}

class Student extends Person {
  constructor(name, school) {
    super(name);
    this.school = school;
  }

  printSchoolName() {
    /* ... */
  }
}

使用链接。许多库(如jQuery和Lodash)都使用这种模式。在类中,只需在每个函数的末尾返回this就可以将更多的该类方式链接到它上。

欠好的方式:

class Person {
  constructor(name) {
    this.name = name;
  }

  setSurname(surname) {
    this.surname = surname;
  }

  setAge(age) {
    this.age = age;
  }

  save() {
    console.log(this.name, this.surname, this.age);
  }
}

const person = new Person("John");
person.setSurname("Doe");
person.setAge(29);
person.save();

好的方式:

class Person {
  constructor(name) {
    this.name = name;
  }

  setSurname(surname) {
    this.surname = surname;
    // Return this for chaining
    return this;
  }

  setAge(age) {
    this.age = age;
    // Return this for chaining
    return this;
  }

  save() {
    console.log(this.name, this.surname, this.age);
    // Return this for chaining
    return this;
  }
}

const person = new Person("John")
    .setSurname("Doe")
    .setAge(29)
    .save();


总结

这只是改善代码的一小部门。一样平常生涯入,这里所说的原则是人们通常不遵守的原则。他们尝试着去做,但出于种种缘故原由,就没有坚持下去。也许在项目开始时,代码是简练的,然则当要在停止日期前完成时,这些原则常常被忽略,并被转移到“TODO”或“REFACTOR”部门。在这一点上,你的客户更希望您在最后限期之前完成任务,而不是编写简练的代码。


原文:https://devinduct.com/blogpost/22/javascript-clean-code-best-practices
翻译:https://github.com/qq449245884/xiaozhi/issues/56



思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

相关文章

蚂蚁庄园8月7日正确答案 哪种塑料外卖打包盒可以放进微波炉加热?

蚂蚁庄园8月7日正确答案 哪种塑料外卖打包盒可以放进微波炉加热?

哪种塑料外卖打包盒可以放进微波炉加热?这是蚂蚁庄园8月7号今日庄园小课堂的问题,很多用户还不知道答案,本文小编会为大家详细介绍8月7日今天蚂蚁庄园课堂小鸡饲料答案。 蚂蚁庄园回答知识送饲料活动开...

信阳毛尖属于什么茶(喝毛尖有什么好处)

信阳毛尖属于什么茶(喝毛尖有什么好处)

    毛尖属于什么茶? 毛尖,属于绿茶类,被誉为“绿茶之王”。信阳毛尖新鲜的茶叶从茶树上采摘下来后经过杀青、揉捏、干燥等工序制作而成,完全符合绿茶的特性,因此,信阳毛尖属于绿茶类,同时信阳...

网上兼职赚钱方法有哪些,教你月入6000+小意思!

网上兼职赚钱方法有哪些,教你月入6000+小意思!

小编通过自己摸索几年,通过网络兼职也赚到了点生活费,在这里跟大家分享: 1、设置浏览器主页、安装软件类赚钱 第一次接触2345网站还以为又是骗人的把戏,但是坚持做了一个多星期,真的有收入,后来...

村民举报无所畏惧事迹被人顶替怎么回事?当地回应已睁开观察

前不久,安徽省亳州涡阳群众揭发称自身无所畏惧被学生取代获中国好人。7月10日, 涡阳县委宣传部宣布通告称,已深入调查,有关状态将立刻公布。 前不久,安徽省亳州涡阳群众郭刚揭发称,自身年三月无所畏惧的...

怎么找黑客查他人手机号码-黑客可以厉害到什么程度(黑客到底可以厉害

游戏发展国员工怎么变黑客小小盗号器的激活码是什么(qq盗号授权码)黑客游戏手机版怎么玩世界上最厉害的黑客军团都是谁(黑客军团第一季)怎么用黑客技术知道别人的地址求黑客改成绩(黑客改成绩)黑客工具怎么卸...

查酒店入住记录(怎么在线查开的房记录查询)

查酒店餐厅搬入纪录(么线上查开的房查询记录)   不,牵涉到顾客的隐私保护,大部分人去问酒店餐厅都不容易表露,不然是违反职业道德规范的。你想一想,如果有居心叵测的人还告知另一方去破案,另一方给了顾...