代码重构之路--我的2022年总结(代码片段)

周兆熊 周兆熊     2023-01-19     731

关键词:

2022年是我正式参加工作的第10个年头,也是我在CSDN上写博客的第11个年头。在这10余年的时间里,虽然在工作上遇到了各种情况,但我一直坚持输出、坚持分享,一共在CSDN上发表了530多篇原创博文。在这些文章中,大部分都是与技术、软件开发相关的,很多文章中都包含了具体的程序代码。
在2022年初的时候,我就立了一个flag:将过去10年里在CSDN博客上发表的文章归类整理,并对主要的程序代码进行重构,以此纪念自己的10年工作。从2022年1月开始,到6月结束,花了将近半年的时间,我圆满完成了这个flag。在这篇文章中,我来回顾一下自己的代码重构之路,也算是对过去的2022年的一个总结。

确定代码重构范围
既然要对代码进行重构,那么首先就要确定具体是哪些代码需要重构。积累10年下来,我的博客的分类比较多,既有软件开发类的,也有技术经验分享类的,还有读书总结类的。我花了将近一个月的时间,从500多篇博文中选出了包含程序代码的文章,并最终确定了需要进行重构的程序代码。我确定重构代码的依据是这些程序代码要有参考性和实用性,大家拿过去就可以应用到具体的项目中。
经过多轮挑选,最终入选我的重构清单的代码所在的博文标题如下:

shell脚本中的文件操作
Windows下C程序中唯一序列号的生成
Linux下vi替换字符命令操作实例
C语言中结构体参数变量的传递
Linux下的目录创建命令使用实践
Linux下将数据库脚本文件从sh格式变为sql格式
Linux下的目录扫描操作函数使用实践
Linux下的删除过期文件操作
寻找满足后缀要求的第一个文件名及其类型的C程序实现
Windows下修改文件后缀的C语言实现
Linux下生成随机密码的C代码实现
Windows下一个简单的日志系统的C代码实现
C语言中结构体变量之间赋值
Linux下写文件头的算法流程及C代码实现
Windows下对密码进行加解密的C代码示例
判断输入年份是否为闰年的另一种方法
Linux下水仙花数&素数&质因数分解的C语言实现
Linux下程序休眠问题的C代码实现
Linux下配置文件读取操作流程及其C代码实现
Linux下互斥量加锁与解锁操作的C代码实现
Linux下获取代码文件名、代码所在行数及日期时间的C程序实现
Linux下获取当前时间到1970年之前某年份的秒数的C代码实现
Linux下一个简单的日志系统的设计及其C代码实现
Linux下合并字符串中连续的多个空格的C代码实现
Linux下分批读取文件中数据的程序流程及其C代码实现
Linux下socket消息流程介绍及其C代码实现
Linux下时间范围判断的程序流程及其C代码实现
Linux下合并前缀相同的文件的程序流程及其C代码实现
Linux下按照时间和大小生成新文件的程序流程及其C代码实现
Linux下两种删除过期文件的方法详述
Windows下写文件时字段对齐和填充的C代码实现
用gdb分析core文件及常见gdb命令操作示例
“多线程”简介及其C代码实现框架
C语言多线程中变量累加问题的分析
查找栈的增长方向的分析及C代码实现
Linux下去除源文件中的重复行的程序流程及其C代码实现
Linux下在主机上实现对备机上目录及文件的操作的C代码实现
Linux下控制(统计)文件的生成的C代码实现
Linux下静态库和动态库简介及生成过程示例
Linux下将前缀和后缀相同的文件移动到同一个目录的算法设计及C代码实现
Linux下将源目录中的文件按照前缀分发到不同目录中的算法设计及C代码实现
结构体中指针赋值问题的分析及C代码示例
Linux下入队列和出队列操作的C代码示例
文件剪切的shell脚本实现
Linux下限制程序中某类操作的执行次数的算法设计及C代码实现
Linux下动态内存分配的C代码示例
C语言代码评审小结
用shell脚本合并多个文件内容
Linux下程序启动之后的初始化—检查配置文件及读取日志配置项的值

