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

news2024/11/24 1:42:18

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

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

〓❏ 误解导致引入缺陷;

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

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

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

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

编写易于理解的代码

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

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.coloradmin.cn/o/1794317.html

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

相关文章

nesting in wrf

Choices for Nesting are:0 no nesting (only available for serial and smpar) 0. no nesting (only available for serial and smpar)1. basic2. preset moves preset moves3. vortex following • default is option 0 for serial/smpar, 1 for dmpar • smpar Shared Mem…

应对800G以太网挑战:数据中心迁移

在过去几年中,云基础设施和服务的大规模使用推动了对更多带宽、更快速度和更低延迟性能的需求。交换机和服务器技术的改进要求布线和架构随之调整。因此,800G以太网对数据中心迁移的需求,特别是对速率(包括带宽、光纤密度和通道速…

YOLOv10(1):初探,训练自己的数据

目录 1. 写在前面 2. 值得关注的点 3. 训练自己的数据集 4. 阅读代码的小建议 1. 写在前面 很多人YOLOv9还没有完全研究透,YOLOv10出来了。 惊不惊喜,意不意外! 据论文里提到,YOLOv10就是为了加速推理,在保证精度的…

C# NX二次开发-设置背景颜色

使用UF函数能直接设置UG背景颜色: 1.设置背景颜色选项为纯色: 2.编写更新背景颜色代码: var nxColor NXColor.Factory._Get(186);var rgb nxColor.GetRgb();double[] arr [rgb.R, rgb.G, rgb.B];theUf.Disp.SetColor(UFConstants.UF_DISP_BACKGROUND_COLOR, UFConstants.UF…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

Qt无边框

最简单的可拖动对话框(大小不可改变) #ifndef DIALOG_H #define DIALOG_H/*** file dialog.h* author lpl* brief 无边框dialog类* date 2024/06/05*/ #include <QDialog> #include <QMouseEvent> namespace Ui { class Dialog; } /*** brief The Dialog class* 无…

Shopee本土店成本利润如何核算?EasyBoss ERP帮您精准掌控

这几年做跨境电商的老板们都在说东南亚市场广阔&#xff0c;在东南亚开本土店流量大&#xff0c;为了赚钱兴冲冲跑去东南亚开本土店&#xff0c;每天看着店铺不停出单。 心里乐呵呵&#xff1a;“本土店是真赚钱&#xff0c;马上要走上人生巅峰了&#xff01;” 但每月实际一对…

PbootCms微信小程序官网模版/企业官网/社交电商官网/网络工作室/软件公司官网

在数字化时代&#xff0c;企业网站已成为吸引潜在客户、提升企业形象、和扩大品牌影响力的必备工具。因此&#xff0c;一个优秀的企业网站模板显得尤为重要。 企业官网的内容框架通常都包含企业形象、产品或服务类型、信息展示等部分&#xff0c;设计师需要借助和企业形象契合…

图片改大小的3个步骤,快速在线处理图片的方法

图片改大小是现在使用图片时经常要使用的一个功能&#xff0c;因为在很多的网上平台都会有对图片尺寸和图片大小的要求&#xff0c;只有符合平台要求的图片才可以正常上传使用。想要快速调整图片大小&#xff0c;可以在网上使用在线改图工具来处理&#xff0c;只需要简单的几步…

快速上手 ngrok:将你的本地服务一键暴露到互联网,开发者必备技能!

想让外界轻松访问你本地电脑上的项目&#xff1f;试试 ngrok 吧&#xff01;无论是调试 Web 应用&#xff0c;还是进行跨网络测试&#xff0c;ngrok 都能帮你一键创建安全隧道&#xff0c;将本地服务映射到公共 URL&#xff0c;让全球任何地方都能访问。本文详细介绍 ngrok 的安…

2.1.3 采用接口方式使用MyBatis

实战概述&#xff1a;使用MyBatis的接口方式进行数据库操作 环境准备 确保项目中已经集成了MyBatis框架。 创建用户映射器接口 在net.huawei.mybatis.mapper包中创建UserMapper接口。定义方法findById(int id)用于按编号查询用户。定义方法findAll()用于查询全部用户。定义方法…

Python 识别图片形式pdf的尝试(未解决)

想识别出pdf页面右下角某处的编号。pdf是图片形式页面。查了下方法&#xff0c;有源码是先将页面提取成jpg&#xff0c;再用pytesseract提取图片文件中的内容。 直接用图片来识别。纯数字的图片&#xff0c;如条形码&#xff0c;可识别。带中文的不可以&#xff0c;很乱。 识别…

jupyter之plt 画图弹出窗口展示图片以及静态图片切换方法

1. jupyter出图的三种方式 在python的Jupyter Notebook中&#xff0c;使用matplotlib绘制动态图形时&#xff0c;可能出现只显示一张静态图像。 这是因为在notebook中使用plt绘图共有三种模式&#xff1a; %matplotlib inline&#xff1a;这是默认的模式&#xff0c;输出的图片…

vscode ctrl+鼠标左键无法跳转

打开设置&#xff0c;搜索intel…… 将这个智能感知改成default就可以了&#xff0c;我之前是在disable处。 分析了一下&#xff0c;其实跳转功能主要是根据上下文语法分析来实现的&#xff0c;并不是简单得全文匹配&#xff0c;因此需要相关得语法分析工具。 那么为什么默认式…

异步时序逻辑电路分析

270页异步时序逻辑电路例题分析 阎石数电-第六章时序逻辑电路-6.2.3异步时序逻辑电路分析方法-例题6.2.4

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)---- xv6初探与实验一(Lab: Xv6 and Unix utilities)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

【文末附gpt升级秘笈】埃隆·马斯克芯片调配策略对特斯拉股价的影响分析

埃隆马斯克芯片调配策略对特斯拉股价的影响分析 一、引言 在现代商业环境中&#xff0c;企业间的资源调配与策略布局往往对其股价产生深远影响。据外媒CNBC报道&#xff0c;埃隆马斯克在芯片资源分配上的决策引起了业界的广泛关注。他秘密要求英伟达将原本预留给特斯拉的高端…

苹果Vision Pro 界面中英翻译

目录 菜单 &#x1f537;General&#x1f504;一般 AirDrop 隔空投送 Background App Refresh 后台应用刷新 Keyboards 键盘 VPN & Device Management VPN与设备管理​编辑Legal & Regulatory 法律法规 &#x1f537;Apps&#x1f504;应用程序 &#x1f537;Pe…

飞睿智能工业无线通信模块图传WiFi,地对空图传超5km,4堵实墙穿透稳定传输

在当今高科技飞速发展的时代&#xff0c;远距离无线通信技术的应用越来越广泛&#xff0c;尤其是在地对空通信领域。今天&#xff0c;我们将深入探讨一种远距离无线通信模块WiFi图传&#xff0c;它不仅能实现地对空远距离图传超过5公里&#xff0c;还具备穿透4堵实墙的穿墙效果…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目&#xff0c;ctrl n 运行项目&#xff0c;ctrl r 构建项目&#xff0c;ctrl b 改变编辑器界面字体显示比例大小&#xff0c;ctrl 鼠标滚轮 对齐代码&#xff0c;ctrl a; ctrl i 跳转到上一行&#xff0c;ctrl shift enter 跳转到下一行&#xff0c;…