作为一名程序员,如何写出一手让同事膜拜的漂亮代码?

news2025/1/9 0:02:04
  • 整洁的代码

  • 有意义的命名

    • 函数命名

    • 变量命名

  • 函数的定义

  • 注释的规范

  • 代码的长度

  • 代码的对齐

我写代码已经有好几年了,最近看了一本书叫做《代码整洁之道》。我发现这本书中介绍的一些内容对我来说非常有启发性。书中提到的一些方法和技巧让我重新审视了自己的代码风格,让我更加注重代码的可读性和可维护性。例如,书中提到了如何给变量和函数命名,编写注释和文档,以及如何避免代码重复等等。这些技巧和方法都非常实用,我会在今后的编程工作中尽可能地应用它们来提高我的代码质量。 

整洁的代码

来让我们思考一个问题,什么样的代码才算是好代码?

关于这一点我大概整理了一些自己的看法,罗列了之后如下所示:

准确性

可以通过测试用例,满足具体应用场景。

简介性

没有重复性的代码,简洁明了,没有过多的繁琐类的封装,函数,方法。

看到这里,你可能会想,说起来很能理解,但是实际工作中又该如何注意呢?别急,我们来看下边这个反面案例:

 

这段代码是早期我在工作时所写的一段支付代码,在进行支付之前,先判断购物车里的商品库存是否充足,如果充足则进行扣减操作。但是现在回过头来看这段代码,你就会发现存在一些问题。

  • 代码优化分析 首先上边的代码在业务含义上并没有什么的问题,不过我们可以在代码的精炼程度 上进行一些优化。

对于参数校验,购物车校验,库存校验 ,其实我们都可以加入一些类似于断言组件之类的设计进行优化。

另外一些对象构建的代码其实可以做一些封装,因为调用这个接口的同事大多数时候都不会太愿意去关心这些参数的构造过程,更多时候我们只需要将它封装起来,然后通过一个函数的名字来告诉使用者就可以了。

进行优化之后的代码可以变成如下所示:

有意义的命名

函数命名

有的时候,我们对于函数的命名会有出现“名不副其实”的情况,例如下边这个案例:

 

这段代码中,返回的类型是Map类型,但是函数的命名却以List结尾,这样就给人有误解的意思。如果函数的名字没法给人很好的易读性,就需要开发者再花费额外的时间趣深入理解,这就会显得很费劲。再看下边这个案例: 

在这个函数里面,会自动生成一个随机数组,但是数字的值如果是负数,则会自动变为0。但是为什么我们不在函数命名中进行定义呢?例如定义命名为:getNonnegativeArr(int len), 这样不是更好理解函数的意思嘛。

变量命名

对于函数变量的命名不要使用0或者o,1或者l很容易让人看混,另外变量或者参数的命名也尽量使其具有意义,例如下边这个案例所示:

 

例如这个案例中,参数命名采用了list1,list2,就很让人容易误解,不知道哪个参数是源集合,哪个参数是需要被比较的子集合。如果我们对它进行一些优化,看起来的效果就会明显不同,例如: 

使用好的变量命名可以让人清晰了解到这个变量的类型是什么样的,另外在定义一些具有特殊含义的变量时候可以结合下具体的业务场景。例如下边这段代码,需要分别计算工作日 和 周末的订单流水金额总数, 

其实在这里我们可以赋予一个特殊的业务命名来表示,例如下边这样的写法: 

相对于上边的变量i,j写法,这种具有业务含义的变量命名更加能让人明确它的具体含义。

函数的定义

函数的命名

函数的命名尽量保证一个函数只做一件事的原则,不要参杂过多的其他业务操作。

函数的参数个数

通常参数的个数建议最多设置在3个左右,如果参数过多容易让人看了有误解,此时可以尝试用一些类去进行封装。

函数的参数命名

对于有共同含义的参数,我们可以将它命名到同一个变量中,这样能够通过业务领域去定义他们,方便识别。

对于参数的命名可以结合一些工作术语,例如当我们需要定义一个队列参数的时候可以定义JobQueue。

再来看下边这个案例,我们定义了一个用户基础属性类:

 

在这个案例中的name,number,street,city字段分别表示了用户所居住的信息,但是如果我们不加以注释或者没有了解的同事和使用者预先说明的话,这些字段的具体含义是很难看出来的。这种时候我们可以尝试给它加上一些特殊的业务前缀来表示,例如下边两种写法: 

不过更好的表示方式还是单独设计一个对象来存储这些具有明确业务含义的对象,例如定义一个Address对象来管理它们,例如下边所示: 

注释的规范

不要太依赖于注释

