在本文中,我会列举五条提高代码可读性的原则。这些原则是我在各种项目、团队和组织的实践中总结出来的经验。我希望大家可以从这篇文章中学到一些东西,从而提高代码的可读性。

>>>>

太长不看版

总有人不喜欢从头到尾看完全文,而是想赶快看完重点,这里为此准备了太长不看版:

  1. 重用会多次使用的内容。

  2. 避免针对可读性和可维护性制定一个通行的解决方案。

  3. 尽可能减小模块、类或组件的大小。

  4. 为你的代码自动化执行一些规则和准则。

  5. 就算你的团队只有你一个人,也要像是在多人团队中一样编写便于协作的代码。

1. 重用会多次使用的内容

大多数开发人员都知道 D.R.Y. 是什么意思(避免重复代码)。D.R.Y. 可以帮助你预防代码重复的问题。

为什么一个函数要写一遍又一遍呢?你应该只编写一次,然后在需要它的各个位置重复使用它。而且如果你需要更改它的代码,就只需要改动一处位置就可以了,用不着把修改好错误的版本复制粘贴到各个地方。

但请注意,D.R.Y. 原则会让你引入复杂性。因为到最后,事物被重用的次数会越来越多。

当你开始更改被多次重用的代码时,针对这部分代码编写测试的重要性就会充分体现出来了。

2. 避免针对可读性和可维护性制定通行的解决方案

可重用性、可读性和可维护性彼此之间既是朋友也是敌人。当你开始在自己的代码中践行 D.R.Y. 原则,你就会引入复杂性。当你引入复杂性时,可读性水平可能就会下降了。

因此,在构建功能时不要想着先做一个通行的解决方案。从简单入手是最好的!第一次尝试肯定没法做到尽善尽美。

通过多次迭代,你就可以在重用应用程序很多部分的同时,仍然保持不错的可读性和可维护性。

当你在拥有许多开发团队的组织中工作时,你的团队可能会分为内部人员和外部人员(例如自由职业者或顾问)。因此在这种情况下,人们会经常在不同组织之间来回切换。

在这些场景中,可读性和可维护性是成功的关键。让那些很可能随时离开团队的人员来制定通行的解决方案,并不是一个明智的选择。

在某些情况下,你的确需要通行方案,但这些方案必须做到很容易阅读和维护。

3. 尽可能减小模块、类或组件的大小

在为一款应用程序构建一些新功能时,你可能会在构建前作详细的规划。

最佳的解决方案肯定是能拆分成许多较小的模块、类或组件的。你想知道为什么吗?

因为小段代码更容易测试和维护。

想象一下,人们在现实中搭建高层建筑时,也是从一个个较小的单元开始拼装而成的,而不是一下子就把整幢大楼都造好,然后设法安装到地基上。当然了,例外也是有的。

大多数现代库和框架都分成了一些较小的构造块,而不是打包成单个文件。像 Angular、React 和 Vue 这样的 JavaScript 库和框架都采用了组件的概念。我认为他们的选择并不是无意识的结果。

4. 为你的代码自动化执行一些规则和准则

想要编写出可读和可维护的代码,一方面要关注的是代码的架构,另一方面则要关注代码的样式。

我想很多读者都经常会见到关于制表符或空格缩进的讨论。不过这里我不会讨论这个话题。无论你在团队中使用的是哪种方案,请确保所有团队成员都遵守它就行了。

最好的解决方案是,尽可能让这些代码样式规则和准则自动化。许多 IDE 都集成了这种功能,或者可以通过插件安装。

最简单的一种,也是支持多种语言和代码编辑器的方案是 editorconfig。只要添加一个.editorconfig,就可以应用这些规则。

https://editorconfig.org/

你可以在这些文件中为你的项目调整许多设置。你也可以指定全局设置方案,或者为特定的语言指定设置。例如:

  • 缩进样式:制表符或空格

  • 引号类型:单引号或双引号

  • 最大长度

  • 字符集

  • 还有更多……

下面是我在自己的一个项目中指定的配置:

# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false

网络上还有许多适用于某些特定语言的工具。对于 JavaScript 来说,我喜欢使用 Prettier,但你可能希望换一些不一样的工具。

https://medium.com/better-programming/eslint-vs-prettier-57882d0fec1d

不管怎样,只要参与项目的所有人都遵循相同的规则和准则,那么具体使用哪一种方案并不重要。

5. 就算只有你一个人,也要像在多人团队中一样编写代码

最后一点也是非常重要的,那就是永远都像在团队中一样编写便于协作的代码!

我可以想象,从未在团队中编写过代码的开发人员是很难理解这一条原则的。

可是如果你在一个人编写项目,就会很容易写出来很多只有你自己才能理解的代码(例如编写模糊不清的变量名、使用 2-3 个字符的变量名等等)。

应该试着像在团队中一样编写能方便他人理解的代码。想象一下,这就是说你的代码应该足够清晰明了,让其他人可以轻松理解。

你可以问一问朋友,或者在开发者社区中通过 Twitter 找什么人过来帮你检查代码的可读性,这是很简单的测试方法。我可以保证,你会得到自己意想不到的反馈。

