如何使自己写的代码易读易懂?

〓● 如果代码可读性不佳、不容易理解,可能造成如下问题:

〓❏ 其他工程师浪费时间解读它;

〓❏ 误解导致引入缺陷;

〓❏ 其他工程师修改时破坏代码。

〓● 提高代码可读性,有时候可能使其变得更为冗长、占用更多的代码行数。这往往是有价值的权衡。

〓● 提高代码可读性往往需要同理心——想象其他人可能觉得困惑的情况。

〓● 现实生活中的场景各不相同,通常有各自面临的挑战。编写易于理解的代码几乎总是需要应用常识和判断力。

编写易于理解的代码

实现代码可读性最为常见、有效的技术打下坚实的基础。但需要牢记的是,现实生活中的每个场景都不相同,有各自的考虑因素,因此常识的运用和良好的判断力都是必不可少的。

1 使用描述性名称

名称是唯一标识事物所必需的,它们也往往能提供对事物概念的简单总结。“烤箱”这个词是某个厨房用具的唯一标识,但也明显地暗示了这件用具的用途:烧烤食物。如果我们坚持用“对象A”来指代一台烤箱,就很容易忘记“对象A”是什么东西,起什么作用。

在代码中命名不同事物也适用相同的原则。名称是唯一标识类、函数和变量等对象所必需的。但我们对事物的命名也提供了很好的机会,可以通过确保以不言自明的方式指代事物,使代码更易于理解。

2 适当使用注释

代码中的注释或文档可以起到多种作用,如:

〓● 解释代码完成的是什么

〓● 解释代码为什么完成这些工作;

〓● 提供其他信息,如使用指南。

本节将集中说明前两个作用:使用注释解释“什么”和“为什么”。使用说明等其他信息通常组成代码契约的一部分,这些已在第3章讨论过。

概述大块代码(如一个类)作用的高层注释常常很有用。然而,在较低层次的代码细节上,解释代码作用的注释往往不是提高代码可读性的最有效手段。

在代码行级别的作用上,使用描述性名称、编写质量良好的代码应该是不言自明的。如果我们需要为代码添加许多底层注释以解释它的作用,那么这很可能是代码可读性不理想的迹象。相反,解释代码为什么存在或提供更多背景信息的注释往往相当有用,因为只用代码不总是能够说明这些。

3 不要执着于代码行数

一般来说,代码库中的代码行数越少越好。代码通常需要一定的持续维护,代码行数越多,有时就意味着代码过于复杂,或者没有重用现有的解决方案。较多的代码还会增加工程师的认知负荷,因为阅读量显然更大了。

工程师有时会在这方面走极端,认为最大限度地减少代码行数比代码质量的其他因素更重要。他们有时会抱怨,所谓的“代码质量改善”将3行代码变成10行代码,因此产生的代码更差了。

但应该牢记的是,代码行数只是我们真正关心的事情的一个替代指标,与大部分替代指标一样,这是个有用的指导原则,但并非铁律。我们真正关心的是确保代码:

〓● 容易理解;

〓● 不容易受到误解;

〓● 不容易在无意中遭到破坏。

并不是所有代码都是一样的:与10行(甚至20行)易于理解的代码相比,1行极其难以理解的代码更容易降低代码质量。5.3.1节和5.3.2节用例子阐述了这一点。

4 坚持一致的编程风格

在我们造句的时候,必须遵循某些规则,才能写出语法正确的句子。此外,我们应该遵循一些其他风格上的指南,以确保我们的句子容易理解。

举个例子,想象一下我们要写段关于“软件即服务”(Software as a service)的文字。通常,如果一个首字母缩略词包含“a”或“as”等单词,那么这些单词应该用小写字母形式。因此,人们最熟悉的“软件即服务”缩写为SaaS。如果我们将这个缩略词写成SAAS,阅读文档的人可能会误以为我们指的是其他事物,因为那不是他们预期中的“软件即服务”的缩写。

这也同样适用于代码。语言的语法和编译器规定了允许的写法(有点像语法规则),但在工程师编写代码时,我们对于采用的风格惯例有很大的自由度。

5 避免深嵌套代码

典型的代码由相互嵌套的块组成,如:

〓● 函数定义一个调用时运行的代码块;

〓● if语句定义条件为真时运行的代码块;

〓● for循环定义每次迭代时运行的代码块。

图6 使函数调用易于理解

如果函数命名得当,它的作用应该是显而易见的,但即便有了这样的函数,如果参数的目的和作用不明,函数调用也很可能无法理解。1说明了控制流逻辑(如if语句和for循环)造成代码块相互嵌套的情况。代码中的指定逻辑通常有不止一种构造方法。有些形式可能造成许多代码块嵌套,而其他方法可能几乎不会造成任何嵌套。考虑代码结构对可读性的影响是很重要的。