关于代码注释方面,相信工作了一段时间的开发都会有以下想法:不太相信代码注释所写的内容。为什么会有这样的想法呢? 我感觉主要原因还是和代码的不断迭代有关,随着代码的不断改动,其内部的流程早已经和注释表达的含义背道而驰。所以有时候我们代码注释的意义并不是特别大。

有时候如果代码注释和核心内容不符的时候,它反而成了一段“谎言”的存在。所以我认为:唯一真正好的注释是你要想办法去不用写注释。

别写废话注释

在我早期工作的时候,这个点确实经常会犯,例如定义一个对象的时候,我几乎会给每个字段都加入一行注释,例如下边这个类:

 

虽然说给每个字段都备注了注释,看起来也似乎很规范,但是这样的做法反而给人感觉写了一堆废话。通过每个字段的命名来看,难道它们还能有别的意思嘛?而且时间久了,别人看到这些无用的注释之后也会自动过滤掉它们的含义。

代码的长度

通常我们定义的一个类,其包含的代码量不建议设计得太大,大部分都浓缩在500行以内这个范围就好了。这是因为通常短的内容会比长的内容更方便让人理解,这就好比现如今的人更喜欢刷短视频,但是对于一些长达几十分钟或者几个小时的短片/电影却没有那么感兴趣。

除了好阅读之外,在实际工作中,大家如果使用的电脑配置不高,在电脑运行了很久的情况下再去用编辑器去修改一些篇幅非常大的类,反而会塌瘪慢。(我试过用Idea打开一份3000+行数的代码文件,挪动一格光标大概会有1秒的延迟)

另外,也并不是说代码的长度越短越好,有时候适当的空格与换行可以增加代码片段的可读性。

代码的对齐

在编写代码的时候,对于变量的对齐格式不同,其实也是有讲究的。来看下边两组不同代码的书写风格:

变量的名称统一对齐:

变量的类型统一对齐: 

在工作中,我更加会倾向于使用第二种书写格式,因为它给我的感觉会让人更加清晰看到对应变量的格式类型是怎样的。而对于第一种类型而言,给人感觉对于变量的类型不是那么地关注。

你们有哪些很好的代码习惯,欢迎分享。

 

 

 

 

 

 

 

 

 

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

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

相关文章

疑难问题定位案例复盘(三)

今天我们分享一个数据库被异常改写的案例,通过该案例我们可以学习总结出常规的文件被改写问题定位思路。 问题现象 1、测试环境在进行特定压力测试时发现页面登陆异常,且调试日志多个进程持续打印“数据库打开失败”日志。 2、测试环境在进行多个压力测…

Unity教程||Unity添加中文字体||Unity知识记录--制作UI粒子特效

Unity添加中文字体 ## 1、拷贝字体文件 拷贝C:\Windows\Fonts文件夹下,华文细黑常规文件到项目中 ## 2、下载中文字库 链接: https://pan.baidu.com/s/1KW31KB5vEImZHUWvQ9PLEQ 提取码: bgug 3、添加字体字库 选择Window->TextMeshPro->Font Asset Crea…

HTML的基础语法

文章目录 前言一.HTML结构1.1 什么是html语言1.2 html的结构是什么 二.HTML常见标签2.1 文本格式标签标题标签段落标签换行标签格式化标签图片标签超链接标签 2.2 表格标签2.3 表单标签from标签input标签文本框密码框单选框复选框普通按钮提交按钮清空按钮选择文件select标签te…

延迟队列与SpringBoot实战

延迟队列与SpringBoot实战 概念 延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列 …

基于jQuery------购物车案例

目录 基于jQuery------购物车案例 案例:购物车案例模块-增减商品数量分析 案例:购物车案例模块-修改商品小计分析 案例:购物车案例模块-计算总计和总额 案例:购物车案例模块-删除商品模块 案例:购物车案例模块-选…

从‘discover.partitions‘=‘true‘分析Hive的TBLPROPERTIES

从’discover.partitions’true’分析Hive的TBLPROPERTIES 前言 Hive3.1.2先建表: show databases ;use db_lzy;show tables ;create external table if not exists test_external_20230502(id int,comment1 string,comment2 string ) stored as parquet ;creat…

C语言通过控制台命令行传入参数

