JavaScript: 代码简洁之道
一、变量
1、用有意义且常用的单词命名变量
Bad: const yyyymmdstr = moment().format('YYYY/MM/DD'); Good: const currentDate = moment().format('YYYY/MM/DD');
2、保持统一
可能同一个项目对于获取用户信息,会有三个不一样的命名,应该保持统一。
Bad:getUserInfo();getClientData();getCustomerRecord(); Good:getUser()
3、每个常量都该命名
可以用 buddy.js 或者 ESLint 检测代码中未命名的常量。
Bad: // 三个月之后你还能知道 86400000 是什么吗? setTimeout(blastOff, 86400000);Good: const MILLISECOND_IN_A_DAY = 86400000; setTimeout(blastOff, MILLISECOND_IN_A_DAY);
4、可描述
通过一个变量生成了一个新变量,也需要为这个新变量命名,也就是说每个变量当你看到他第一眼你就知道他是干什么的。
Bad: const ADDRESS = 'One Infinite Loop, Cupertino 95014'; const CITY_ZIP_CODE_REGEX = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/; saveCityZipCode(ADDRESS.match(CITY_ZIP_CODE_REGEX)[1],ADDRESS.match(CITY_ZIP_CODE_REGEX)[2]);Good: const ADDRESS = 'One Infinite Loop, Cupertino 95014'; const CITY_ZIP_CODE_REGEX = /^[^,\\]+[,\\\s]+(.+?)\s*(\d{5})?$/; const [, city, zipCode] = ADDRESS.match(CITY_ZIP_CODE_REGEX) || []; saveCityZipCode(city, zipCode);
5、直接了当
bad
const locations = ['Austin', 'New York', 'San Francisco']; locations.forEach((l) => {doStuff();doSomeOtherStuff();// ...// ...// ...// 需要看其他代码才能确定 'l' 是干什么的。 dispatch(l); });
good
const locations = ['Austin', 'New York', 'San Francisco']; locations.forEach((location) => {doStuff();doSomeOtherStuff();// ...// ...// ... dispatch(location); });
4、避免无意义的前缀
如果创建了一个对象 car,就没有必要把它的颜色命名为 carColor。
Bad:const car = {carMake: 'Honda',carModel: 'Accord',carColor: 'Blue'};function paintCar(car) {car.carColor = 'Red';}Good: const car = {make: 'Honda',model: 'Accord',color: 'Blue' };function paintCar(car) {car.color = 'Red'; }
5、使用默认值
Bad: function createMicrobrewery(name) {const breweryName = name || 'Hipster Brew Co.';// ... }Good: function createMicrobrewery(name = 'Hipster Brew Co.') {// ... }
二、函数
1、参数越少越好
如果参数超过两个,使用 ES2015/ES6 的解构语法,不用考虑参数的顺序。
Bad: function createMenu(title, body, buttonText, cancellable) {// ... }Good: function createMenu({ title, body, buttonText, cancellable }) {// ... }createMenu({title: 'Foo',body: 'Bar',buttonText: 'Baz',cancellable: true });
2、只做一件事情
这是一条在软件工程领域流传久远的规则。严格遵守这条规则会让你的代码可读性更好,也更容易重构。如果违反这个规则,那么代码会很难被测试或者重用。
Bad: function emailClients(clients) {clients.forEach((client) => {const clientRecord = database.lookup(client);if (clientRecord.isActive()) {email(client);}}); }Good: function emailActiveClients(clients) {clients.filter(isActiveClient).forEach(email); } function isActiveClient(client) {const clientRecord = database.lookup(client); return clientRecord.isActive(); }
3、顾名思义
看函数名就应该知道它是干啥的。
Bad: function addToDate(date, month) {// ... }const date = new Date();// 很难知道是把什么加到日期中 addToDate(date, 1);Good: function addMonthToDate(month, date) {// ... }const date = new Date(); addMonthToDate(1, date);
4、删除重复代码
很多时候虽然是同一个功能,但由于一两个不同点,让你不得不写两个几乎相同的函数。
要想优化重复代码需要有较强的抽象能力,错误的抽象还不如重复代码。所以在抽象过程中必须要遵循 SOLID 原则(SOLID 是什么?稍后会详细介绍)。
Bad:
function showDeveloperList(developers) {developers.forEach((developer) => {const expectedSalary = developer.calculateExpectedSalary();const experience = developer.getExperience();const githubLink = developer.getGithubLink();const data = {expectedSalary,experience,githubLink};render(data);}); }function showManagerList(managers) {managers.forEach((manager) => {const expectedSalary = manager.calculateExpectedSalary();const experience = manager.getExperience();const portfolio = manager.getMBAProjects();const data = {expectedSalary,experience,portfolio};render(data);}); }
Good:
function showEmployeeList(employees) {employees.forEach(employee => {const expectedSalary = employee.calculateExpectedSalary();const experience = employee.getExperience();const data = {expectedSalary,experience,};switch(employee.type) {case 'develop':data.githubLink = employee.getGithubLink();breakcase 'manager':data.portfolio = employee.getMBAProjects();break}render(data);}) }
5、对象设置默认属性
bad:const menuConfig = {title: null,body: 'Bar',buttonText: null,cancellable: true }; function createMenu(config) {config.title = config.title || 'Foo';config.body = config.body || 'Bar';config.buttonText = config.buttonText || 'Baz';config.cancellable = config.cancellable !== undefined ? config.cancellable : true; }createMenu(menuConfig); Good: const menuConfig = {title: 'Order',// 'body' key 缺失buttonText: 'Send',cancellable: true };function createMenu(config) {config = Object.assign({title: 'Foo',body: 'Bar',buttonText: 'Baz',cancellable: true}, config);// config 就变成了: {title: "Order", body: "Bar", buttonText: "Send", cancellable: true}// ... }createMenu(menuConfig);
6、不要传 flag 参数
通过 flag 的 true 或 false,来判断执行逻辑,违反了一个函数干一件事的原则。
Bad: function createFile(name, temp) {if (temp) {fs.create(`./temp/${name}`);} else {fs.create(name);} }Good: function createFile(name) {fs.create(name); } function createFileTemplate(name) {createFile(`./temp/${name}`) }
7、避免副作用(第一部分)
函数接收一个值返回一个新值,除此之外的行为我们都称之为副作用,比如修改全局变量、对文件进行 IO 操作等。
当函数确实需要副作用时,比如对文件进行 IO 操作时,请不要用多个函数/类进行文件操作,有且仅用一个函数/类来处理。也就是说副作用需要在唯一的地方处理。
副作用的三大天坑:随意修改可变数据类型、随意分享没有数据结构的状态、没有在统一地方处理副作用。
Bad: // 全局变量被一个函数引用 // 现在这个变量从字符串变成了数组,如果有其他的函数引用,会发生无法预见的错误。 var name = 'Ryan McDermott';function splitIntoFirstAndLastName() {name = name.split(' '); }splitIntoFirstAndLastName();console.log(name); // ['Ryan', 'McDermott']; Good: var name = 'Ryan McDermott'; var newName = splitIntoFirstAndLastName(name)function splitIntoFirstAndLastName(name) {return name.split(' '); }console.log(name); // 'Ryan McDermott'; console.log(newName); // ['Ryan', 'McDermott'];
8、避免副作用(第二部分)
在 JavaScript 中,基本类型通过赋值传递,对象和数组通过引用传递。以引用传递为例:
假如我们写一个购物车,通过 addItemToCart() 方法添加商品到购物车,修改 购物车数组。此时调用 purchase() 方法购买,由于引用传递,获取的 购物车数组 正好是最新的数据。
看起来没问题对不对?
如果当用户点击购买时,网络出现故障, purchase() 方法一直在重复调用,与此同时用户又添加了新的商品,这时网络又恢复了。那么 purchase() 方法获取到 购物车数组 就是错误的。
为了避免这种问题,我们需要在每次新增商品时,克隆 购物车数组 并返回新的数组。
Bad: const addItemToCart = (cart, item) => {cart.push({ item, date: Date.now() }); };Good: const addItemToCart = (cart, item) => {return [...cart, {item, date: Date.now()}] };
转载于:https://www.cnblogs.com/Nyan-Workflow-FC/p/10464431.html
JavaScript: 代码简洁之道相关推荐
- JavaScript 代码简洁之道
测试代码质量的唯一方式:别人看你代码时说 f * k 的次数. 代码质量与其整洁度成正比.干净的代码,既在质量上较为可靠,也为后期维护.升级奠定了良好基础. 本文并不是代码风格指南,而是关于代码的可读 ...
- PHP 代码简洁之道 ( PHP Clean Code)(第二部分)
PHP 代码简洁之道 ( PHP Clean Code)(第一部分) 使用默认参数而不是使用短路运算或者是条件判断 不好的做法: 这是不太好的因为 $breweryName 可以是 NULL. fu ...
- Java代码简洁之道
Java如何把代码写的简洁? 其实这是一个熟练的过程,有的代码在编写的时候有很多方法你没有见过,所以你只能按照一般写法来做,这也就是经验不足!或者有的时候你没有熟练掌握面向对象的思想,所以无法从全局出 ...
- 学会这样写代码,一看就是资深工程师,代码简洁之道PHP版本
文章目录 一.前言 二.规范 2.1 整体结构规范 2.1.1 类的括号前括号单独一行 2.1.2 方法的前括号单独一行 2.1.3 方法内部语句前括号不换行 2.2 变量与常量 2.2.1 变量的命 ...
- JAVA基础之代码简洁之道
引言 普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.--来自网络 背景 软件质量,不但依赖于架构及项目管理,更与 ...
- JavaScript 代码整洁之道
目录 介绍 变量 函数 对象和数据结构 类 测试 并发 错误处理 格式化 注释 介绍 本文作者根据 Robert C. Martin <代码整洁之道>总结了适用于 JavaScript 的 ...
- PHP 的代码简洁之道(Clean Code PHP)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...
- 代码简洁之道( PHP Clean Code)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于 PHP.它并不是一个编码风格指南,它指导我们用 PHP 写出具有可读性,可复用性且可分解的代码. 并非所 ...
- PHP 代码简洁之道 ( PHP Clean Code)
介绍 Robert C.Martin's 的 软件工程师准则 Clean Code 同样适用于PHP.它并不是一个编码风格指南,它指导我们用PHP写出具有可读性,可复用性且可分解的代码. 并非所有的准 ...
最新文章
- LSM Tree 学习笔记——MemTable通常用 SkipList 来实现
- Java CPU占用率高分析
- 【Python】青少年蓝桥杯_每日一题_4.21_s=a+aa+aaa+aaaa的值
- 【Java】6.3 类成员
- 抓住金三银四好机会,超齐全java大厂面试题汇总(请自寻学习查找答案)
- NASA 顶级程序员是如何编程的?这里有十大准则
- indesign如何画弧线_彩铅画入门教程,如何给独角兽设计一款好发型
- 网络爬虫--25.【selenium实战】实现拉勾网爬虫之--selenium获取数据
- 【4】测试用例设计-判定表法
- 低代码|零代码云快速开发平台测评
- 7-6 华氏度转摄氏度(四舍五入)
- eclipse 里边的 字体颜色代表了什么意思?
- linux下载安装最新openssl,在Linux上编译安装OpenSSL最新版本
- OneR算法_0(python数据挖掘入门与实践-实验2)
- 电脑蓝屏原因与手把手处理指南(关于0x00000124分析)
- Vue开发之基础路由
- 【Linux】软件包管理器yum和编辑器vim(内附动图)
- 介绍当前计算机软件应用发展状况,简要介绍我国当前税收征管软件的应用状况...
- SpringBoot整合Mybatis演示
- 树莓派最新raspbian系统换国内源