1 控制流逻辑(如if语句和for循环)可能造成代码块相互嵌套

6 使函数调用易于理解

如果函数命名得当,它的作用应该是显而易见的,但即便有了这样的函数,如果参数的目的和作用不明,函数调用也很可能无法理解。

7 避免使用未做解释的值

在许多情况下我们需要硬编程的值。常见例子如下:

〓● 数值转换中的系数;

〓● 可调整的参数,例如某项任务失败时的最大重试次数;

〓● 代表某些值填写模板的字符串。

所有硬编程值都有两个重要的信息:

〓● 具体值——计算机在执行代码时必须知道这一信息;

〓● 值的意义——工程师只有知道了这一信息,才能理解代码。没有这一信息,工程师将无法理解代码。

代码需要一个显而易见的值,否则代码很可能无法编译或起作用,但工程师在编写该值的时候很容易忘记向其他工程师澄清该值的实际含义。

8 正确使用匿名函数

匿名函数是没有名称的函数。它们通常在需要的时候于代码中内嵌定义。不同编程语言定义匿名函数的语法也各不相同。

9 正确使用新奇的编程语言特性

每个人都喜欢新鲜的事物,工程师也不例外。许多编程语言仍在积极发展,而编程语言设计师也在不断增加令人喜爱的新特性。当这种情况发生时,工程师往往渴望利用新特性。

编程语言设计师在增加新特性之前经过了非常谨慎的思考,因此在许多情况下,新特性都可能使代码更加易于理解或者鲁棒。工程师因为这些新特性而兴奋是很好的事情,因为这增大了利用新特性改善代码的可能性。但如果你发现自己渴望使用新奇的编程语言特性,一定要保持坦诚的态度,思考这一特性是不是适合手头使用的工具。

推荐书籍

  1. 《代码整洁之道》(Clean Code):这本书强调了编写干净、可维护代码的重要性,并提供了一些实用的编程技巧和原则。
     
  2. 《代码整洁之道:程序员的职业素养》(Clean Coder: A Code of Conduct for Professional Programmers):这本书不仅关注于编写干净的代码,还强调了程序员应该遵循的一些职业素养和道德准则。
     
  3. 《好代码 ,坏代码》:本书教你如何像高效的软件工程师一样思考代码,如何编写读起来像一个结构良好的句子的函数,如何确保代码可靠且无错误;如何进行有效的单元测试,如何识别可能导致问题的代码并对其进行改进,如何编写可重用并适应新需求的代码,如何提高读者的中长期生产力;同时还介绍了如何节省开发人员及团队的宝贵时间,等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】深入认识Python数据类型和变量

​​​​ 文章目录 1. 引言数据类型的重要性Python中的数据类型概述 2. 数字类型整型(int)浮点型(float)复数(complex) 3. 字符串类型字符串的定义与使用字符串操作方法 4. 布尔类型布尔值和布尔运算 5. 列…

docker网络详解

1. 网络模式 1.1 网络结构 当安装Docker以后,会自动创建三个网络。可以使用docker network ls命令列出这些网络。 $ docker network ls NETWORK ID NAME DRIVER SCOPE 440aefe8afa3 bridge bridge local aa8d6325580f host host …

chat-glm4,qwen1.5性能对比

modelMMLUC-EvalGSM8KHumanEvalglm-4-9b74.777.184.070.1qwen1.5-7b6174.162.536.0qwen1.5-14b67.678.770.137.8 数据来源是以下两个图。可以看到GLM4非常优秀,qwen应该也快要开源自己的新模型了,希望国内的大模型团队能够继续坚持,持续努力&…

AI框架之Spring AI与Spring Cloud Alibaba AI使用讲解

文章目录 1 AI框架1.1 Spring AI 简介1.2 Spring AI 使用1.2.1 pom.xml1.2.2 可实现的功能 1.3 Spring Cloud Alibaba AI1.4 Spring Cloud Alibaba AI 实践操作1.4.1 pom.xml1.4.2 配置文件1.4.3 对接文本模型1.4.4 文生图模型1.4.5 语音合成模型 1 AI框架 1.1 Spring AI 简介…

NSSCTF-Web题目5

目录 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 3、思路 [LitCTF 2023]作业管理系统 1、题目 2、知识点 3、思路 [HUBUCTF 2022 新生赛]checkin 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 数据库注入、报错注入 3、思路 首先…

vue 文件预览mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml

vue 文件预览 图片、mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml 最近公司要做一个类似电脑文件夹的功能,支持文件夹操作,文件操作,这里就不说文件夹操作了,说说文件预览操作,本人是后端java开发,前端vue&#…

Linux系统安装APITable详细流程与远程访问本地平台数据分析

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 💡推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 前言 v…

