如何提升代码可读性?

2024-04-08 15:32
文章标签 代码 提升 可读性

本文主要是介绍如何提升代码可读性?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作为开发者,可能会经常听到“代码首先是写给人看的”、“写可读的代码相当重要”等等。 

对于如何使代码的可读性更强,开发者往往都有自己的看法。那么你可曾仔细想过什么才能真正使代码可读性增强。 



一些标准答案  

无论你使用什么编程语言,你都可能会认同下面的建议可以增强代码的可读性: 

  • 好的变量、方法、类名
  • 一个变量、类、方法只做一件事
  • 一致的缩进,一致的格式
  • 减少代码中的嵌套级别
当然,还有很多其他标准答案,比如 Clean Code (Robert Martin著)和 Code Complete (Steve McConnell著)两本书中说的,你应该读一读。 

或许你要说,这些东西我都知道。那么, 下面就是一些你可能没有考虑的、关于代码可读性的更深层次的东西。

读者的经验  

给我一段代码,我能在2秒内告诉你这段代码是否写得好,是否具有很强的可读性(至少我会告诉你我的意见)。 

同时,如果我将我写得最好的、可读性很高的代码给一个编程新手,他们可能也不会发现这些代码与其他代码有什么不同。 

虽然我的代码中有很好的、描述性的变量名,短的命名方法和少量的参数,并且它们只做一件事,各个功能结构清晰地组合在一起,但是 这些新手并没有发现我的代码比其他没有考虑结构的代码好读到哪去。  

事实上,我经常听到其他人抱怨我的代码中有太多的方法,难以理解,并且变量名称太长,容易混淆。 

有经验的开发者与新手读代码的方式有根本的区别  

一个有经验的开发者在阅读代码时不会注重编程语言本身的词汇,而会更专注于代码实际上表达的意思——代码的目的是什么,而不是它是如何做的。 

而经验不足的开发者在读取代码时,会试图了解代码的实际结构,初学者则更侧重于实际的语言词汇,即代码中的编程语言试图传达的东西。  

对他们来说,一个长变量名称不具备描述性,而且会令人迷惑,因为这些变量名会隐藏一些事实,比如NumberOfCoins字面上来看表示一个整型值,而实际上它不仅仅是一个整型值。他们宁愿看到名为X或编号的变量值。 

而一个经验丰富的开发者,不会去关心整数、字符串和其他类型的变量,他们只想知道变量在系统、方法的逻辑上下文中表示什么,而不是变量的类型以及如何工作。 

学习阅读  

学习阅读代码就像是小孩子在学习阅读文章一样。他们在学习阅读时,不会去注意语法和文章传达的思想,而只会关注词语本身的结构。 

又比如,一个经验丰富的音乐家可以很轻松地看懂乐谱,而初学者往往需要根据乐谱来找钢琴上对应的琴键或吉他上对应的品数。 

可读性约束因素  

你在表达你的想法和意见时,有可能会局限于你本身所掌握的词汇量和阅读量,同样, 你代码的可读性也有可能局限于你所使用的编程语言以及编程语境。  

来看个例子,下面的汇编代码会在DOS屏幕中输出“Hello World!”: 

汇编代码 
  1. .model small  
  2. .stack 100h  
  3.    
  4. .data  
  5. msg     db      'Hello world!$'  
  6.    
  7. .code  
  8. start:  
  9.         mov     ah, 09h   ; Display the message  
  10.         lea     dx, msg  
  11.         int     21h  
  12.         mov     ax, 4C00h  ; Terminate the executable  
  13.         int     21h  
  14.    
  15. end start  

语言本身的复杂性,导致编写的代码难以阅读。无论你是个多么优秀的程序员,这种代码的可读性对你来说总会有上限的。 

现在再来看看C#中的Hello World: 

C#代码 
  1. public class Hello1  
  2. {  
  3.    public static void Main()  
  4.    {  
  5.       System.Console.WriteLine("Hello, World!");  
  6.    }  
  7. }  

下面是Ruby的: 

Ruby代码 
  1. puts "Hello, world"  

你知道Ruby为什么如此流行了吧!如果你了解Ruby语言中大量的词汇和语法结构,你会发现你可以很清楚地表达一个事物。 

我想说的是, 你拥有的词汇量越大,你表达的方式就会越简洁,可读性就越高,当然,这是对于那些同样拥有高词汇量的读者来说的。  

我们可以得出什么?  

从上面的内容中可以得出, 我们的词汇量和经验会影响代码的可读性。我们还需要去考虑谁将阅读我们的代码,他们的词汇量和经验如何。  

在C#中,通常会争论是否该使用条件运算符,比如我们应该写这样的代码: 

C#代码 
  1. var nextAction = dogIsHungry ? Actions.Feed : Actions.Walk;  

还是这样的: 

C#代码 
  1. var nextAction = Actions.None  
  2. if(dogIsHungry)  
  3. {  
  4.    nextAction = Actions.Feed  
  5. }  
  6. else  
  7. {  
  8.    nextAction = Actions.Walk;  
  9. }  

我以前会说第2种方式更好,但我发现我经常会写第1种。现在如果有人问我哪种好,我会告诉他“视情况而定”。我的意思是,你需要看读你代码的人是否了解条件运算符。 

编程语言也如同普通语言学习,比如英语,有人认为英语中有大量的词汇和荒谬的语法,应该减少一些,这样学习起来会更容易。但是,如果这样,就难以简洁地传达信息了。 

那么你认为,在开发中,应该有一种复杂的编程语言来增强开发者的表达能力,增强代码的简洁性和可读性(当然,这需要足够多的学习成本),还是应该保持简单的编程语言,来写复杂的、较长的代码呢? 

英文原文: What Makes Code Readable: Not What You Think

这篇关于如何提升代码可读性?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885981

相关文章

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt