找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4613

积分

0

好友

597

主题
发表于 昨天 09:32 | 查看: 13| 回复: 0

不只女人要保养,代码也是如此。面向对象编程,就是把面对的代码当作对象一样,定期对其进行保养。

目录

一、美颜 Astyle+Source Insight

二、祛痘 cppCheck

三、返老还童 git

四、工欲善其事必先利其器

一、美颜 Astyle+Source Insight

1.1 真假小龙女的问题

都说秀色可餐,同样的角色,都是小龙女,但效果可能天差地别。

小龙女不同造型对比

实现同样的功能,有的代码一目了然,像诗一样赏心悦目;有的却像 SHI 一样。下面这段代码功能正常,但看起来什么感觉?

//C语言混乱大赛作品
#include <stdio.h>
main(int t,int _,char* a)
{
    return !0<t?t<3?main(-79,-13,a+main(-87,1-_,
main(-86,0,a+1)+a)):1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13?
main(2,_+1,"%s %d %d\n"):9:16:t<0?t<-72?main(_,t,
"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/")
:t<-50?_==*a?putchar(a[31]):main(-65,_,a+1):main((*a=='/')+t,_,a+1)
:0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,
"!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);
}

正如女人爱美一样,出门必化妆,拍照必美颜;代码也需要美颜妆扮,除非你期望后来接手者在心中送上十万个诅咒:这 TM 谁写的?尤其对嵌入式系统产品,升级维护周期长,软件的可读性就显得更加重要。代码规范对后续维护升级是大有裨益的。

1.2 代码格式化

一般公司不缺编码规范,缺的是执行。小项目单人完成,编码风格随心所欲;大项目团队完成,编码风格各不相同。目前来说,个人只发现 go 语言是编译时强制格式化,其他语言编译时不检查排版格式。对于编码规范,不能依靠个人主观,强推工具自动实现才能提高执行力。

不管编码使用 Keil/MDK、Qt 等集成工具,还是纯粹的代码编辑工具 Source Insight,一般都支持自定义运行可执行文件,如 Astyle。可以客制化新菜单,一键执行 Astyle,将代码一键格式化,排版统一、层次分明。

Astyle 官网 http://astyle.sourceforge.net/ 按要求下载安装,只需要 AStyle.exe 即可。关于其使用和参数,可以进入 Documentation 查看。对代码基本风格,{} 如何对齐、是否换行,switch-case 如何排版,tab 键占位宽度,运算符或变量前后的空格等等,基本上代码排版涉及的方方面面都有参数说明。个人选择的编码参数是:

--style=allman -S -U -t -n -K -p -s4 -j -q -Y -xW -xV fileName

效果如下:

int Foo(bool isBar)
{
    if (isBar)
    {
        bar();
        return 1;
    }
    else
    {
        return 0;
    }
}

建议先参考文档逐个熟悉作用,确认参数,然后集成到编辑工具,以 Source Insight 为例。

1、在选项或者工具下(不同 Source Insight 版本不同)打开“自定义命令”,添加命令和运行。

自定义命令窗口 Astyle 参数配置

2、选择正确的路径,结合前面的参数类型,最后必须加上 %f,表示对该文件执行,

C:\AStyle.exe --style=allman -S -U -t -n -K -p -s4 -j -q -Y -xW -xV %f

菜单分配窗口插入 Astyle 命令

3、将该命令插入到编辑菜单,后续在编辑栏点击 Astyle,即可对当前文件自动进行格式化排版。

1.3 高级配置

前面只是 Source Insight 的基础扩展,下面简要说明下高级扩展宏功能,本文只描述基本流程。

1、配置菜单

菜单分配窗口宏命令配置

2、插入之后,在主菜单栏会出现“工作”菜单,点击 Insertifdef,弹出如下对话框:

Source Insight 输入 ifdef 条件对话框

3、确定之后自动在光标处插入代码:

#if defined (ABCD)

#endif /* ABCD */

4、不止是支持插入 if defined,还包括插入文件头,对 h 文件插入避免多次包含的宏,对函数插入注释,以及自动添加编辑时间、作者名称等。这些宏配置和前面一样,至于客制化,比如函数注释的内容、格式等,也可以自由定义。

5、配置路径如下:

Source Insight Base 工程文件目录

先关闭全部 Source Insight 工程,再打开 Base.PR,编辑 utils.em。如前面的宏 Insertifdef 就是如下的代码:

macro InsertIfdef()
{
 sz = Ask("Enter ifdef condition:")
 if (sz != "")
  IfdefSz(sz);
}

// Wrap ifdef <sz> .. endif around the current selection
macro IfdefSz(sz)
{
 hwnd = GetCurrentWnd()
 lnFirst = GetWndSelLnFirst(hwnd)
 lnLast = GetWndSelLnLast(hwnd)

 hbuf = GetCurrentBuf()
 InsBufLine(hbuf, lnFirst, "#if defined (@sz@)")
 InsBufLine(hbuf, lnLast+2, "#endif /* @sz@ */")
}

如 Ask 就是弹出提示语,sz 获取输入的内容,再 InsBufLine 插入两行代码。而这些接口的使用说明,只要打开 Source Insight 的帮助即可查看。

Source Insight 宏语言指南帮助文档

Ask 说明:

宏语言 Ask 函数说明

例如插入函数注释的代码如下:

 szInf = Ask("你为什么要编写这个函数:")
 szDescription = Ask("请输入函数的使用注意事项和算法实现:")
 // begin assembling the title string
 sz = "/******************************************************************************"
 InsBufLine(hbuf, ln, sz)
 InsBufLine(hbuf, ln + 1, " *  Function    -  @szFunc@")
 InsBufLine(hbuf, ln + 2, " * ")
 InsBufLine(hbuf, ln + 3, " *  Purpose     -  @szInf@")
 InsBufLine(hbuf, ln + 4, " * ")
 InsBufLine(hbuf, ln + 5, " *  Description -  @szDescription@")
 InsBufLine(hbuf, ln + 6, " * ")
 InsBufLine(hbuf, ln + 7, " * modification history")
 InsBufLine(hbuf, ln + 8, " * ----------------------------------------")
 InsBufLine(hbuf, ln + 9, " * v1.0  , @szDay@-@szMonth@-@Year@,  @szMyName@  written")
 InsBufLine(hbuf, ln + 10, " * ----------------------------------------")
 InsBufLine(hbuf, ln + 11, " ******************************************************************************/")

最终自动插入的函数注释显示效果如下:

/******************************************************************************
 *  Function    -  [myFunction]
 *
 *  Purpose     -
 *
 *  Description -  [函数的功能]
 *
 *  modification history
 * ----------------------------------------
 * v1.0  , 22-11-2020,  embedded-system  written   [时间格式可自由设定]
 * ----------------------------------------
*******************************************************************************/