确定代码重构(编程)规范
军事上称“兵马未动,粮草先行”,对应到软件开发上就是“代码未写,规范先行”。只有先把编程规范定出来,大家才会有一个编写程序的标准,后面每个人写出来的程序才会有一个统一的风格,这样也方便软件的后期维护。由于我长期从事Linux下的C语言开发,因此基于这些经验,我确定的代码重构(编程)规范主要如下:
1、总体规则
1)代码文件名、函数名、结构体名、变量名、宏定义等统一采用unix代码编写风格。
2)代码中重要变量、关键流程及函数头部必须要有注释。
3)代码中尽量不要出现不常用的缩写。
4)每个函数的参数个数不能超过5个。
5)代码中使用到的常量均使用大写来定义。
6)代码的注释量要达到总体代码量的30%以上。
2、代码规范示例

1)变量名

int    msg_type = 0;
char   request_type[10] = 0;
char  *msg_buf = NULL;
int     g_file_no = 0;   // 全局变量
static  int  s_loop_flag = 0;  // 静态变量

2)代码文件名

new_file_create.c
exp_file_del.c
config_file_read.h

3)结构体名

typedef struct 

	int src_addr;    // 源地址
	int dst_addr;    // 目标地址
	char src_port;   // 源端口
	char dst_port;   // 目标端口
 t_addr_info;
t_addr_info  addr_info;
t_addr_info  *addr_info_new;

4)枚举名

typedef enum

    LEFT_BLANK = 1,
    RIGHT_BLANK,
    LEFT_ZERO,
    RIGHT_ZERO
 e_oper;

5)函数名

int send_request_msg();
char deal_response_msg(int msg_type, char *msg_content);

6)宏定义

#define  MAX_CONTENT_LEN     256
#define  MAX_BUF_LEN         50
#define  LOCK_TIME_OUT       5000 

7)文件注释

/*********************************************************
* 文件名称: lock_and_unlock.c
* 文件标识: 无
* 内容摘要: 加锁与解锁
* 其它说明: 无
* 当前版本: V1.0
* 作   者: 周兆熊
* 完成日期: 20220507
**********************************************************/

8)函数注释

/************************************************************  
 * 功能描述: 互斥量加锁  
 * 输入参数: 无 
 * 输出参数: 无 
 * 返 回 值: 0-成功, -1-失败  
 * 其它说明: 无   
 * 修改日期          版本号          修改人         修改内容  
 * -------------------------------------------------------- 
 * 20220507         V1.0       Zhou Zhaoxiong     创建  
 ************************************************************/  

9)if/for/while/switch等语句

// if语句
if (条件)

    执行语句;

else if (条件2)

    执行语句2;

else

    执行语句3;


// while语句
while (条件)

    执行语句;


// for语句
for (i=0; i<X; i++)

    执行语句;


// switch语句
switch (条件)

    case CMD_READ_RSP:
    
        read_rsp_cmd(attr_cmd);
        break;
    
    case CMD_DEFAULT_RSP:
    
	    default_rsp_cmd(attr_cmd);
	    break;
    
    default:
    
	    // break;
    

代码重构及验证
从3月初开始,我正式启动了对代码的重构工作。由于之前的代码风格不统一,因此所谓的重构代码,可以说是重新写代码。具体的代码编写过程,我不再细说,相信有过代码编写或重构经验的朋友都会有所体会,这里分享下我个人的几个编程经验:
1、代码编写工具的选择
由于我在工作中用Linux的时间比较多,因此习惯了用VIM工具进行代码编写。虽然VIM比不上Windows下的代码编写工具(如source insight)那样操作便捷、界面美观,但仍然是Linux开发者的首选代码编辑器。通过安装一些插件或做一些设置,VIM可以达到近似source insight软件的效果。我的VIM编辑界面如下:

2、编译方式的选择
由于是基于Linux系统的C语言编程,那么代码编译工具就是gcc或g++。在之前的博文中,我还编写了makefile文件进行代码的编译。此次代码重构时,我直接使用了gcc命令进行编译,主要的考虑是我的代码量不大且代码文件不多,没有必要单独编写makefile文件,这样也可以加快我的代码重构进度。
为了方便代码的编译和持续优化,我将编译命令以注释的方式放到了代码文件中,需要使用的时候直接copy就行。

3、代码及时编译、及时修改优化
由于是代码重构,因此重构前整体功能基本是没问题的。如果代码重构完成之后编译不过或功能异常,那么大概率是重构过程中代码编写错误或逻辑理解错误造成的。所以,为了及时发现代码重构过程中的问题,我一般是每重构完一个函数就编译一次并简单测试一下,有问题就解问题,没问题就继续重构下一个函数。这样也避免了问题的累积,提高了工作的效率。


代码整理归档
经过了3个多月的“奋战”,到了6月初的时候,我达成了预定的计划,完成了40余个主题(对应每一篇博文)代码的重构,并全部测试验证通过。看着这一行行凝聚了自己心血的代码,我不禁感叹:写好代码确实太不容易了!
由于每篇博文的标题比较长,不够精炼,因此在将重构代码整理归档的时候,我对每个主题的标题均进行了简化,只展现最核心的内容,方便后期查阅。

同时,为了防止本地代码被误删或丢失,我又将重构之后的代码备份了一份到百度网盘上。对于程序员来说,代码备份工作是不可缺少的。

结束语
通过本次代码重构,我不仅进一步提升了自己的编程能力,而且对代码编写有了新的认识。在以前,我会觉得只要程序功能正常、代码编写得规范就可以了,但是在代码重构的过程中,我发现如果要深究,代码永远都有优化的空间和改进的余地。也就是说,我们不要满足于自身已有的技能,在温故而知新的同时,也要加强新技术、新思维的学习,这样才能够跟上技术前进的脚步。
回望过去的2022年,有太多的困难,但庆幸的是自己还是一路平平安安地走过来了。在2023年,我希望用自己的力量为家人带来幸福、为同事带来帮助、为公司带来价值。最为重要的是,希望在2023年里,自己能够一切顺利,平安健康!
如果有朋友对我重构的代码感兴趣,可以私信与我沟通。最后,祝大家在新的一年里身体健康、工作顺利、幸福安康!也祝CSDN越办越好!

回顾2021,展望2022,静yu的万粉成长之路(代码片段)

万粉成长之路前言CSDN的发展建立社区收获奖品2022的展望福利发放本周福利祝福前言光阴似箭,转眼间2020年已经过去,一年时间里,有开心、有失落、有所失去、也有所收获。在一年的结束做一个年末总结,总结... 查看详情

李迟2022年12月工作生活总结(代码片段)

本文为2022年12月工作生活总结。研发编码Go一个Golang的编译脚本mybuild.sh:#!/bin/bashVersion="v0.0.1"VER=""if[$#=1];thenVER=$1Version=""$VERelseecho"notsetversion,using 查看详情

李迟2022年12月工作生活总结(代码片段)

本文为2022年12月工作生活总结。研发编码Go一个Golang的编译脚本mybuild.sh:#!/bin/bashVersion="v0.0.1"VER=""if[$#=1];thenVER=$1Version=""$VERelseecho"notsetversion,using 查看详情

李迟2022年1月知识总结(代码片段)

本文为2022年1月知识总结。研发编码Golanggolang中中文字符长度为3,如下示例中,判断某字段中文开头是否为“广西”二字,如是则舍去,只保留后面的字符串,如“广西岑溪市”变为“岑溪市”。outName:=stri... 查看详情

李迟2022年2月知识总结(代码片段)

本文为2022年2月知识总结。研发编码GolangLinuxlinux系统可用nc命令来模拟Socket服务端和客户端。已在工作中应用到。在后台执行valgrind时,可用nohupvalgrindxxx./a.out&命令,即使断开终端也不会停止,如要停止,使用ki... 查看详情

李迟2022年11月工作生活总结(代码片段)

