0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何编写可读性代码

张康康 2019-08-16 18:13 次阅读

编写可读性代码


作者:极链科技 汤红燕

什么叫可读性代码?

简单来说,就是易于理解、耗脑时间少、可维护性较高的代码。

编写可读性代码

信息装到名字里(一个好的名字可以承载很多信息)

1. 选择专业的词(避免“空洞”)

比如函数 getUserInfo( ) 是用来获取用户信息,但是,是从接口中获取的信息呢?还是在页面已经暴露的信息?看到的时候就会有疑问。

命名的时候,如果是从互联网中获得,可以使用fetchUserInfo( )来表示。

2. 找到更有表现力的词(更清晰、精确)

比如:search 和 find 区别 ,再可以类似于表格数据的筛选, 可以考虑用更准确的词汇去表示。

9442a3755ac247069a2879da26566215.png

避免使用像 tmp 和 retval 这样泛泛的名字。

3. 使用具体的名字更细致地描述事物

对于一个变量包含十六进制字符串,命名为 let id,但是为何不命名成 let hex_id?

如果你的变量时一个度量值的话,最好让名字带上它的单位。

4. 名字应该有多长

在编写代码取名的时候总会有一些疑问,我的定义名称该多长才合适?可以遵循以下几点:

l 小作用域里可以使用短的名字;

l 首字母缩略词和缩写(当然是在成员能看懂的情况下 TBColor -> TextBackgroundColor);

l 丢掉没用的词(no-padding-all -> no-padding);

l 利用名字的格式来传递含义(比如所有的class 是class-name, id 是 id_id);

不会让人误解的名字

常用的 filter() 命名,如果新同学看到,可能会产生疑问,这是过滤掉满足要求的值呢还是不满足要求的?

为了便于处理以上情况,有以下几点建议:

l 使用 min 和 max 来表示(包含)极限

l 使用 first 和 last 来表示包含的范围

l 使用 begin 和 end 来表示包含/排除范围

l 给布尔值命名

对于语句 bool read_password = true 是我们已经读取密码,还是我们需要读取密码?

这时候可以用 need_password 或 user_is_authenticated 这样的名字来代替;

像 is 、has 、can或should这样的词,就可以把布尔值变得更明确。

审美

代码的审美,确切地说,有三条原则:

1. 使用一致的布局,让读者很快就习惯这种风格。

2. 让相似的代码看上去相似。

3. 把相关的代码行分组,形成代码块。

该写怎样的注释

1. 从代码本身快速推断出事实的不需要注释

2. 不要为了注释而注释

3. 不要给不好的名字加注释(不如改名字)

4. 加入“导演评论”,你可以在代码中加入注释来记录你对代码有价值的见解。

5. 为代码中的瑕疵写注释

b2e97cee7cd1459086c5b06654154d9f.png

6. 给常量加注释(有些常量不需要注释,因为它们的名字已经很清楚,但很多常量可以通过加注释得以改进)

7. 站在读者的角度,“全局观”注释

e847d704d9574e7b836ab5fa202b9ef9.png

写出言简意赅的注释

1. 让注释保持紧凑

2. 避免使用不明确的代词(如it,this等)

3. 润色粗糙的句子

4. 精确地描述函数的行为

比如用输入/输出例子来说明特别的情况

下面是一个用来移除部分字符串的通用函数:

248217c7228d4cb5b35e3bdaa7d95619.png

5. 声明代码的意图

对于“具名函数参数”的注释,就是像 C# Python 这类语言的命名函数参数,让每个参数的意义更加明确。

比如:

e7090c398a35419b852febc7a4436cbb.png

6. 采用信息含量高的词

l 避免使用代词

l 尽量精确描述函数的行为

l 精心挑选输入/输出的例子

l 声明代码的高层次意图,而非明显的细节

l 用嵌入注释解释难以理解的函数参数

l 用含义丰富的词语

简化循环和逻辑

1. 把控制流变得易读

l 条件语句中参数的顺序

比较左侧: “被询问”的表达式,它的值倾向于不断变化

比较右侧: 用来做比较的表达式,它的值更倾向于常量

l if/else 语句块的顺序

首先处理正逻辑而不是负逻辑

