可读的代码是可维护的

在这篇短文中,我将介绍一些你可以用来改进你的代码的方法。本文代码示例均使用 JavaScript。

我发现但凡是可读的代码必定是可维护的。

作为一名开发人员,我的目标是编写高质量的代码。团队中的每个开发人员,不管他/她的技术水平如何,都必须能够通过阅读理解我所写的代码。代码的可读性有助于年轻的开发人员编写代码时更加自信。

删除 不必要的 代码注释

当然,有些代码可以非常复杂。我深知这一点且见过很多次。在复杂的代码中,我会写些适当的文档和代码注释。

别误会。我不是代码注释或 JavaScript JSdoc 的爱好者,而且基本上我能不用它们便不用。

我不需要任何注释来解释这个接收 X 个数组并将它们合并到一个新的数组中的函数。

function mergeArrays(...arrays) {

let mergedArray = []

arrays.forEach(array => {

mergedArray = [...mergedArray, ...array]

})

return mergedArray

}

像示例代码,如果增添文档并不能提高可读性。我希望团队成员知道展开操作符是什么。如果他们不清楚,他们应该在代码审查 code review 时来问我。

当然,我们不要忘记注释的代码块。如果我们忘记了,这里只有一个解决方案:删除代码。既然了不起的 git 可以检出旧代码,那么为什么还要把它留在注释中呢?

请停止把你的代码库变成垃圾场。

重视命名

如果你看到函数名 mergeArrays,就应该很清楚地知道这是一个将 X 个数组组合成一个新的数组的函数。

我知道命名是件难事。函数越复杂,命名就越难… 我有个法子让命名更容易,举个例子:有一个函数,它会合并两个数组并生成一个新的唯一的数字列表。你会怎么命名?是下面这样吗?

function mergeNumberListIntoUniqueList(listOne, listTwo) {

return [...new Set([...listOne, ...listTwo])]

}

mergeNumberListIntoUniqueList 这个名字并没有那么糟糕,至少功能如其名。命名的难点在于这个函数要做两件事:一个函数做的事情越多,命名它就越困难。将这个函数拆分为两个单独的函数,命名会更容易且函数复用更容易。

function mergeLists(listOne, listTwo) {

return [...listOne, ...listTwo]

}

function createUniqueList(list) {

return [...new Set(list)]

}

当然,不需要调用新函数就可以很容易地创建美观的一行代码。但有时,一行代码的可读性并不高。

If 语句

我对这个问题的命名无力… 看!命名不易…

但我经常看到这种情况。

问题

if(value === 'duck' || value === 'dog' || value === 'cat') {

// ...

}

解决方法

const options = ['duck', 'dog', 'cat'];

if (options.includes(value)) {

// ...

}

这样做,你创建了一段像是英语句子般的可读代码。

如果选项包含值,那么 ...

提前退出机制

这个准则有很多种命名方式,但我选择了 “提前退出 Early exit” 这个名字。

让我给你们看一段代码。我相信你们以前见过这样的东西。

function handleEvent(event) {

if (event) {

const target = event.target;

if (target) {

// Your awesome piece of code that uses target

}

}

}

来我们检查下对象 event 是否为真,以及属性 target 是否可用。问题是上面代码我们已经用了两个 if 语句。

让我们看看如何在这里实现 “提前退出”。

function handleEvent(event) {

if (!event || !event.target) {

return;

}

// Your awesome piece of code that uses target

}

在这里用 “提前退出”,你可以检查是否 event 和 event.target 同时非假 。很明显,我们确信这一事件 event.target 非假。因为如果这个语句为假,程序就不会执行其他代码。

解构赋值

在 JavaScript 中,我们可以解构数据和对象。

根据 developer.mozilla.org 上的文档,解构赋值语法是一种 JavaScript 表达式。通过解构赋值,可以将值从数组、属性从对象中取出,赋值给其他变量。

一些代码示例

// Destructuring an object

const numbers = {one: 1, two: 2};

const {one, two} = numbers;

console.log(one); // 1

console.log(two); // 2

// Destructuring an array

const numbers = [1, 2, 3, 4, 5];

const [one, two] = numbers;

console.log(one); // 1

console.log(two); // 2

解构的问题在于,它有时会为属性创建一个不好的命名。最好的例子是从 API 获取数据并接收具有 data 属性的响应对象。

const url = "http://localhost:8080/api/v1/organizers/1"

const response = await axios.get(url)

const {name} = response.data

这个代码示例说明你正在获取 id 为 1 的 organizer。organizer 对象有一个名字,你可以解构它。这样做没什么问题。

这段代码可以正常运行。但是为什么属性名还是 name? 那将是整个范围中唯一的 name 属性吗?属性名又来自哪个对象?

通过重命名属性可避免这些问题。

const url = "http://localhost:8080/api/v1/organizers/1"

const response = await axios.get(url)

const {name: organizerName} = response.data

这段代码变得更具可读性。每个人都知道变量是 organizer 的名字。

童子军规则

听过这样一句话吗:“永远保持离开时的露营地比你发现它时更整洁”?

这就是童子军的规则。让代码比发现时更好。你发现代码异味 code smell?重构它!你发现一个未使用的变量?删除它!

我喜欢把童子军规则和打扫房间的情况进行类比。想象一下,你家里的每个人都把盘子放在水槽上,把所有垃圾都放在走廊上,把所有要洗的衣服都放在浴室里。但是每个星期天,你必须花费 4 个多小时清理整个房子。你会钟意吗?

我肯定答案是 NO。所以如果每个人都立即清理房间的小部分,星期天的工作量会小一些。

代码库同理。如果每个小的代码异味 code smell 都留在代码库中,没有人删除未使用的变量,linter 就会抓狂且有大约 77 个 warning。而且代码库将会有很多清洁工作要做,但是如果每个人都承担起自己的责任并遵守童子军法则,很多问题将会得到解决。

代码风格

同样重要的还有确定团队中的代码风格。

我不 care 你是喜欢单引号还是双引号,空格还是 tab,结尾逗号还是不用。选择一种风格并坚持下去。你可以用 Linter 或者 Prettier 来做这件事。

有很多工具可以用来解决代码风格问题。我最钟意的是使用 Husky 预提交钩子。Prettier 的文档中也有一个关于预提交钩子的页面。

这个预提交钩子总是在每次提交之前运行配置好的命令。如果你正确地配置它,它会运行得更漂亮,并对所有文件应用所有规则。这确保了团队总是拥有统一的代码风格,而没有任何糟糕的代码。

小结

我知道有些方法显而易见,有些则不是。但作为一名全职开发人员,我在不同的代码库上工作。这些规则的重要性只有在较大的代码库中才会突显。但这并不意味着你不应该将这些方法用在小项目中,提高你的代码质量让小项目更高效。它让团队成员方便地阅读你的代码并合并你的 pull 请求。正如我所说的,可读的代码更容易维护,当然可读的代码还有其他更多的好处。

如果你想了解更多关于代码整洁之道的知识,可以尝试阅读罗伯特・马丁的《代码整洁之道》。

最后,欢迎优秀的你加入 HelloGitHub 的「译文亦舞」系列,让你的才华舞动起来!把优秀的文章分享给更多的人。要求:

平时浏览 GitHub、开源、编程、程序员等英文资讯和文章

想把自己阅读到优秀的英文文章分享给更多的人

翻译准确但不是直翻或机翻

保证每月至少翻译或校正 1 篇高质量文章

了解 Markdown 和排版规则

联系我(备注:翻译和从那个平台来的)

零基础学习Java编程可以加入我的十年Java学习裙:3907814

