编写高质量的代码

C语言基础

高质量的代码

简洁,有效代码行数,注释代码比例(20%),可靠,可测试性(每一个模块都便于测试),可维护性(代码便于阅读),可移植性(改变运行环境,代码依旧可以运行)

代码的坏味道

过长的函数(50),过多的函数参数(5),过多的局部变量(5),

重复代码,数据泥潭(有些数据项,喜欢成群结对),长switch语句,

代码的重构

函数拆分(单一职责),函数提炼,

代码注释是程序设计人员与程序阅读者之间的桥梁,非常有助于提高代码的可维护性。代码的注释要简洁明了,而且需要有意义。

过少的注释,不利于程序的阅读。

过多的注释也不太好,注释过于冗长往往都是因为那段代码比较糟糕,晦涩难懂。这时候就需要考略重构。

注释可以分为以下几种:多行注释,单行注释,函数注释,文件注释

函数的编写原则

命名要有意义,最好具有自解释功能。

函数功能要单一,长度不可以过长(<50),形式参数不可以过多(<5,可以借助结构体可以解决数据泥潭,可以借助指针减少大数据拷贝),局部变量不可以过多(<10),嵌套深度不可以太深(<5)

功能代码的编写原则

条件表达式拆解,合并分支语句

高质量的代码:

简洁(易于理解和实现),可维护(易修改),可靠(成功运行的概率),可测试(软件发现故障并隔离,定位的能力,便于测试设计和执行),高效(尽可能少的占用资源,内存,时间),可移植(在原设计的特定环境之外运行)

可视化标准:

圈复杂度(每一个分之条件是一个复杂度) (1_10)进入函数是1

有效代码行数(函数体不要太大,否则可能意味函数功能不单一)

函数参数个数(减少函数参数,引入结构体,参数过多容易受外部影响,同时增大测试难度) (0,5)

非结构化语句数量(goto)尽量不使用,影响代码条理性(0,0)

嵌套层数(1,4)

(0,20%)(0,5)(0,5)

过度耦合(混乱的接口,不恰当的暴露)

复杂的表达式

重构手法:拆分函数,重命名函数,提炼函数(if for switch集中的地方是混乱的源泉,一组变量在一个功能内使用), 正确使用临时变量,命名清晰,用途单一

合并重复代码,合并重复的条件判断(特别是嵌套)

分解条件式(提炼),合并条件式(相同处理可提炼模块或函数)

代码坏味道:

有效代码注释比例(提高可读性)

过度的局部变量(意味着大函数)

函数变量个数(数据依赖不可以多),数据关系复杂,一般控制函数功能即可

重复代码(修改不方便),大函数(难理解),过多函数参数,数据泥潭(参数多,代码重复),长switch语句(逻辑混乱),

敏捷的四大宣言:

个体和互动  优于 流程和工具

工作的软件详尽的文档

客户合作 合同谈判

响应变化 遵循计划

产品负责人,scrum master,成员

用户故事:独立的,可以商讨的,有价值的,可以估计的,合适的小,可测试的

标准格式:作为……角色,希望系统可以……(目标),以便……(原因)

分解故事:分用户,分场景

故事需要在一个sprint可以完成,可以加入满意条件。

作为网站的所有者,我希望能统计广告的点击次数,以便我能清除广告收益。

Product backlog 产品需要完成的所有故事

Sprint backlog 一个迭代阶段或冲刺需要完成的所有故事,相当于一个小版本

每日站会:总结问题,讨论问题解决方案

story卡片 优先级

需求编号

story标题

详细描述

如何验收

开发责任人 估计点数

测试责任人

转测试时间

交付时间

燃尽图

横坐标:项目设定总时间

纵坐标:故事数或故事点数或工作量

意义:到第x天燃尽多少个故事或……

两条线:一条是理论线,一条是实际线。

Source insight3.5

注册码:SI3US-361500-17409

F1帮助文档

最重要的是搜索功能:search project     lookup reference     browse project symbols

寻找变量定义,按下ctrl+单击,<-  和  ->分别代表上一步和下一步

1.DOS下运行:

在DOS下输入C:\PCLint\Lint-nt E:\main.cpp

回车,检查结果就出来了。

检查位于E盘根目录下的main.cpp文件,其他文件类推,输入“路径+文件名”

a、打开SI,选择Options->Custom Commands->Add...,输入pclint。

b、在Run输入c:\lint\lint-nt -u c:\lint\std.lnt c:\lint\env-vc8.lnt %f

c、勾上【Iconic Window】、【Capture Output】、Save Files First 【Parse Links in Output】、【File,then Line】。

d、点击右侧的【Menu】,在Menu对应的下拉框选择【View】,选中<end of menu>,点【Insert】,OK退出。

e、可以添加运行pclint的快捷键:打开Options菜单中的“Custom Commands”命令项,点击该对话框中的”keys”,

在弹出的对话框中选中pclint命令,点击”Assign New Key…”菜单,会提示你在键盘上按快捷键,此时在键盘

上同时按下“ctrl、shift和p”键,点”OK”,就可以用ctrl+shift+p运行pclint了。

这时就可以使用source insight编译VS2005相应的工程。

当然,如果想使用pclint集成到si后可以支持其它编译器,可以重新设置PC-LINT,并生成一份新的std_XXX.lnt

文件,在配置中使用相应的std_XXX.lnt。

如果大家想要在vs2005中配置PC-lint9.0版,请参考http://blog.csdn.net/wzx19840423/article/details/6215925cn

接下来给大家详细讲解在vs2010或者vs2008中配置PC-lint9.0版的步骤。

可以到http://download.csdn.net/detail/zhenliangqiu/3250717下载Gimpel_PC_Lint_9.zip免注册版,下载完后点击pclint9setup.exe进行安装,这里以安装到C:/lint介绍。安装完成后勾选I want to run the configuration program now.点击finish进入配置页面,配置选项依次为:

1、C:/lint(这个是pc lint的安装目录),Create a new STD.LNT

2、Microsoft Visual C++ 2008(co-msc90.lnt)

3、32-bit Flat Model(-ms, -si4, -sp4)

4、Active Template Library(ATL),Microsoft Foundation Class Library,Standard Template Library,Windows 32-bit

5、Scott Meyers(Effective C++ More Effective C++ and Effective C++ 3rd Edition),Dan Saks,MISRA 2004

6、Create -i options

7、这里将vc的包含目录加进去,我加的是以下两个

C:\Program Files\Microsoft Visual Studio 10.0\VC\include

C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include

备注:C:\Program Files\Microsoft Visual Studio 10.0是我电脑上vs2010的安装目录

7.2 No 不创建新的lnt

8、No

9、(env-vc9.lnt) Microsoft‘s Visual C++.NET 2010

10、Prepend my PC-lint directory to my PATH(create LSET.BAT)

完成

配置好pc lint之后,下面就将它集成到vc2010中,打开vc2010--Tools--External Tools,点击Add按钮Title为pc_lint(这个可以任意命名),Command为 C:/lint/lint-nt.exe(这个为lint-nt的绝对路径),Arguments为-i"c:/lint" std.lnt env-vc9.lnt "$(ItemDir)$(ItemFileName)$(ItemExt)",Initial directory为$(ItemDir),勾选"Use Output windows",点击OK

接下来大家就会可以利用vs2010-Tools-pc_lint来对当前工程下的文件进行分析了。

点击Tools--pc_lint就可以对选中项目分析了。

备注:如果出现类似Error 307: Can‘t open indirect file ‘env-vc9.lnt‘的错误,大家也不用紧张,只需要到安装目录C:\lint下看看有没有‘env-vc9.lnt‘文件,如果没有一般在C:\lint\lnt下是一定有的,大家只需要将该文件拷贝一份到C:\lint目录下即可。

-i 命令其实是一个include,-i "c:/lint"意思是将pc lint的安装目录包含进来,如果你的安装目录不是"c:/lint"的话可能需要修改。std.lnt是配置文件,你可以在你的安装目录下找到,你可以用记事本把它打开看看,就能大致明白是什么意思了。另外,env-vc9.lnt的英文解释是environment parameters for Microsoft‘s Visual C++ 9.0,翻译就是为了在vs2008上使用pc-lint的配置文件,这个文件对于vs2010也适用。

-i 指明包含路径

-u 指明使用哪些.lnt文件

遇到一个问题:

Error 322: Unable to open include file ‘stdio.h‘

遇到此问题的童鞋可以再vs命令提示工具中输入

echo %INCLUDE%

出现类似一下参数:

C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\INCLUDE;C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\include;7

将这些参数复制,重新运行 config程序,配置到pclint路径中即可。

可参照文章:http://www.viva64.com/en/a/0033/

观察检查输出结果,如果出现error 900: (Note -- Successful completion, *** messages produced)提示表述检查顺利完成

在c:\lint\msg.txt中有错误码

时间: 2024-10-24 11:38:07

编写高质量的代码的相关文章

[编写高质量iOS代码的52个有效方法](三)消息和运行期

[编写高质量iOS代码的52个有效方法](三)消息和运行期 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 11.理解objc_msgSend的作用 12.理解消息转发机制 13.用"方法调配技术"调试"黑盒方法" 14.理解"类对象"的用意 目录 编写高质量iOS代码的52个有效方法三消息和运行期 先睹为快 目录 第11条理解objc_msgSend的作用 第12条理解

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD)

[编写高质量iOS代码的52个有效方法](十)Grand Central Dispatch(GCD) 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 41.多用派发队列,少用同步锁 42.多用GCD,少用performSelector系列方法 43.掌握GCD及操作队列的使用时机 44.通过Dispatch Group机制,根据系统资源状况来执行任务 45.使用dispatch_once来执行只需要运行一次的线程安全代码 46.不

[编写高质量iOS代码的52个有效方法](十一)系统框架

[编写高质量iOS代码的52个有效方法](十一)系统框架 参考书籍:<Effective Objective-C 2.0> [英] Matt Galloway 先睹为快 47.熟悉系统框架 48.多用块枚举,少用for循环 49.对自定义其内存管理语义的容器使用无缝桥接 50.构建缓存时选用NSCache而非NSDictionary 51.精简initialize与load的实现代码 52.别忘了NSTimer会保留其目标对象 目录 编写高质量iOS代码的52个有效方法十一系统框架 先睹为快

编写高质量Python代码的59个有效方法

作者Brett Slatkin是 Google公司高级软件工程师.他是Google消费者调查项目的工程主管及联合创始人,曾从事Google App Engine的Python基础架构工作,并利用Python来管理众多的Google服务器.Slatkin也是PubSubHubbub协议的联合创始人,还用Python为Google实现了针对该协议的系统.他拥有哥伦比亚大学计算机工程专业学士学位. 精彩书评 "Slatkin所写的这本书,其每个条目(item)都是一项独立的教程,并包含它自己的源代码.

JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { marg

编写高质量JS代码的68个有效方法(三)

[20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,

编写高质量JS代码的68个有效方法(八)

[20141227]编写高质量JS代码的68个有效方法(八) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,

编写高质量JS代码的68个有效方法(二)

[20141011]编写高质量JS代码的68个有效方法(二) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,

编写高质量JS代码的68个有效方法(七)

[20141220]编写高质量JS代码的68个有效方法(七) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,

编写高质量JS代码的68个有效方法(四)

[20141129]编写高质量JS代码的68个有效方法(四) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,