再处理简单的情况

最后处理有趣的或者是可疑的情况

l ?: 表达式, 只有在简单的情况下使用

l 避免 do/while 循环

l 从函数中提前返回

l 最小化嵌套

l 减少循环内嵌套

2. 拆分超长表达式

l 用做解释的变量

c8c164cedcb64b88b4eb5d32dc4d902f.png

l 总结变量(用一个短很多的名字来代替一大块代码,这就是总结变量)

l 拆分巨大的语句

比如:

a29c9a62cd6e4ccca8a110e99b13a356.png

显而易见,这段代码逻辑很清晰,但是看着太复杂,下面改掉:

436ad7f8528741d681bbfce62de1bbad.png

这样做有很多好处:

- 避免输入的错误。

- 缩短了行的宽度,更容易快速阅读。

- 如果类名字改变了,只需要改变一个地方就行了。

3. 变量与可读性

l 减少变量,即那些妨碍的变量。通过离开处理结果来消除“中间结果”的变量。

l 减少每个变量的作用域,越小越好。

l 只写一次的变量更好,那些只设置一次值的变量(或者 const 、final 、常量)使得代码更容易理解。

4. 抽取不相关的子问题

l 积极地发现并抽取不相关的子逻辑:

- 看看某个函数或代码块,问问自己:这段代码的高层次的目标是什么?

- 对于每一行代码,问下:它是为了目标而写的么?

- 如果足够的行数在解决不相关的子问题,试图抽取代码到独立函数中。

l 纯工具代码(封装共用的函数)

l 其他多用途代码(比如页面上数据逻辑代码)

l 创建大量通用代码(组件)

- 通用代码很好,因为“完全地从项目的其他部分中解耦出来”。

l 项目专有的功能(私有组件)

l 简化已有接口,按需重塑接口

5. 一次只做一件事

应该把代码组织得一次只做一件事情。如何给代码整理碎片,下图演示了这个过程:

8bcf6a42bfdf444fb2d5be2e5c407d91.png

6. 把想法变成代码

如果有好的想法,则可以实现为代码,但需要注意以下几点:

l 清楚地描述逻辑

l 可了解相关函数库,以便减少代码量

l 把这个方法应用于更大的问题

l 用自然语言描述解决方案

l 递归地使用这种方法

7. 少写代码

“最好读的代码就是没有代码”,在收到一个需求的时候,要质疑和拆分你的需求,用小的代码库,去替代大的代码库;删除没有用的代码,简化实现过程;熟悉你周边的库,了解最优库;对于一些库的重用,可以极大的节省时间。

总结