不要担心负面反馈!你只要关注那些可以让你的代码对其他人更具可读性的反馈意见就行了。

你应该知道,可读代码与读起来略吃力的代码之间并没有很清晰的界限,不同人会在这个问题上有不同的看法。如果有人告诉你你的代码很难读,那也不要难过!你应该感谢对方的反馈意见。

小结

感谢大家的阅读!希望你从本文中起码能学到一点东西。

如果你对提高代码可读性的方法有任何补充,请随时在评论中分享你的想法。

THE END—

编辑 ∑Gemini

本文最初发布于 byrayray.dev 网站,经原作者授权由 InfoQ 中文站翻译并分享。

文章推荐

☞顶级数学家如何做数学?当代大师阿兰·孔涅的探秘之旅

☞耶鲁大学教授给研究生的一些忠告

☞数学竟然可以如此美丽

☞数学与爱情

☞微积分的发现是人类精神的最高胜利

☞父子同获诺贝尔奖什么的:细数那些从事物理学和数学的一家子

改善代码可读性的5种方法相关推荐

  1. 《Effective C#中文版:改善C#程序的50种方法》简介

    书名: Effective C#中文版:改善C#程序的50种方法 书号: 978-7-115-15888-8/TP 原书名: Effective C#: 50 Specific Ways to Imp ...

  2. 改善网站安全性的5种方法

    Here you will know about some important website security tips. 在这里,您将了解一些重要的网站安全提示. Owning a website ...

  3. 改善C#程序的50种方法

    摘要:为什么程序已经可以正常工作了,我们还要改变它们呢?答案就是我们可以让它们变得更好.我们常常会改变所使用的工具或者语言,因为新的工具或者语言更富生产力.如果固守旧有的习惯,我们将得不到期望的结果. ...

  4. 嵌入式编程C语言提高代码效率的14种方法

    嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...

  5. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    原文:VS开发中的代码编写小技巧--避免重复代码编写的几种方法 上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都 ...

  6. 编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)

    要求说明: 输入三个整数x,y,z,请把这三个数由小到大输出. 实现代码: 第1种方法: import java.util.Scanner;public class xyzMaxMin{public ...

  7. 5 个改善代码可读性的方法

    作者 | Dev by RayRay 译者 | 王强 策划 | 李俊辰 本文最初发布于 byrayray.dev 网站,经原作者授权由 InfoQ 中文站翻译并分享. 在本文中,我会列举五条提高代码可 ...

  8. 【笔记】编程的原则:改善代码质量的101个方法

    代码必然被修改 Code will be changed 代码不是写完就结束了,它在日后必然会被修改.没有写完就扔的一次性代码. 在编写代码的时候,我们应将"代码会被修改"这一点作 ...

  9. keras添加正则化全连接_收藏!改善TensorFlow模型的4种方法你需要了解的关键正则化技术(2)...

    上一篇文章和同学们分享了两种方法,今天我们继续分享另外两种方法. Batch Normalization 批处理规范化背后的主要思想是,在我们的案例中,我们通过使用几种技术(sklearn.prepr ...

最新文章

  1. Service 层和 Dao 层有必要为每个类都加上接口吗?
  2. django的数据库名字和models.py中类名的对应关系
  3. 未来十年,小程序将消失!
  4. Android系统信息获取 之十三:Linux内核版本信息获取
  5. 梦想,没想到这么快就实现了!
  6. ln 创建软链接硬链接命令
  7. PDF文件怎么拆分页面
  8. Unity一键更换TextMeshPro的字体
  9. py函数式编程(高阶函数map/reduce/filter/sorted、闭包函数/返回函数、匿名函数lamber、@装饰器decorator、偏函数functool.partial())
  10. 《穷查理宝典》思维导图
  11. 产业复苏|2020区块链与数字经济高峰论坛暨区块链战“疫”报告线上发布会召开...
  12. mysql初始化ibdata1大小_MySQL问答系列之如何避免ibdata1文件大小暴涨
  13. 云计算与移动架构:AI认知系统与洁净的云计算 PPT分享
  14. JEECG 商业版本号和开源版本号有什么差别呢?
  15. 腾讯与华为数据之争谈物联网大数据发展之困
  16. 「Redis 系列」那些你不知道的Redis配置文件详解,毕向东java基础视频教程
  17. 如何从软件工程师转型为AI工程师?
  18. 3.3 调用IP核实现多数表决器
  19. 网页瞬间转换成桌面应用级程序(IOS/Win/Linux)
  20. APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

热门文章

  1. 【itext学习之路】--3.对pdf文档进行加密和权限设置
  2. 在SQL Server中用好模糊查询指令LIKE
  3. php内容管理器是什么原因,有什么好的php内容管理后台吗?打算试水接单的大三狗提问...
  4. mysql numeric float_sql 下,float和numeric
  5. lamp mysql5.0_CentOS 5/6 LAMP(Apache MySQL PHP)一键安装脚本
  6. [错误记录] --- clickhouse报错Decimal value is too small
  7. AI应用开发实战系列之一: 从零开始配置环境
  8. linux安装python3.6 setuptools_linux下安装Python3.6.1
  9. c语言 空格_C语言100题集合-ex003
  10. java 指代对象_java-This的理解