第一篇:编程规范(程序员必看)
编程规范(程序员必看)
作者:
评价:
上站日期:
内容说明:
来源:
.基本要求
1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。1.3 尽量使用标准库函数和公共函数。
1.4 不要随意定义全局变量,尽量使用局部变量。1.5 使用括号以避免二义性。
2.可读性要求
2.1 可读性第一,效率第二。2.2 保持注释与代码完全一致。
2.3 每个源程序文件,都有文件头说明,说明规格见规范。2.4 每个函数,都有函数头说明,说明规格见规范。
2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。2.7 常量定义(DEFINE)有相应说明。2.8 处理过程的每个阶段都有相关注释说明。2.9 在典型算法前都有注释。
2.10 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个字节。
2.11 循环、分支层次不要超过五层。
2.12 注释可以与语句在同一行,也可以在上行。2.13 空行和空白字符也是一种特殊注释。2.14 一目了然的语句不加注释。
2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3。
3.结构化要求
3.1 禁止出现两条等价的支路。3.2 禁止GOTO语句。
3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。3.4 用 CASE 实现多路分支。3.5 避免从循环引出多个出口。3.6 函数只有一个出口。3.7 不使用条件赋值语句。3.8 避免不必要的分支。
3.9 不要轻易用条件分支去替换逻辑表达式。
4.正确性与容错性要求
4.1 程序首先是正确,其次是优美
4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。4.4 所有变量在调用前必须被初始化。4.5 对所有的用户输入,必须进行合法性检查。4.6 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0,不可靠
4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否 逻辑锁定、打印机是否联机等。
4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。
5.可重用性要求
5.1 重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。5.2 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。5.3 公共控件或类应建立使用模板。
附:C++ 编程规范,delphi作相应的参考
.1适用范围
本标准适用于利用Visul C++ ,Borland C++进行软件程序开发的人员.。
.2变量命名
命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意 义字符串,如果连续意义字符串仅两个,可都大写.如OK.具体例程:
BOOL类型
bEnable;
ch
*
char
chText c
*
类对象
cMain(对象实例)h
*
Handle(句柄)
hWnd i
*
int n
*
无符号整型 p
*
指针 sz,str *
字符串 w
WORD x,y
坐标
Char或者TCHAR类型
与Windows API有直接联系的用szAppName[10]形式否则用
FileName[10]形式,单个字符也可用小写字母表示;
Int类型
nCmdShow;
LONG类型
lParam;UINT类型
uNotify;
DWORD类型
dwStart;
PSTR类型
pszTip;
LPSTR类型
LPTSTR类型
LPVOID类型
WPARAM类型
LPARAM类型
HWND类型
HDC类型
HINSTANCE类型
HANDLE类型
HICON类型
int
float
DWORD
lpszClassName;lpReserved wParam, lParam hDlg;hDC;hInstance hInstance, hIcon;iTmp fTmp dw* 4
lpCmdLine
String , AnsiString
str *
m_
类成员变量
m_nVal, m_bFlag g_
全局变量
g_nMsg, g_bFlag
局部变量中可采用如下几个通用变量:nTemp,nResult,I,J(一般用于循环变量)。
其他资源句柄同上
.3常量命名和宏定义
常量和宏定义必须具有一定的实际意义;
常量和宏定义在#include和函数定义之间;
常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一 条定义的右侧必须有一简单的注释,说明其作用;
资源名字定义格式:
菜单:IDM_XX或者CM_XX
位图:IDB_XX
对话框:IDD_XX
字符串:IDS_XX
DLGINIT:DIALOG_XX
ICON:IDR_XX
.4函数命名 函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模 块名及文件名, 如是内部函数,只要注释其定义文件名;
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线 间隔,示例如下:
void UpdateDB_Tfgd(TRACK_NAME);
//Module Name :r01/sdw.c
void PrintTrackData(TRACK_NAME);//Module Name :r04/tern.c
void ImportantPoint(void);
//Module Name :r01/sdw.c
void ShowChar(int , int , chtype);
//Local Module
void ScrollUp_V(int , int);
//Local Module
.5结构体命名
结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用 大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数 据区,必须注明其所属的进程。全局数据定义只需注意其用途。
示例如下:
typedef struct
{
char
szProductName[20];
char
szAuthor[20];
char
szReleaseDate[16];
char
szVersion[10];
unsigned long
MaxTables;
unsigned long
UsedTables;
}DBS_DATABASE;
DBS_DATABASE GdataBase;
控件的命名: 用小写前缀表示类别
用小写前缀表示类别: fm
窗口 cmd
按钮
cob
combo,下拉式列表框 txt
文本输入框 lab
labal,标签 img
image,图象 pic
picture grd
Grid,网格 scr
滚动条 lst
列表框 frm
fram
7注释
原则上注释要求使用中文;
文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复 杂的算法需要加上流程说明;
函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数 需要加上变量用途说明;
程序中注释包括:修改时间和作者、方便理解的注释等;
引用一: 文件开头的注释模板
/******************************************************************
** 文件名:
** Copyright(c)1998-1999 *********公司技术开发部
** 创建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述: ** ** 版 本:
**---------------
******************************************************************/
引用二: 函数开头的注释模板
/*****************************************************************
** 函数名:
** 输 入: a,b,c
**
a---
**
b---
**
c---
** 输 出: x---
**
x 为 1, 表示...**
x 为 0, 表示...** 功能描述:
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
** 修 改:
** 日 期: ** 版本
****************************************************************/
引用三: 程序中的注释模板
/*---------------------------*/
/* 注释内容
*/
/*---------------------------*/ 8 程序
a.程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。
b.编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应 在程序编写时一并拟好。
c.注释一定要与程序一致。
d.版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要 在文件及函数的修改记录中加以记录。
e.程序中每个block 的开头 ”{“ 及 ”}” 必须对齐,嵌套的block 每进一套,缩进一个tab,TAB 为4个空格,block类型包括if、for、while、do等关键字引出的。
f.对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能,举例如下
:
count.divisor = 1193280 / freq;
// compute the proper count
OutByte((unsigned short)67,(unsigned char)182);// tell 8253 that a count is coming
OutByte((unsigned short)66, count.c[0]);
// send low-order byte
OutByte((unsigned short)66, count.c[1]);
// send high-order byte
×××××××××××××××××××××××××××××××××××××××
bcb,delphi中的变量命名:
遵循匈牙利命名法,命 名必须有意义,制定如下规定
窗体: 以大写的W开始,如About版权窗体,命名为WAbout
文件:以大写的F开始,如About版权窗体,文件命名为FAbout.cpp
按钮(Button):如退出按钮,命名为btnExit ……
基类: 加base标记,如报表基类,窗体命名为:WBaseRep, 文件命名为FBaseRep.cpp
第二篇:程序员必看30本经典书籍
.net程序员必看30本经典书籍
作者:admin 更新时间:2009-10-29 13:27 点击:1152次
一.入门
1.《HTML与CSS入门经典(第7版)》HTML入门
点评:html语言的入门,由于html极其简单所以同类其他书也可代替,本书并非经典,本书摆在这里纯属占位!你可以用其他书代替。2.《C#入门经典(第3版)》C#入门
点评:经典中的经典,个人认为是30本书里最重要的,虽然其他讲C#的好书也很多但大多1.0版的,很多在书店已经绝版,被《程序员》等机构评选为2006年最受读者喜爱的十大IT图书之一。
3.《精通SQL--结构化查询语言详解》SQL数据入门
点评:不能说很好,但也不差,感觉吃透全书也可以应付如常SQL语句了。4.《专家门诊--SQL SERVER开发答疑200问》SQL数据入门 点评:好书,正好结合上本,可惜的是不是Sqlserver2005。5.《SQL SERVER 2005基础教程》SQL数据入门
点评:书一般,不过还是很全的,和同类书比起来还是不错。
入门总结:这几本书学的快的话2个月,慢则数月,如果真的吃透基本上就打了很好的底子!当然不能说100%,很多东西还要后面的学习来发现不足,重新学习。作者http://blog.csdn.net/21aspnet/。二.基础
6.《Programming ASP.NET中文版(第3版)》ASP.NET基础
点评:经典中的经典,全球经典,五年三版,权威著作,这本书是最最基础的ASP.NET入门书,讲的非常全涵盖所有基本面,每一个控件都细细说明,非常易懂,不过本书讲的难免有点杂,初学者看了难免云里雾里所以要下一本书提纲挈领,此书非看不可。7.《ASP.NET 2.0经典教程--C#篇》ASP.NET基础
点评:经典,和上一本结合起来最好,本书讲大的方面,看了能让人明白asp.net分那几个步骤,不过唯一的缺陷就是不细,上一本正好补充,此书非看不可。8.《C#高级编程(第4版)》C#基础
点评:好书却不经典,本书被吹嘘的神乎其神,被评选为2005年最权威的十大IT图书之一,2006年最受读者喜爱的十大IT图书之一,其实本书不过讲了一些其他书没有的内容而已,内容比较多而已,本书也是所有.NET书中字数最多的一本,蛮厚的,可以当作C#语法的提高,做参考书吧,不过总体而言写的还是可以。作者http://blog.csdn.net/21aspnet/ 9.《JAVASCRIPT 权威指南(第四版)》Javascript基础
点评:好书却不经典,这本书也被吹嘘的神乎其神,其实后半部分全部是Javascript语法参考,感觉本书只能做参考书,讲语法还是可以的讲的还算深,内容也很详,不过看懂前半部分后来喜欢它的原因却变后半部分,和下一本结合就成更完美的参考书。
10.《WEB开发人员参考大全:最完整的HTML、CSS与JAVASCRIPT工具书》Javascript,html,css基础 点评:好书,书如其名,作者是位老先生,经验很丰富,本书是每一位从事BS开发人员的必备参考书和上一本结合就更好了。
11.《SQLServer2005从入门与精通(应用技术基础)》SQLServer基础
点评:好书,可以帮助读者对SQLServer增进了解,毕竟是微软出版社的,书中讲的知识都是开发人员必备的,例如聚合函数,嵌套事务,报表等等。
基础总结:这几本书学的估计要4个月了,慢的话半年都不一定学透,其实日后开发中用到的主要就是这个时候学的基础上综合应用,宁慢勿快!!三.应用
12.《JavaScript 高级程序设计》javascript应用
点评:经典,比《JAVASCRIPT 权威指南(第四版)》讲应用讲得多,有Ajax部分,作者希望大家能把javascript按面相对象的思想处理。
13.《圣殿祭司的ASP.NET 2.0开发详解——使用C#》asp.net应用
点评:好书,作者是台湾的,感觉台湾作者都有欧美风格,本书是专门针对2.0新增的部分,没有1.1部分,个人感觉这样对1.1的作者很好,只要看这本书就够了。14.《ASP.NET 2.0高级编程(第4版)》asp.net应用
点评:好书,出到第4版了,和《C#高级编程(第4版)》有的一拼,也是大部头,讲的很全,不过不觉得有多少闪光的地方,权作参考书吧。15.《Beginning C# Objects中文版——概念到代码》C#应用
点评:好书,讲C#怎么面向对象的还讲了UML以及建模的方法同时译者得水品很高。不会面向对象是很可怕的,当然光会面向对象也不够还要和重构设计模式极限编程结合。16.《ASP.NET 2.0数据库入门经典(第4版)》ADO.NET应用
点评:鸡肋,可惜的是这本书是Beta版本但是出版社不知道出于什么原因没有写明Beta版本,而且代码是VB.NET,不过这本书讲数据操作ADO.NET还是很全的最起码让初学者明白个大概。正式版有E文的,大家自己找吧。
17.《SQL Server 2005数据库开发实战》SQLServer2005应用
点评:好书,作者是章立民老师,台湾4届MVP,想想当初本人就是看他书入门的,这是一本公认的很好入门书籍。作者http://blog.csdn.net/21aspnet/ 18.《ASP.NET2.0 经典案例教程》ASP.NET应用
点评:好书,讲了几个经典例子,学了许多知识总是要用实例串起来的也是在这个过程中学习一些架构只是。
应用:这几本书学的估计要4个月,慢的话半年都不一定学透,这个时候主要扩大知识面,要结合实例,最好是做做留言板之类的小小项目。四.提高
19.《ASP.NET2.0XML高级编程(第3版)》XML数据提高
点评:好书,小黑写的很好,涵盖了XML在asp.net下的方方面面,遇到不明白的要多读几遍。讲XML的书不多,不过有这本也就够了。20.《Ajax实战》Ajax实战应用
点评:好书,2006年是中国出版界的Ajax年,感觉同系列(另2本是《Ajax基础教程》《Ajax高级编程》)中这本最好,讲理论将的很全,不过要有Javascript基础的,写的很深个别地方有点啰唆。其实Ajax就是无刷新,现在微软已经推出许多控件大大减轻大家学习,自己编码的难度了。
21.《.NET安全编程》数据提高
点评:好书,安全和加密是不容忽视的。书中讲到了散列算法,对称加密,数字签名,安全策略等等适用的安全知识!
22.《ASP.NET 2.0技术内幕》asp.net提高
点评:好书,英文版是绝对的好书,微软出版社出版的绝对不会差!不过此书不适合初学者,初学者最好看会《Programming ASP.NET中文版(第3版)》再看此书。本书讲了事件模型,数据绑定模型,网页状态,缓存,会话等内容。作者http://blog.csdn.net/21aspnet/ 23.《框架设计(第2版):CLR Via C#》C#提高
点评:经典,微软出版社出版的,作者作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问!本书第一本和他的修订版非常畅销,本书让大家从更深层次了解CLR,提高对.NET的整体把握。不看此书看遍千本也枉然!24.《VISUAL C# 2005文件IO与数据存取秘诀》数据应用
点评:好书,作者是章立民老师,台湾4届MVP,想想当初本人就是看他书入门的,这也是一本公认的很好入门书籍。开始还以为全书讲文件IO操作,其实就前面一点,后面更多的是讲程序和数据库交互。
25.《EFFECTIVE C#中文版:改善C#程序的50种方法》C#应用
点评:非常实用的书,译者水平很高,不过这本书一度跳票几年,07年4月才出。本书由50个小主题组成,就如何高效地使用C#语言和.NET库,为程序员们提供了一些实用的建议,而这些问题都是经常遇见的。本书主要还是讲1.1的,2.0只在最后提了下。提高:这几本书学的估计要4个月,慢的话几年都搞不定,这个时候相信在知识的广度深度结合度上都有了很大提高。五.飞跃
26.《ASP.NET AJAX程序设计-第I卷:服务器端ASP.NET 2.0 AJAX EXTENSIONS与ASP.NET AJAX CONTROL TOOLKIT》Ajax飞跃
点评:好书,以前很多复杂的Ajax和javascript代码被微软整合为控件,本书主要主要介绍这个,作者在微软工作。
27.《ASP.NET 2.0高级编程》asp.net飞跃
点评:好书,作者是《ASP.NET 2.0技术内幕》的作者,感觉是在那本书上的再提高,讲了ASP.NET内部机理,HTTP处理程序和模块,自定义控件等高级专题。28.《重构-改善既有代码的设计(中文版)》语言飞跃
点评:不朽的著作,重构和设计模式齐名,这本书需要用一生来学习,本书是用其他语言所写。不过会C#的人应该能看懂。29.《C#设计模式》C#飞跃
点评:一般,由于设计模式的代表作《设计模式--可复用面向对象软件的基础》年代久远而且是用其他语言写的目前市面上也只有这本,其实《C#设计模式》的作者最初写了Java版本的,书店有,所以估计就是把语言换成C#。30.《ADO.NET 2.0高级编程》C#飞跃
点评:还可以,讲了ADO.NET的高级主题非连接类,关联的非连接数据,事务,元数据,大型对象等。
飞跃:这几本书学的估计要很久很久,看个人造化。
最后的总结:按照整个流程学习,有问题找CSDN论坛,结合MSDN,baidu,Google没有解决不了的问题。成为中级程序员以后就要朝高级程序员发展。
(责任编辑:admin)
第三篇:C语言C++程序员编程必备
Java,NET,PHP,Ruby,Perl 和 Python 等,但今天我们要讨论的是两个最古老和流行的语言的C和C++。它们都有其特殊的地方,更有效的功能和支持的工具,这两种语言仍然很活跃。
今天我们整理了一些令人印象深刻的IDE(集成开发环境)和编译器推荐给 C 和 C++ 程序员。集成开发环境,主要用于提供软件应用的各种组件而开发的,其中最流行的功能是它们都有吸引力的用户界面。1)Best IDE for C/C++ – kDevelop KDevelop 是基于 KDevPlatform 的可使用开源插件扩展的 IDE。KDevPlatform 是一种可以用来作为 IDE 的基础库的开源集。
2)Best IDE for C/C++-Anjuta Anjuta Devstudio 具有先进的编程工具,包括项目管理,应用程序向导,交互式调试器,源代码编辑器,版本控制,GUI设计器,分析器和许多工具,另一个伟大的开发工作室。此工具提供的 C/C++ 程序员有很大强大的用户界面开发接口。
3)Best IDE for C/C++Eclipse CDT Eclipse CD 是最强大和最流行的IDE之一,提供了更高效的功能,如:项目的创建和管理,构建支持不同的工具链,标准make编译,源代码导航,各种来源的知识工具,代码编辑器,语法高亮,折叠和超链接导航,源代码重构和代码生成,可视化调试工具,包括内存,寄存器等等。
7)Best IDE for C/C++ – Compilr Compilr 是在线集成开发工具,让您与令人印象深刻的功能和简单的用户界面编写代码。该工具支持的编程语言中广泛的C,C + + JAVA,HTML等等。
8)Best IDE for C/C++Netbeans C++ Netbeans 的工具包括许多适合 C 和 C++ 项目类型模板,可以 使用动态库和静态创建 C/C++ 应用程序库。它拥有迷人的功能:代码协助,编译器配置,单元测试,源检查,远程开发和文件导航等等。
10)Best IDE/Compiler for C/C++Ultimate++ Ultimate++是对于 C++ 程序员来说是很好框架。这个 IDE 引入了模块化概念,可以结合 GCC,MinGW 和 Visual C++。
12)Best Compiler for C/C++-Digital Mars DigitalMars 是一款高性能的 C/C++ 编译器。包括的功能,如速度最快的编译/链接时,强
HTML文档,反汇编,图书管理员,资源编译器,make等,命令行和GUI版本,教程,代码示例,在线更新,标准模板库等等。
13)Best IDE for C-C-Free
14)Best Compiler for C/C++ – MinGW MinGW 编译器提供访问微软的C运行库和一些特定语言运行库的功能。
15)Best Compiler for C – Tiny C Compiler iny C Compiler 是最好的编译器之一,让开发人员可以在任何地方编译代码,可以使用任何 C 动态库,编译并直接执行C++源程序,也包含完整的 C 预处理器和 GNU 汇编器。
@扣丁学堂 智悦分享
第四篇:学习Java编程,就只能做Java程序员吗?
学习Java编程,就只能做Java程序员吗?
作为世界上使用最广的语言之一,Java 的拥趸和其他语言的粉丝常常在各大论坛掀起世界大战。
Java 说『Write Once,Run Anywhere』
但还有人说 『Write Once,Debug Anywhere』
有人说他语法简单,功能强大。
可也有人说与许多新兴语言相比,他有些细节上的不足。
所以,Java 对你来说究竟是什么?
你可曾想过,学习Java编程之后,你就只能做Java程序员吗?其实。。
学习Java编程可以往很多方向发展
Java的应用非常广,有erp等大型系统方面的,有web方面的,还有游戏方面的。作为小白,你需要从Java初级学,然后中级,之后你还需要再学习更多的技术,这些技术不仅仅局限于Java,如js和数据库等,当你对整套技术都非常精通时,你便是一个真正的高级工程师,而java则只是你所掌握的主要技术之一罢了。
做软件测试是一个方向
不少人学到Java SE基础阶段,可能往软件测试方向发展,这个时候参与具体的编码工作不会那么多,主要要做的工作是对软件产品的需求文档、设计文档等检查是否有歧义,对软件产品本身的功能、性能通过运用专业的软件测试技术以及工作去发现软件产品中隐藏的软件问题。
转Android开发是一个方向
Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择。学Android从事移动互联方向开发,学Java从事软件、网站开发。而安卓上的应用大多是Java编写的,所以学习了Java编程,转Android开发也是可以的。
转web前端开发、PHP开发、大数据。。
其实,Java对你来说,不过是众多恋人之一,作为初恋,她打开了你学习编程的大门。至于以后你是从事前端开发,或PHP开发,亦或Android开发,甚至搞大数据、数据库,这些都是互不干扰的。
你的程序猿生涯,从踹开Java大门开始 围观知了堂Java大咖竹迩【提神的咖啡】
第五篇:软件编程规范总结
软件编程规范总结
本规范的内容包括:基本原则、布局、注释、命名规则、变量常量与类型、表达式与语句、函数与过程、可靠性、可测性、断言与错误处理等。
一、基本原则
1.2.3.4.5.6.7.保持代码的简明清晰,避免过分的编程技巧。所有的代码尽量遵循ANSI C标准。
编程时首先达到正确性,其次考虑效率。避免或少用全局变量。尽量避免使用GOTO语句。尽可能重用、修正老的代码。尽量减少同样的错误出现的次数。
二、文件布局
1.头文件必须要避免重复包含。
2.包含标准库头文件用尖括号 <>,包含非标准库头文件用双引号 “”。3.遵循统一的顺序书写类的定义及实现。类的定义(在定义文件中)按如下顺序书写:
公有属性
公有函数
保护属性
保护函数
私有属性
私有函数
类的实现(在实现文件中)按如下顺序书写:
构造函数
析构函数 公有函数 保护函数 私有函数
4.程序中一行的代码和注释不能超过80列。5.定义指针类型的变量,*应放在变量前。
6.源程序中关系较为紧密的代码应尽可能相邻。iLength iWidth = 10;
= 5;// 矩形的长与宽关系较密切,放在一起。
StrCaption = “Test”;
7.禁止使用TAB键,必须使用空格进行缩进。缩进为4个空格。
8.程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。{ }之内的代码块使用缩进规则对齐。
9.if、else、else if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 { }。
if(varible1 < varible2){
varible1 = varible2;}
10.11.声明类的时候,public、protected、private关键字与分界符{} 对齐,这些部分的内容要进行缩进。
12.结构型的数组、多维的数组如果在定义时初始化,按照数组的矩阵结构分行书写。13.相关的赋值语句等号对齐。
14.在switch语句中,每一个case分支和default要用{ }括起来,{ }中的内容需要缩进。
15.不同逻辑程序块之间要使用空行分隔。16.一元操作符如“!”、“~”、“++”、“--”、“*”、“&”(地址运算符)等前后不加空格。“[]”、“.”、“->”这类操作符前后不加空格。
17.多元运算符和它们的操作数之间至少需要一个空格。18.关键字之后要留空格。(if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。)
19.函数名之后不要留空格。(函数名后紧跟左括号‘(’,以与关键字区别。)20.(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。‘,’之后要留空格。‘;’不是行结束符号时其后要留空格。
21.长表达式(超过80列)要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐。
22.函数声明时,类型与名称不允许分行书写。
三、注释
1.一般情况下,源程序有效注释量必须在20%以上。2.注释符与注释内容之间要用一个空格进行分隔。
3.文件头部必须进行注释,包括:.h文件、.c文件、.cpp文件、.inc文件、.def文件、编译说明文件.cfg等。
4.函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、访问和修改的表、修改信息等。
5.包含在{ }中代码块的结束处应加注释,便于阅读。特别是多分支、多重嵌套的条件语句或循环语句。
void Main(){
if(…){
… while(…)
{
…
} /* end of while(…)*/ …
} /* end of if(…)*/ // 指明是哪条语句结束 } /* end of void main()*/
// 指明函数的结束 // 指明该条while语句结束
6.保证代码和注释的一致性。修改代码同时修改相应的注释,不再有用的注释要删除。7.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
8.全局变量要有详细的注释,包括对其功能、取值范围、访问信息及访问时注意事项等的说明。
9.注释与所描述内容进行同样的缩排。
10.对分支语句(条件分支、循环语句等)必须编写注释。11.尽量避免在注释中使用缩写,特别是不常用缩写。
四、命名规则
1.标识符要采用英文单词或其组合,便于记忆和阅读,切忌使用汉语拼音来命名。严格禁止使用连续的下划线,下划线也不能出现在标识符头或结尾(预编译开关除外)。
2.程序中不要出现仅靠大小写区分的相似的标识符。
3.用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
4.宏、常量名都要使用大写字母, 用下划线 ‘_’分割单词。预编译开关的定义使用下划线 ‘_’开始。
5.变量名长度应小于31个字符,以保持与ANSI C标准一致。不得取单个字符(如i、j、k等)作为变量名,但是局部循环变量除外。
6.程序中局部变量不要与全局变量重名。7.使用一致的前缀来区分变量的作用域。
g_
:全局变量 s_
:模块内静态变量
空:局部变量不加范围前缀
8.使用一致的小写类型指示符作为前缀来区分变量的类型。说明:常用变量类型前缀列表如下:
i
: int
f
: float d : double c
: char uc
: unsigned char 或 BYTE l : long p
: pointer b
: BOOL h : HANDLE w
: unsigned short 或 WORD dw : DWORD或 unsigned long a
:数组,array of TYPE str
:字符串 t :结构类型
9.完整的变量名应由前缀+变量名主体组成,变量名的主体应当使用“名词”或者“形容词+名词”,且首字母必须大写。
float g_fValue;10.函数名用大写字母开头的单词组合而成,且应当使用“动词”或者“动词+名词”(动宾词组)。
11.结构名、联合名、枚举名由前缀T_ 开头。事件名由前缀EV_ 开头。12.标识符前最好不加项目、产品、部门的标识。
五、变量常量与类型
1.定义全局变量时必须仔细分析,明确其含义、作用、取值范围及与其它全局变量间的关系。
2.明确全局变量与操作此全局变量的函数或过程的关系。3.一个变量有且只有一个功能,不能把一个变量用作多种用途。4.循环语句与判断语句中,不允许对其它变量进行计算与赋值。5.宏定义中如果包含表达式或变量,表达式和变量必须用小括号括起来。6.使用宏定义多行语句时, 必须使用 { } 把这些语句括起来。
建议:
尽量构造仅有一个模块或函数可以修改、创建的全局变量,而其余有关模块或函数只能访问。
对于全局变量通过统一的函数访问。
尽量使用const说明常量数据,对于宏定义的常数,必须指出其类型。 最好不要在语句块内声明局部变量。
7.结构和联合必须被类型化。typedef struct {
char acName[NAME_SIZE];WORD wScore;} T_Student;
T_Student *ptStudent;
建议:
使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量。
结构是针对一种事务的抽象,功能要单一,不要设计面面俱到的数据结构。 不同结构间的关系要尽量简单,若两个结构间关系较复杂、密切,那么应合为一个结构。
结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。
仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象,对于结构中未用的位明确地给予保留。
结构的设计要尽量考虑向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。
合理地设计数据并使用自定义数据类型,尽量减少没有必要的数据类型默认转换与强制转换。
当声明数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题。
六、表达式与语句
1.在表达式中使用括号,使表达式的运算顺序更清晰。
if(((iYear % 4 == 0)&&(iYear % 100!= 0))||(iYear % 400 == 0))2.避免表达式中的附加功能,不要编写太复杂的复合表达式。3.不可将浮点变量用“==”或“!=”与任何数字比较。
4.应当将指针变量用“==”或“!=”与NULL比较。
5.在switch语句中,每一个case分支必须使用break结尾,最后一个分支必须是default分支。
6.不可在for 循环体内修改循环变量,防止for 循环失去控制。
建议:
循环嵌套次数不大于3次。
do while语句和while语句仅使用一个条件。 当switch语句的分支比较多时,采用数据驱动方式。
如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
for语句的循环控制变量的取值采用“半开半闭区间”写法。 在进行“==”比较时,将常量或常数放在“==”号的左边。
七、参数
1.如果函数没有参数,则用void填充。
void SetValue(int iWidth, int iHeight);float GetValue(void);2.如果参数是指针,且仅作输入用,则应在类型前加const。(防止该指针在函数体内被意外修改。)
3.当结构变量作为参数时,应传送结构的指针而不传送整个结构体,并且不得修改结构中的元素,用作输出时除外。
4.不要省略返回值的类型,如果函数没有返回值,那么应声明为void类型。5.对于有返回值的函数,每一个分支都必须有返回值。(为了保证对被调用函数返回值的判断,有返回值的函数中的每一个退出点都需要有返回值)
6.对输入参数的正确性和有效性进行检查。7.防止将函数的参数作为工作变量。
void SumData(int iNum, int *piData, int *piSum){
int iCount;
int iSumTmp;// 存储“和”的临时变量
iSumTmp = 0;
for(iCount = 0;iCount < iNum;iCount++)
{
iSumTmp += piData[iCount];}
*piSum = iSumTmp;} 反例:
void SumData(int iNum, int *piData, int *piSum){
int iCount;
*piSum = 0;
for(iCount = 0;iCount < iNum;iCount++){
*piSum += piData[iCount];// piSum成了工作变量,不好。} }
8.必须对所调用函数的错误返回值进行处理。(函数返回错误,往往是因为输入的参数不合法,或者此时系统已经出现了异常。如果不对错误返回值进行必要的处理,会导致错误的扩大,甚至导致系统的崩溃。)
八、可靠性
1.在程序编制之前,必须了解编译系统的内存分配方式,特别是编译系统对不同类型的变量的内存分配规则,如局部变量在何处分配、静态变量在何处分配等。
2.防止内存操作越界。
3.必须对动态申请的内存做有效性检查,并进行初始化;动态内存的释放必须和分配成对以防止内存泄漏,释放后内存指针置为NULL。
4.变量在使用前应初始化,防止未经初始化的变量被引用。5.指针类型变量必须初始化为NULL。6.指针不要进行复杂的逻辑或算术操作。
7.如果指针类型明确不会改变,应该强制为const类型的指针,以加强编译器的检查。8.减少指针和数据类型的强制类型转化。9.移位操作一定要确定类型。
10.对变量进行赋值时,必须对其值进行合法性检查,防止越界等现象发生。11.类中的属性应声明为private,用公有的函数访问。
12.在编写派生类的赋值函数时,注意不要忘记对基类的成员变量重新赋值。13.构造函数应完成简单有效的功能,不应完成复杂的运算和大量的内存管理。14.不要在栈中分配类的实例,也不要生成全局类实例。
15.正确处理拷贝构造函数与赋值函数。
16.过程/函数中申请的(为打开文件而使用的)文件句柄,在过程/函数退出之前要关闭,除非要把这个句柄传递给其它函数使用。
九、可测试性
1.在同一项目组或产品组内,为准备集成测试和系统联调,要有一套统一的调测开关及相应信息输出函数,并且要有详细的说明。统一的调试接口和输出函数由模块设计和测试人员根据项目特性统一制订,由项目系统人员统一纳入系统设计中。
2.在同一个项目组或产品组内,调测打印出的信息串要有统一的格式。信息串中应当包含所在的模块名(或源文件名)及行号等信息。
3.在编写代码之前,应预先设计好程序调试与测试的方法和手段,并设计好各种调测开关及相应测试代码(如打印函数等)。
十、断言与错误处理
1.整个软件系统应该采用统一的断言。如果系统不提供断言,则应该自己构造一个统一的断言供编程时使用。
2.使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
3.指向指针的指针及更多级的指针必须逐级检查。4.对较复杂的断言加上明确的注释。
5.用断言保证没有定义的特性或功能不被使用。
6.用调测开关来切换软件的DEBUG版和RELEASE版,而不要同时存在RELEASE版本和DEBUG版本的不同源文件,以减少维护的难度。
7.正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉)。8.在软件系统中设置与取消有关测试手段,不能对软件实现的功能等产生影响。9.用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况。