以上就是关于可读性代码的建议和实现方式,好的代码不仅阅读轻松,维护起来也是事半功倍。养成好的书写处理习惯,会为我们的工作和学习带来极大的便利。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏

    评论

    相关推荐

    西门子流量累计FB块介绍

    成一个易于使用的模块,从而简化了编程工作,提高了代码可读性和维护。    一、意义    简化编程 :通过使用预先编写好的FB块,工程师可以快速地实现流量累计功能,而无需从头
    的头像 发表于 12-19 10:28 91次阅读
    西门子流量累计FB块介绍

    Java代码之美,从遵循样式规范开始

    作者:京东零售 刘仲伟 在软件开发的世界里,代码不仅是程序的基石,更是程序员交流的通用语言。而Java,作为一门广泛应用于企业级应用的编程语言,其代码可读性和一致对于项目的长期维护
    的头像 发表于 11-27 11:42 184次阅读
    Java<b class='flag-5'>代码</b>之美,从遵循样式规范开始

    对比Python与Java编程语言

    使得编写代码更加灵活,但也可能导致运行时错误。 Java 语法相对冗长,需要显式声明变量类型,增加了代码可读性和安全。 静态类型系统在编
    的头像 发表于 11-15 09:31 290次阅读

    AIC3254的miniDSP编写代码编写C5502代码有什么区别?

    问题:AIC3254的miniDSP编写代码编写C5502代码有什么区别,执行速度和代码量来进行分析吧,谢谢回复
    发表于 11-06 07:22

    java反编译的代码可以修改么

    Java反编译是一种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码可以进行修改,但是需要注意,反编译代码的质量和可读性可能会受到原始编译
    的头像 发表于 09-02 11:00 652次阅读

    hex可以转成源代码

    ,可以通过以下几种方法尝试获取源代码的近似形式: 反汇编 : 使用反汇编工具可以将Hex文件中的机器码转换回汇编语言。汇编语言是一种低级语言,它更接近于机器码,但仍然具有一定的可读性。 通过反汇编得到的汇编代码可以提供程序
    的头像 发表于 09-02 10:41 978次阅读

    深入浅出系列之代码可读性

    ”,这是对我最大的鼓励。 一、老生常谈,到底啥是可读性 一句话:见名知其义。有人说好的代码必然有清晰完整的注释,我不否认;也有人说代码即注释,是代码简洁之道的最高境界,我也不否认。但我
    的头像 发表于 08-09 16:00 259次阅读

    软件设计哲学:新“代码整洁之道”

    工作三年以来一直对写出设计优雅且可读性较好的代码抱有执念,最初接触到的关于代码整洁和软件设计的书是《代码整洁之道》,这本书大概在我入职半年时读完,并在很长的一段时间内将其中谈到的“每个
    的头像 发表于 07-22 12:18 237次阅读
    软件设计哲学:新“<b class='flag-5'>代码</b>整洁之道”

    C语言编码规范,这才是最理想的!

    编码规范,没有最好,只有最合适,有但不执行不如没有。一、编码原则01可读性清晰第一清晰是易于维护程序必须具备的特征。维护期变更代码的成本远远大于开发期,编写程序应该以人为本,计算机第
    的头像 发表于 07-06 08:11 818次阅读
    C语言编码规范,这才是最理想的!

    一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器

    1. 前言 统一返回值封装、统一异常处理和异常错误码体系的意义在于提高代码的可维护可读性,使得代码更加健壮和稳定。统一返回值封装可以避免每一个接口都需要手工拼装响应报文;统一异常处
    的头像 发表于 06-20 15:42 524次阅读

    软件架构搞好了,还用担心代码可读性差?

    :硬件多样:嵌入式系统常常面临不同硬件平台和设备的多样,需要一个灵活的软件架构来适应这些差异。软件复杂:随着嵌入式系统功能的不断增加,软件规模和复杂度也在增加
    的头像 发表于 06-14 08:10 267次阅读
    软件架构搞好了,还用担心<b class='flag-5'>代码</b><b class='flag-5'>可读性</b>差?

    探讨AI编写代码技术,以及提高代码质量的关键:静态代码分析工具Perforce Helix QAC &amp; Klocwork

    令软件开发人员夜不能寐的事情比比皆是。如今,他们最关心的问题不再是如何用自己喜欢的语言(C、C++、Erlang、Java 等)表达最新的算法,而是人工智能(AI)。 本文中,我们将介绍AI编写代码
    的头像 发表于 06-05 14:10 397次阅读

    你是不是也没躲过这个坑?用了太多全局变量......

    的弊端:01代码可读性差漫天全局变量,特别是各个源文件都有全部变量的情况下,代码可读性相信你都能明白有多差。如果再加上命名不规范、随处定义,代码
    的头像 发表于 05-01 08:10 528次阅读
    你是不是也没躲过这个坑?用了太多全局变量......

    提高C代码可读性编写技巧与策略

    指针是 C 语言的灵魂,是 C 比其他语言更灵活,更强大的地方。所以学习 C 语言必须很好的掌握指针。函数指针,即指向函数在内存映射中的首地址的指针,通过函数指针,可以将函数作为参数传递给另一个函数,并在适当的时候调用,从而实现异步通信等功能。
    发表于 04-23 18:25 492次阅读

    如何提升嵌入式C语言代码可读性

    接口是面向对象语言中的一个比较重要的概念,接口只对外部承诺实现该接口的实体可以完成什么样的功能,但是不暴露实现的方式。这样的好处是,实现者可以在不接触接口使用者的代码的情况下,对实现进行调整。
    发表于 04-11 11:30 351次阅读
    如何提升嵌入式C语言<b class='flag-5'>代码</b><b class='flag-5'>可读性</b>