代码整洁之道 python_代码整洁之道的 7 个方法相关推荐

  1. 代码整洁之道 python_代码整洁之道-编写 Pythonic 代码

    原标题:代码整洁之道-编写 Pythonic 代码 来自:Python学习开发(微信号:python3-5) 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名 ...

  2. 架构整洁之道 pdf_代码有整洁之道,而架构同样有整洁之道

    大家好!我是超级机器人 UltraBot,今天给大家一些值得阅读的开源书籍和项目. Etcd3 学习笔记 etcd 是一个分布式一致性键值存储,用于共享配置和服务发现.etcd 是 Go 编写,并使用 ...

  3. python代码写名字_必知必会系列_python代码优雅之道之代码命名约定

    代码的命名约定对代码的提高可读性影响巨大.本文中,我们将总结并向您提供一些关于命名的最佳实践的示例,以帮助您编写更优雅的Python代码,使将来可能阅读和使用您的代码的人(包括您自己)受益. Pyth ...

  4. 《代码整洁之道 Clean Architecture》-读书笔记

    大家好,我是烤鸭: 关于<代码整洁之道>,记录一下读书笔记. 代码整洁之道 第一章 整洁代码 整洁代码的艺术 第二章 有意义的命名 避免误导 有意义的区分 使用读得出来和可搜索的名字 避免 ...

  5. C#代码整洁之道读后总结与感想

    1. 基本信息 C#代码整洁之道:代码重构与性能提升 ,英文名为Clean Code in C#. 作者:[英] 詹森·奥尔斯(Jason Alls) 著,刘夏 译 机械工业出版社,2022年4月出版 ...

  6. 《代码整洁之道》读书笔记✍ 教你写 clean code

    代码整洁之道 第一章 整洁代码 1.1 什么是整洁的代码? 资深程序员告诉你什么是整洁的代码,下面详细介绍了Bjarne Stroustrup的描述,其他描述就不一一列出了,在此只记录几个关键点. 我 ...

  7. 重读【代码整洁之道】

    一.前言 [代码整洁之道]很经典,但也有些过时,翻译上也有些啰嗦,但总体上是好书.通过对本书核心内容的摘抄,结合自己的经验,整理了一些精简的点,这样你就省的去啃那本400多页的书了. 软件质量 = 架 ...

  8. 《代码整洁之道》(Clean Code)- 读书笔记

    一.关于Bob大叔的Clean Code <代码整洁之道>主要讲述了一系列行之有效的整洁代码操作实践.软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关.这一点,无论是敏捷开发流派 ...

  9. 代码整洁之道(一)最佳实践小结

    摘要: Any fool can write code that a computer can understand. Good programmers write code that humans ...

  10. 2015年第11本:代码整洁之道Clean Code

    前一段时间一直在看英文小说,在读到<Before I fall>这本书时,读了40%多实在看不下去了,受不了美国人啰啰嗦嗦的写作风格,还是读IT专业书吧. 从5月9日开始看<代码整洁 ...

最新文章

  1. LeetCode简单题之检查是否所有字符出现次数相同
  2. Windows文件系统过滤驱动开发教程(0,1,2)
  3. ASP.NET Atlas学习团队建议收集
  4. python爬虫新闻_python爬虫,爬取一系列新闻
  5. 《系统集成项目管理工程师》必背100个知识点-47质量保证人员(QA)的主要工作...
  6. JavaFX控制器:设置按钮点击事件代码示例
  7. 线段 LibreOJ - 10007(贪心)
  8. 1000万存在银行,一年的利息够日常生活费吗?
  9. POJ3675 Telescope 圆和多边形的交
  10. 1025 反转链表 (25 分
  11. 红外感应模块+蜂鸣器实现简易报警(转)
  12. 字典dictionary
  13. VC++常用数据类型
  14. python爬虫简历项目怎么写_python爬虫简历
  15. Navicat: Cannot create filec:\Users\***\Documens\Navicat\MySql.....文件名、目录名或卷标语法不正确
  16. JSPL中用fn:contains()判断list中是否包含某个值
  17. HTML制作手风琴效果,Dreamweaver制作手风琴图片展示效果(附代码)
  18. 端傳媒 android客户端,知乎安卓客户端交互设计分析!
  19. Linux ping命令
  20. ros:游戏手柄控制海龟

热门文章

  1. 苹果激活锁功能可被长字符串溢出
  2. JSON转换问题最全详解(json转List,json转对象,json转JSONObject)
  3. node.js 快速入门
  4. C++通配符模糊匹配
  5. js 正则表达式 判断车牌号
  6. python机器人编程 乐高_什么是编程?什么是乐高机器人?学习这些有用吗?
  7. java 8 64_java8离线安装包64位
  8. 联想如何在桌面显示计算机和网络图标,联想电脑桌面图标字体变小怎么办
  9. java疯狂讲义pdf_《疯狂Java讲义(第3版)》PDF 下载
  10. ppt如何替换其他mo ban_如何制作PPT教程:PPT排版格式技巧汇总