Linux 与 windows运行c语言程序 切换到对应目录下 1. gcc hello.c -o hello 2.Linux: ./hello Windows: hello.exe int main(){}默认无参数 但在一些情况下想要直接通过在上述过程中第二步就传入参数而不是使用scanf..之类的输入语句就需要使用有参数的main方法: int main() {…

Docker--harbor私有库部署与管理

目录 一、本地私有仓库 搭建本地私有仓库 Docker容器的重启策略 二、Harbor 1、什么是Harbor 2、Harbor特性 3、Harbor的构成 三、Harbor部署 实验步骤 1、安装Docker-Compose服务 2、部署Harbor服务 1、下载或上传Harbor安装程序 2、修改Harbor安装的配置文件 3、…

基于TI板MSP430 玩转PID

文章目录 前言一、整体框架二、PID算法1. 位置式PID2. 增量式PID3. 比例外置式PID4. 积分限幅、输出限幅和PID参数整定5. 位置式PID和增量式PID的区别及抉择 三、初值获取1. 定时器输入捕获2. 外部中断3. ADC采样 前言 具体啥是PID,我这里不做介绍,网上…

SpringMVC(后)SSM整合

10、文件上传和下载 10.1、文件下载 ResponseEntity用于控制器方法的返回值类型&#xff0c;该控制器方法的返回值就是响应到浏览器的响应报文 使用ResponseEntity实现下载文件的功能 RequestMapping("/testDown") public ResponseEntity<byte[]> testResp…

【Hello Algorithm】复杂度 二分法

作者&#xff1a;小萌新 专栏&#xff1a;算法 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;介绍算法的复杂度 对数器和二分法 复杂度 对数器 二分法 复杂度常数时间操作非常数时间操作时间复杂度空间复杂度 二分法有序数组中找一个值寻找有序…

树的存储和遍历

文章目录 6.5 树与森林6.5.1 树的存储结构1. 双亲表示法(顺序存储结构)2 孩子链表表示法3 孩子兄弟表示法(二叉树表示法) 6.5.2 森林与二叉树的转换1 树转换成二叉树2 二叉树转换成树3 森林转换成二叉树4 二叉树转换成森林 6.5.3 树和森林的遍历1. 树的遍历2. 森林的遍历 6.6 赫…

数据库篇:表设计、创建编辑以及导出导入数据

微信小程序云开发实战-答题积分赛小程序系列 数据库篇:表设计、添加编辑以及导出导入数据 原型: 最终实现界面截图:

Moqui REST API的两种实现方法

实现Restful API的方法 实现REST API有两种方法。第一种&#xff1a; The main tool for building a REST API based on internal services and entity operations is to define resource paths in a Service REST API XML file such as the moqui.rest.xml file in moqui-fr…

chatGPT国内可用镜像源地址

chatGPT国内可用镜像源地址 彷丶徨丶 关注 IP属地: 湖北 0.811 2023.03.15 16:02:16 字数 1,152 阅读 249,582 如果你正在尝试访问Chatgpt网站&#xff0c;但由于某些原因无法访问该网站&#xff0c;那么你可以尝试使用Chatgpt的国内镜像网站。以下是一些Chatgpt国内镜像网站的…

java基础知识——27.动态代理

这篇文章&#xff0c;我们来学一下java的动态代理 目录 1.动态代理的介绍 2.具体的代码实现 1.动态代理的介绍 动态代理&#xff1a;无侵入式的额外给代码增加功能 很不好理解&#xff0c;下面&#xff0c;我们通过两个例子来说明一下什么是动态代理&#xff1a; 例一&a…

shell编程 -- 基础

shell是一个命令行解释器&#xff0c;它接收应用程序/用户命令&#xff0c;然后调用操作系统内核。 linux笔记 链接&#xff1a;https://pan.baidu.com/s/16GZCPfUTRzUqIyGnYwPuUg?pwds5xt 提取码&#xff1a;s5xt 脚本执行 采用bash或者sh脚本的相对路径或绝对路径&#x…

TikTok跨境电商如何选品和营销?

鑫优尚电子商务&#xff1a;TikTok目前发展飞速&#xff0c;全球的MAU是5.6亿。现在作为全球炙手可热的短视频平台&#xff0c;全球流量相当庞大&#xff0c;覆盖75个语种、全球150个国家和地区。 对于从事跨境电商行业的人来说&#xff0c;又怎能错过一个流量这么好的平台呢&a…

ChatGPT注册详细步骤教程-ChatGPT申请教程

注册chatGPT账号的详细经验教程 注册ChatGPT账号是使用这一自然语言生成技术的关键步骤。下面是注册ChatGPT账号的详细经验教程&#xff1a; 访问OpenAI注册页面 在Web浏览器中打开OpenAI注册页面。 2.输入个人信息 在注册页面上&#xff0c;您需要提供以下个人信息&#…

树莓派 二维云台调零控制

目录 舵机的工作原理 案例程序 要求&#xff1a; 程序&#xff1a; 二维云台是通过IIC总线进行控制的&#xff0c;我们可以通过窗口命令输入&#xff1a;i2cdetect -y 1来检测IIC总线是否连接正常。 当有40显示的时候就说明IIC总线正常。 操控舵机我们需要一个PCA9685的模…