资源预览内容
第1页 / 共64页
第2页 / 共64页
第3页 / 共64页
第4页 / 共64页
第5页 / 共64页
第6页 / 共64页
第7页 / 共64页
第8页 / 共64页
第9页 / 共64页
第10页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
软件设计原则编程规范(仅供内部使用)拟制:拟制:审核:审核:审核:审核:批准:批准:修修 订订 记记 录录前言前言为了提高源程序的质量和可维护性,最终提高公司软件产品生产力,我们有必要对公司 软件产品的源程序的编写风格作出统一的规范约束。 本规范的内容包括:排版、注释、变量和结构、函数、宏等。 本规范的示例以 C 和 C+语言为背景。 考虑到 Microsoft VC+(以下简称 VC)和 Borland C+builder(以下简称 BC)编程习惯 略有不同,当涉及到此项内容时,在本规范中将分别描述。 在本文中将使用以下关键词: 规则规则:编程时强制必须遵守必须遵守的原则。 建议建议:编程时必须加以考虑加以考虑的原则。 示例示例:对此规则或建议从正、反两个方面给出例子。1 1 文件结构文件结构每个 C+/C 程序通常分为两个文件。一个文件用于保存程序的声明(declaration) , 称为头文件。另一个文件用于保存程序的实现(implementation) ,称为定义 (definition)文件。 C+/C 程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀,C+程序的 定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀) 。1.11.1 版权和版本的声明版权和版本的声明版权和版本的声明位于头文件和定义文件的开头(参见示例 1-1) ,主要内容有: (1)版权信息。 (2)文件名称,标识符,摘要。 (3)当前版本号,作者/修改者,完成日期。 (4)版本历史信息。/* * Copyright (c) 2005,保定市天河电子产品开发部* All rights reserved. * * 文件名称: filename.h * 文件标识: 见配置管理计划书 * 摘要: 简要描述本文件的内容* * 当前版本: 1.1 * 作者: 输入作者(或修改者)名字 * 完成日期: 2005 年 7 月 20 日* * 取代版本:1.0 * 原作者: 输入原作者(或修改者)名字* 完成日期: 2005 年 5 月 10 日*/ 示例 1-1 版权和版本的声明1.21.2 头文件的结构头文件的结构头文件由三部分内容组成: (1)头文件开头处的版权和版本声明(参见示例 1-1) 。 (2)预处理块。 (3)函数和类结构声明等。 假设头文件名称为 myqueue.h,头文件的结构参见示例 1-2。【规则 1-2-1】为了防止头文件被重复引用,必须用 ifndef/define/endif 结构产生预处 理块。【规则 1-2-2】用#include 格式来引用标准库的头文件(编译器将从标准 库目录开始搜索) 。【规则 1-2-3】用#include “filename.h” 格式来引用非标准库的头文件(编译器将从 用户的工作目录开始搜索) 。【建议 1-2-1】头文件中只存放“声明”而不存放“实现” 在 C+ 语法中,类的成员函 数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造 成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。【建议 1-2-2】全局变量要慎用,尽量不要在头文件中出现像 extern int value 这类声 明。/ 版权和版本声明见示例 1-1,此处省略。 #ifndef MYFILE_H / 防止 myFile.h 被重复引用#define MYFILE_H #include / 引用标准库的头文件. #include “MyHeader.h” / 引用非标准库的头文件void Function1(.); / 全局函数声明class CBox / 类结构声明 ; #endif 示例 1-2 C+/C 头文件的结构1.31.3 定义文件的结构定义文件的结构定义文件有三部分内容: (1) 定义文件开头处的版权和版本声明(参见示例 1-1) 。(2) 对一些头文件的引用。 (3) 程序的实现体(包括数据和代码) 。 假设定义文件的名称为 myqueue.cpp,定义文件的结构参见示例 1-3。/ 版权和版本声明见示例 1-1,此处省略。 #include “myqueue.h” / 引用头文件. / 全局函数的实现体void Add(.) / 类成员函数的实现体void CBox:Draw() 示例 1-3 C+/C 定义文件的结构1.41.4 目录结构目录结构如果一个软件的头文件数目比较多(比如已超过十个) ,强烈建议将头文件和定义文件分 别保存于不同的目录,以便于维护。一般把头文件保存于 include 目录,把定义文件保存 于 src 目录(可以是多级目录) 。 如果某些头文件是私有的,它不会被其他用户的程序直接引用,则没有必要公开其“声 明” 。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。2 2 程序的排版程序的排版2.12.1 空行空行【规则 2-1-1】在每个类声明之后、每个函数定义结束之后都要加空行。参见示例 2- 1(a) 【规则 2-1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空 行分隔。参见示例 2-1(b ) / 空行void Function1(.) . / 空行void Function2(.) / 空行while (condition) statement1; / 空行if (condition) statement2; . / 空行void Function3(.) . else statement3; / 空行statement4; 示例 2-1(a) 函数之间的空行 示例 2-1(b) 函数内部的空行2.22.2 代码行代码行【规则 2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。【规则 2-2-2】if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执 行语句有多少都要加。这样可以防止书写失误。示例 2-2(a)为风格良好的代码行,示 例 2-2(b)为风格不良的代码行。int width; / 宽度 int height; / 高度 int depth; / 深度int width, height, depth; / 宽度高度深度x = a + b; y = c + d; z = e + f; X a + b; y = c + d; z = e + f; if (width =” 、 “”这类操作符前后不加空格。【建议 2-3-1】对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉 一些空格,如 for (i=0; i= 2000) / 良好的风格 if(year=2000) / 不良的风格 if (a=b) / 不要写成 b - Function();示例 2-3 代码行内的空格2.42.4 对齐对齐【规则 2-4-1】程序的分界符和应独占一行并且位于同一列,同时与引用它们 的语句左对齐。【规则 2-4-2】 之内的代码块在右边数格处左对齐。 示例 2-4(a)为风格良好的对齐,示例 2-4(b)为风格不良的对齐。Void Function(int x) / program code void Function(int x) / program code if (condition) / program code if (condition) / program code else / program code else / program code for (initialization; condition; update) / program code for (initialization; condition; update) / program code While (condition) / program code While (condition) / program code 如果出现嵌套的 ,则使用缩进对齐,如: 示例 2-4(a) 风格良好的对齐 示例 2-4(b) 风格不良的对齐2.52.5 长行拆分长行拆分【规则 2-5-1】代码行最大长度控制在 80 个字符以内。【规则 2-5-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便 突出操作符) 。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。if (very_longer_variable1 = very_longer_variable12) / 类的成员函数【规则 3-1-8】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 例如: int minValue; int maxValue; int SetValue(); int GetValue(); 【建议 3-1-1】尽量避免名字中出现数字编号,如 Value1,Value2 等,除非逻辑上的确需 要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数 字编号最省事) 。3.23.2 WindowsWindows 应用程序命名规则应用程序命名规则【规则 3-2-1】类名用大写字母开头的单词组合而成。如果使用 VC, 则在前面加”C”,如 果是 BC 则在前面加“T” 。 例如: Class CNode; / VC 命名方式 Class TNode; / BC 命名方式【规则 3-2-2】函数名用大写字母开头的单词组合而成。 void Draw(void); / 函数名 void SetValue(int value); / 函数名【规则 3-2-3】变量和参数用小写字母开头的单词组合而成。BOOL flag; int drawMode; 【规则 3-2-4】常量全用大写的字母,用下划线分割单词。const int MAX = 100; const int MAX_LENGTH = 100; 【规则 3-2-5】静态变量加前缀 s_(表示 static) 。 例如: static int s_initValue; / 静态变量void Init() 【规则 3-2-6】如果不得已需要使用全局变量,则使全局变量加前缀 g_(表示 global) 。 例如: int g_howManyPeople; / 全局变量 int g_howMuchMoney; / 全局变量【规则 3-2-7】类的数据成员加前缀 m_(表示 member) ,这样可以避免数据成员与 成员函数的参数同名。 例如: void Object:SetValue(int width, int height) m_width = width; m_height = height; 【规则 3-2-8】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种 标识符加上能反映软件性质的前缀。例如动力环境监控项目中的所有库函数均以 LSC 开头, 所有常量(或宏定义)均以 LSC_ 开头。4 4 表达式和基本语句表达式和基本语句4.14.1 运算符的优先级运算符的优先级C+/C 语言的运算符有数十个,运算符的优先级与结合律如表 4-1
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号