6、其他宏也是这样,可以自由配置。当然,开启这个功能的第一步是先编辑,替换全部 szMyName 为自己的名字。有一点需要注意的是插入函数注释时,光标必须在该函数第一个 { 内,否则无法获取函数名,会提示错误。

1.4 总结

Source Insight 集成 Astyle 自动排版,统一风格;集成宏定义,统一注释格式、提高效率。

二、祛痘 cppCheck

2.1 祛痘除隐患

依靠美颜可以掩盖面部瑕疵,如痘痘,但为了极致,应该从根源祛痘,素颜就美,淡妆浓抹总相宜。代码规范整齐,还要没有隐患,大部分开发人员都对警告视而不见,觉得隐患没啥大问题。

古装女子面部斑点示意

同样的美女,若是一脸痘痘,颜值瞬间下降。代码也是如此,编译警告如同痘痘,看起来不碍事,实际对代码质量和后期维护都是隐患。要培养习惯,凡是警告都要消灭的习惯。

另外对于编码规范,不只是排版布局,还有命名规范,例如宏定义使用小写字母,就必须指出要求修改。所以,代码必须经过祛痘,除去小隐患,严苛的要求才能造就趋于完美的代码。但是,依靠人工检查效率低下,静态扫描顺便检查命名规范的神器应运而生。

代码的静态检测工具有很多,为什么推荐 cppCheck?因为它是 Qt 实现且开源。作为嵌入式软件开发,Qt 可以锦上添花,它本身可以多平台运行,平时使用它开发小工具,模拟验证部分代码,比起在真机编译下载调试快捷方便。

cppCheck 官网 http://cppcheck.net/,可以下载执行文件和源码。稍微有 Qt 基础的,可以下载源码,其 Qt 工程如下,可以根据自身要求和能力进行二次开发。

cppcheck Qt 工程文件列表

实现代码自动格式化和静态分析,可以有效规避软件风险。基于开源的 Cppcheck,集成 Astyle,结合实际开发平台和编码标准,使用 Qt 集成的 codeCheck 诞生了。

codeCheck 执行的流程是:先将 C 语言代码自动格式化,按指定的规则排版对齐,调整代码间空格和间距,特殊语句强制换行或添加括号等,简单操作即可完成代码格式统一化(也就是上一章的配置参数)。然后拆分代码字符,建立 token 数据库,按预置的规则分析代码是否存在匹配的非法代码,并直观显示风险代码位置以便跟踪修复。codeCheck 不具备编译语法分析,因此导入的文件必须先确保编译正常,再进行分析才有意义。

针对实际开发中的问题点,比如变量命名冲突,或者关键变量缺少注释导致维护升级困难,特别增加了个性化扫描标准。由于个人时间和水平有限,工具还存在优化改进的必要,但基本可满足常规应用和新人培养。

即使没有 Qt 基础,直接使用开源版本,也是相当给力的,二次开发只是锦上添花而已。

2.2 代码扫描与静态分析

个人二次开发后的主界面如下,和原始的 cppcheck 差不多,只是多了命名规范检查(全局变量必须 g_ 开头,带注释;宏定义、枚举值禁止包含小写字母等)。

codeCheck 主界面功能说明

“分析”导入文件或文件夹后,即可启动自动格式化并分析代码逻辑,显示结果如下:

codeCheck 静态分析日志界面

选择“分析结果”栏,则显示扫描出的风险代码,标明风险类型和代码位置,具体显示如下图:

codeCheck 分析结果风险代码列表

codeCheck 命名规范问题详情

2.3 源码分析

非 cppcheck 源码,二次开发的代码片段。

void CheckThread::run()  //运行扫描,这里是入口
{
 /**/
    QString file = mResult.getNextFile();
    while (!file.isEmpty() && mState == Running)
    {
        qDebug() << "format file" << file;
        file_format(file);//添加Astyle命令
        mCppcheck.check(file.toStdString());
     /**/
     }
     /**/
//astyle.exe v3.1  添加代码格式化
void CheckThread::file_format(const QString file)
{
    QProcess builder;
    QStringList param;

    param<<"--style=allman"<<"-S"<<"-U"<<"-t"<<"-n"<<"-K"<<"-p"<<"-s4"<<"-j"<<"-q"\
        <<"-Y"<<"-xW"<<"-xV"<<file;

    if(file.endsWith(".c",Qt::CaseSensitive)||file.endsWith(".cpp",Qt::CaseSensitive)\
       ||file.endsWith(".h",Qt::CaseSensitive))
    {
        builder.start("codeFormat.exe",param);
        builder.waitForFinished();
    }
}

2.4 总结

实现代码自动格式化和静态分析,可以有效规避软件风险。

三、返老还童 git

3.1 月光宝盒

至尊宝经典台词画面

爱情不可期,往事成追忆。至尊宝可以使用月光宝盒穿越时空去寻找爱情。对于女人,拥有月光宝盒,即使容颜衰老,也可以回到过去,返老还童,永葆青春。

对于程序员,一份完美的代码,修修补补,几经折腾终于封板;因为保存不善或者修改记录丢失,那种痛苦也是一般人无法想象的。为了不会有失去才后悔莫急的痛楚,必须使用版本控制来追溯代码的过去。程序员的月光宝盒就是 Git 神器。

3.2 版本控制 git

不必说你有多聪明,每天拷贝一份代码加描述备份;也不要说以往的 svn 等工具有多先进;这些工具在 git 的分布式软件版本控制面前,都不值一提。虽然 Git 也有缺点,但依然不能掩盖它的光芒。

十年来,一直是嵌入式软件开发,80% 的时间使用 Windows 版的 git 可视化操作。相比命令行,更容易掌握与使用,查看版本记录也更加直观,命令行的操作方式不在本文考虑范围。git 官网 https://git-scm.com/

1、安装 TortoiseGit-2.5.0.0-64bit.msi 一路下一步,这只是安装了 git 的内核功能,要在 Windows 下操作,需要安装界面外壳。

2、安装 GitExtensions-2.50.02-SetupComplete.msi 或者 Git-2.15.0-64-bit.exe,这是两种风格的界面,主体功能差不多,个人选择的是后者。也可以两个都安装。

3、安装过程中出现较多的配置,所有选项中,全部都选带 Windows 关键字的,否则用起来看不出问题,但是保存的记录异常。

既然是界面操作,就开启鼠标右键的快捷图标。

Git 安装组件选择界面

后续一些安装选项,全部选带 Windows 关键字的。

Git 安装 PATH 环境配置界面

4、安装完成后,鼠标右键,会出现 Git GUI Here。

文件夹右键菜单 Git GUI Here

5、如果是新手可安装汉化补丁 TortoiseGit-LanguagePack-2.5.0.0-64bit-zh_CN.msi,建议不要安装,翻译有点搞笑(rebase-变基)。

3.3 基础演示

1、配置

TortoiseGit 用户配置界面

2、创建本地版本库,git create repository here,默认操作即可创建版本,会在 test 空文件夹下生成 .git 。

3、在 test 下随便改动,如新加 123.txt,提交改动。此时鼠标右键:

文件夹右键菜单 Git Commit

TortoiseGit 提交窗口

4、保存本次修改后,使用 Git GUI Here -> Repository -> Visualize master's History 查看全部版本记录。

Git 版本历史查看窗口

5、通用配置和常用功能

Git 右键菜单常用功能注释

3.4 总结

Git 的使用尤其是多人合作,注意以下几点:

1、推送服务器前先同步;

2、2 个分支版本有冲突,先 rebase 解决;熟练操作前不要使用 merge;

3、版本节点不能使用中文,修改描述可以;

4、编译自动生成的不要提交,可以使用 TortoiseGit --> Delete and add in ignore list 过滤指定的文件,即使有改动也不提交;

5、Git 自带的比较工具比较差,可以配置使用外部比较工具。

TortoiseGit 外部比较工具配置

一共三处,将 Diff viewer 和 Merge Tool 改为 HA-BCompare。这个工具的比较功能强大,显示界面清晰。

BCompare 图标

四、工欲善其事必先利其器

工欲善其事必先利其器,工具的熟练掌握、合理利用。代码规范化,静态扫描排除风险,修改记录保存完整,如此才能保证代码的质量。这也是每一位嵌入式开发者值得长期投入的基础功。更多关于开发工具链与工程效率的讨论,也欢迎到云栈社区一起聊聊。




上一篇:Git 如何撤回已 Push 的代码?Revert、Reset 实操指南
下一篇:Unix 编程哲学与 17 条编码原则:程序员如何写出简洁健壮的好代码
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-9-3 20:09 , Processed in 1.067985 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表