本文为2022年11月工作生活总结。研发编码Go研究了一些结构体、json相关的东西,感觉挺方便的,有空单独写出来。Docker使用alphine构建的一个应用服务镜像,其中有一解压zip文件功能sh./config/extract.sh./data/website/Archive:/tm... 查看详情

李迟2022年11月工作生活总结(代码片段)

本文为2022年11月工作生活总结。研发编码Go研究了一些结构体、json相关的东西,感觉挺方便的,有空单独写出来。Docker使用alphine构建的一个应用服务镜像,其中有一解压zip文件功能sh./config/extract.sh./data/website/Archive:/tm... 查看详情

李迟2022年9月工作生活总结(代码片段)

...年9月工作生活总结。研发编码Java调试时发现在Java函数体代码中途使用return返回,其后的代码会报错,提示:java:无法访问的语句不知何故。只好用if(1==0)...这样的形式来达到目的。Go协程及同步相关Go中协程同... 查看详情

李迟2022年9月工作生活总结(代码片段)

...年9月工作生活总结。研发编码Java调试时发现在Java函数体代码中途使用return返回,其后的代码会报错,提示:java:无法访问的语句不知何故。只好用if(1==0)...这样的形式来达到目的。Go协程及同步相关Go中协程同... 查看详情

李迟2022年9月工作生活总结(代码片段)

...年9月工作生活总结。研发编码Java调试时发现在Java函数体代码中途使用return返回,其后的代码会报错,提示:java:无法访问的语句不知何故。只好用if(1==0)...这样的形式来达到目的。Go协程及同步相关Go中协程同... 查看详情

李迟2022年10月工作生活总结(代码片段)

本文为2022年10月工作生活总结。研发编码Go判断interface是否为空判断interface类型是否为空,不能直接使用==nil来判断(用之无效),需先用reflect.ValueOf判断为指针类型,再使用IsNil函数判断,如下:... 查看详情

李迟2022年10月工作生活总结(代码片段)

本文为2022年10月工作生活总结。研发编码Go判断interface是否为空判断interface类型是否为空,不能直接使用==nil来判断(用之无效),需先用reflect.ValueOf判断为指针类型,再使用IsNil函数判断,如下:... 查看详情

李迟2022年6月工作生活总结(代码片段)

本文为2022年6月工作生活总结。研发编码前端需求:某输入框自动补全,带有中文名称,但后端只处理数字,需解析出数字并序列化。如将梧州岑溪001改为001,但页面依然显示前者。解析函数如下:functionde... 查看详情

李迟2022年6月工作生活总结(代码片段)

本文为2022年6月工作生活总结。研发编码前端需求:某输入框自动补全,带有中文名称,但后端只处理数字,需解析出数字并序列化。如将梧州岑溪001改为001,但页面依然显示前者。解析函数如下:functionde... 查看详情

李迟2022年6月工作生活总结(代码片段)

本文为2022年6月工作生活总结。研发编码前端需求:某输入框自动补全,带有中文名称,但后端只处理数字,需解析出数字并序列化。如将梧州岑溪001改为001,但页面依然显示前者。解析函数如下:functionde... 查看详情

2022年年终总结(代码片段)

“逝者如斯夫,不舍昼夜。”真是不经意间,22年即将要过去了,春节也马上要到了。今年本来不想做个总结的,但总感觉少了点啥,所以从周一拖到了周五,到了今天才开始准备写。概述今年是我在深圳... 查看详情

2022年个人总结(代码片段)

2023年的脚步已经来临了。时光荏苒,白驹过隙,日月如梭,岁月不居,时节如流,又到了一年总结的时候了。概述今年过得特别快,很多时候都是忙,各种忙,记得去年12月份中旬开始加班,今... 查看详情

2022年个人总结(代码片段)

2023年的脚步已经来临了。时光荏苒,白驹过隙,日月如梭,岁月不居,时节如流,又到了一年总结的时候了。概述今年过得特别快,很多时候都是忙,各种忙,记得去年12月份中旬开始加班,今... 查看详情