AMD显卡和英伟达显卡哪个好?

显卡是计算机中负责处理图形和视频输出的硬件设备,主要分为两种类型:AMD的A卡和NVIDIA的N卡。那么AMD显卡和英伟达显卡哪个好?怎么选? 答:不能一概而论地说哪个好,因为它们各有优势,选择应基于…

RE_RC4加密

之前做的几道题目,rc4也是经常遇到,今来系统学学,记录一下 对称加密,即加密和解密的密钥可以相互推导,也有的是相同的。 RC4 是以字节流处理每一个字节,而不是 DES 的分组操作。 包含三个参数&#xff1…

探索通信技术的未来:2024中国通信技术和智能装备产业博览会

探索通信技术的未来:2024通信技术产业专场 随着信息技术的飞速发展,通信技术已成为现代社会不可或缺的基础设施。2024年10月11日至13日,青岛将迎来一场通信技术的盛会——2024中国军民两用智能装备与通信技术产业博览会。本次博览会不仅将展…

面试(03)————多线程

目录 一、线程和进程的区别? 二、并行和并发的区别? 三、线程创建的方式有哪些? 3.1、继承Thread类 3.2、实现Runnable接口 3.3、实现Callable接口 3.4、线程池 四、Runnable和Callable的区别? 五、在启动线程的时候&am…

书生·浦语大模型全链路开源体系-笔记作业4

XTuner 微调 LLM:1.8B、多模态、Agent 引自:Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自:欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner ? X…

修改缓存供应商--EhCache

除了我们默认的缓存形式simlpe之外, 我们其实还有许多其他种类的缓存供应 Ehcache就是其中的一种形式 Ehcache在SpringBoot当中的使用: 其实跟我们之前整合第三方的资源是一样的形式 1>导入依赖: <!-- 更换缓存, 将默认使用的 Simple 更换为Ehcache--> <depe…

【go】windows环境设置goos

场景 本地环境&#xff1a;windows 生产环境&#xff1a;linux 现想在本地将go脚本编译为可执行二进制文件&#xff0c;转移至生产中进行运行测试。但go build不生效。 方案&#xff08;修改GOOS&#xff09; cmd打开命令行&#xff0c;执行go env查看本地go环境&#xff0c…

PPT视频如何16倍速或者加速播放

有两种方式&#xff0c;一种是修改PPT本身&#xff0c;这种方式非常繁琐&#xff0c;不太推荐&#xff0c;还有一种就是修改视频本身&#xff0c;直接让视频是16倍速的视频即可。 如何让视频16倍速&#xff0c;我建议人生苦短&#xff0c;我用Python&#xff0c;几行代码&…

基本元器件 - 电阻

目录 电阻的选型 贴片封装的参数 电阻的阻值 丝印表示方法 标准电阻取值 电阻的失效 0 欧姆电阻的使用 电阻的使用场景 分压电路 分流电路 限流电路 阻抗匹配电路 RC 充放电电路 上下拉电路 其他电路 电阻的选型 一般来说&#xff0c;要考虑以下四个因素&…

【大模型】基于Hugging Face调用及微调大模型(1)

文章目录 一、前言二、Transformer三、Hugging Face3.1 Hugging Face Dataset3. 2 Hugging Face Tokenizer3.3 Hugging Face Transformer3.4 Hugging Face Accelerate 四、基于Hugging Face调用模型4.1 调用示例4.2 调用流程概述4.2.1 Tokenizer4.2.2 模型的加载4.2.3 模型基本…

软信天成:告别数据脏乱差!企业数据清洗实战方案分享

低质量数据普遍存在。据统计&#xff0c;数据质量问题每年给企业造成高达3.1万亿美元的损失。为了防范这种损失&#xff0c;越来越多的企业采用数据清洗来清洗数据&#xff0c;提高数据质量。 数据清洗&#xff0c;顾名思义是将数据上“脏”的部分清洗掉&#xff0c;让数据变得…

UV胶为什么会开裂?如何避免UV胶开裂?

UV胶为什么会开裂&#xff1f;如何避免UV胶开裂&#xff1f; UV胶开裂可能由以下几个主要因素导致&#xff1a; 紫外线照射不足&#xff1a;UV胶的固化需要足够的紫外线能量。如果紫外线照射不足&#xff0c;胶水可能无法完全固化&#xff0c;导致开裂。这可能是由于固化设备…

调试线上资源文件失效问题

之前的老项目&#xff0c;突然报红&#xff0c;为了定位问题&#xff0c;使用注入和文件替换的方式进行问题定位&#xff01; 1.使用注入 但是刷新后就没有了&#xff0c;不是特别好用&#xff01; const jqScript document.createElement(script); jqScript.src https://…