我的天,代码居然也需要保养?
不只女人要保养,代码也是如此。面向对象编程,就是把面对的代码当作对象一样,定期对其进行保养。
目录
一、美颜 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版本不同)打开“自定义命令”,添加命令和运行。2、选择正确的路径,结合前面的参数类型,最后必须加上 %f,表示对该文件执行,
C:\AStyle.exe --style=allman -S -U -t -n -K -p -s4 -j -q -Y -xW -xV %f
3、将该命令插入到编辑菜单,后续在编辑栏点击Astyle,即可对当前文件自动进行格式化排版。
1.3 高级配置
前面只是Source Insight的基础扩展,下面简要说明下高级扩展宏功能,本文只是描述下基本流程。1、配置菜单2、插入之后,在主菜单栏会出现“工作”的菜单,点击Insertifdef,弹出如下对话框3、确定之后自动在光标处插入代码
#if defined (ABCD)#endif /* ABCD */
4、不止是支持插入if defined ,还包括插入文件头,对h文件插入避免多次包含的宏,对函数插入注释,以及自动添加编辑时间、作者名称等。这些宏配置和前面一样,至于客制化,比如函数注释的内容、格式等,也是可以自由定义。5、配置路径如下先关闭全部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的帮助即可查看。Ask说明:例如插入函数注释的代码如下:
szInf = Ask("你为什么要编写这个函数:")szDescription = Ask("请输入函数的使用注意事项和算法实现:") // begin assembling the title stringsz = "/******************************************************************************"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,集成Astyle,结合实际开发平台和编码标准,使用Qt集成的codeCheck诞生了。
codeCheck执行的流程,先将C语言代码自动格式化,按指定的规则排版对齐,调整代码间空格和间距,特殊语句强制换行或添加括号等,简单操作即可完成代码格式统一化(也就是上一章的配置参数)。然后拆分代码字符,建立token数据库,按预置的规则分析代码是否存在匹配的非法代码,并直观显示风险代码位置以便跟踪修复。codeCheck不具备编译语法分析,因此导入的文件必先确保编译正常,再进行分析才有意义。
针对实际开发中的问题点,比如变量命名冲突,或者关键变量缺少注释导致维护升级困难,特别增加了个性化扫描标准。由于个人时间和水平有限,工具还存在优化改进的必要,但基本可满足常规应用和新人培养。
即使没有Qt基础,直接使用开源版本,也是相当给力的,二次开发只是锦上添花而已。
2.2 代码扫描与静态分析
个人二次开发后的主界面如下,和原始的cppcheck差不多,只是多了命名规范检查(全局变量必须g_开头,带注释;宏定义、枚举值禁止包含小写字母等)。“分析”导入文件或文件夹后,即可启动自动格式化并分析代码逻辑,显示结果如下:选择“分析结果”栏,则显示扫描出的风险代码,标明风险类型和代码位置,具体显示如下图。
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 总结
实现代码自动格式化和静态分析,可以有效规避软件风险。关注微信公众号【嵌入式系统】,可以获取codeCheck源码。
三、返老还童 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关键字的,否则用起来看不出问题,但是保存的记录异常。
既然是界面操作,就开启鼠标右键的快捷图标。后续一些安装选项,全部选带windows关键字的。4、安装完成后,鼠标右键,会出现 Git GUI Here。5、如果是新手可安装汉化补丁TortoiseGit-LanguagePack-2.5.0.0-64bit-zh_CN.msi,建议不要安装,翻译有点搞笑(rebase-变基)。
3.3 基础演示
1、配置2、创建本地版本库,git creat repository here,默认操作,即可创建版本,会在test空文件夹下生成.git 。
3、在test下随便改动,如新加123.txt,提交改动。此时鼠标右键4、保存本次修改后,使用Git GUI Here->Repository->Visualize master's History查看全部版本记录。5、通用配置和常用功能
3.4 总结
Git的使用尤其是多人合作,注意以下几点:
1、推送服务器前先同步;
2、2个分支版本有冲突,先rebase解决;熟练操作前不要使用merge;
3、版本节点不能使用中文,修改描述可以;
4、编译自动生成的不要提交,可以使用TortoiseGit-->Delete and add in ignore list,滤指定的文件,即使有改动也不提交;
5、Git自带的比较工具比较差,可以配置使用外部比较工具。一共三处,将Diff viewer和Merge Tool改为HA-BCompare。这个工具的比较功能强大,显示界面清晰。
四、工欲善其事必先利其器
工欲善其事必先利其器,工具的熟练掌握、合理利用。代码规范化,静态扫描排除风险,修改记录保存完整,如此,才能保证代码的质量。
-END-
| 整理文章为传播相关技术,版权归原作者所有 |
| 如有侵权,请联系删除 |
往期好文合集
嵌入式牛人 | 这些单片机编程思想超硬核
嵌入式大佬 | 嵌入式C语言知识点万字总结
嵌入式必会!C语言最常用的贪心算法就这么被攻略了
最 后
若觉得文章不错,转发分享,也是我们继续更新的动力。
5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等!
在公众号内回复「更多资源」,即可免费获取,期待你的关注~
我的天,代码居然也需要保养?相关推荐
- 什么?注释里面的代码居然能够执行
注释大家都写过,应该都懂.注释就是给人看的,不是给机器看的,自然也就无法执行. 但是今天就有一个例外,快让我们看一下吧. 如果是下面一段代码,大家期望的输出是什么? public class esca ...
- 【C语言爱心代码】不可思议!C语言仅仅用17行代码居然把爱心完美运行出来了
最近很火电视剧李峋的爱心❤️代码,前段时间我也分享过HTML的爱心代码,相似度95%,后面也有不少小伙伴问我有没有其他语言的爱心代码,然后我翻出了半年前我学习C语言写的爱心代码例子,该源码简单,适合初 ...
- 牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题
春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的. 学会 ...
- 我用50行代码居然「让天猫精灵把客厅灯开了」
Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDN@AXYZdong,CSDN首发,AXYZd ...
- 400+的考研复试线怎么玩???满屏都是400+?今年国家线会涨吗?
关注.星标公众号,直达精彩内容 有不少同学在微博晒出分数,不少同学分数400+,今天大部分地区出分了,惊现477分的大神:政治91分,英语二95分,数学三150分,专业课141分.如果分数是真实的,这 ...
- “晶振”拍了拍你,“你知道我是如何工作的吗?”
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达 晶振在电路板中随处可见,只要用到处理器的地方就必定有晶振的存在,即使没有外部晶振,芯片 ...
- android内存代码,Android内存优化(五) Lint代码扫描工具
1.使用 工具栏 -> Analyze -> Inspect Code- 点击 Inspect Code 后会弹出检查范围的对话框: 默认是检查整个项目,我们可以点击 Custom sco ...
- keil复制代码乱码_成都控制器开发:容易忽略!用KEIL编码汉字也会有BUG
有时你以为不会有错,但是错误往往出现在意料之外. 那天,用MCU的串口向触摸屏发送汉字字符串,但是在发送某个字符串的时候想要显示的东西总是不能在触屏上正常显示,发送另外的字符串却能正常显示,这就奇了怪 ...
- 关于代码控制管理的一些想法
最近工作中遇到一个开发团队,对代码的版本控制管理居然没有要求,导致了种种问题. 1.由于分支没有规范,最后一个小版本上线合代码居然化了几个小时,最后开发人员自己都不知道合到哪个分支. 2.一些人把所有 ...
最新文章
- 公网传输技术之SRT协议解析(上)
- angularjs封装bootstrap官网的时间插件datetimepicker
- mongoose populate 返回 指定 字段
- 人生感悟:人生像吃自助餐
- elasticsearch监控平台cerebro-0.8.3 相关操作
- Tomcat服务器内存修改
- linux控制风扇转速的命令,Cputroller:一款Linux下查看调节CPU的策略、风扇转速的工具...
- android studio Available qualifiers(可用资源限定符)笔记(待完善)
- 洛谷 P1957 口算练习题
- 代码原理 webkit WebKit-利用百度siteapp开发网站App-(IOS和Android版本)
- c语言中逆序乘积,逆序乘积式(示例代码)
- 2018华北五省计算机应用大赛,“远洋航空杯”2019年华北五省(市、自治区) 及港澳台大学生计算机应用大赛隆重举行...
- 一个有潜在危险的要求。从客户端中检测到(ctl00$ $ $ contentplaceholder2submit1
- 快速傅里叶变换(FFT)的推导过程(DIT)
- oracle调用apps,oracleEBS 调用 SHELL 的方法
- 计算机软考网络管理员满分,计算机软考网络管理员考试题及答案(11-24)
- centos7 scp远程备份文件夹
- 敏捷史话(十四):敏捷之峰的攀登者 —— Jim Highsmith
- 小伙家乡搞养殖,从穷小子到资产上百万,带动了村民一起致富
- uni-app的发展历程
热门文章
- 如何阻止SAP CRM订单创建好之后,自动被置为传输状态这一行为
- SAP UI5 bindProperty的实现
- InvisionApp学习
- logon dialog 的弹出逻辑debug出来了,有很多有用的代码片段
- local sandbox html里的script tag是如何load到memory里的
- UI5 Control lazy load mechanism
- CRM WebClient UI里word文档调用web service的问题
- Apache httpclient的execute方法调试
- ERP failure: Error when opening an RFC connection
- SAP CRM系统订单模型的设计与实现