1.1 版本和版本声明
1.作用:形成版本跟踪和版本管控,
- 用以在实验过程和运维过程里遇到突发情况时即时回退
- 研发交付时,运维和甲方能够拿到成熟的产品项目
- 新人接入时能够快速上手
- 管理者在项目跟踪和项目改造时能够及时查看开发进度。
- 后续待添加
2.包含内容:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
样例示意:示例 1-1:
/* * Copyright (c) 2022,北京象元气象观测技术研究院 * All rights reserved. * * 文件名称:XYHead.h * 文件标识:见配置管理计划书 * 摘 要:进行公共的三方库的集中管理 * * 当前版本:1.1 * 作 者:Zry * 完成日期:2022年4月30日 * * 取代版本:1.0 * 原作者 :Zry * 完成日期:2022年4月29日 */
1.2 头文件的结构
- 本节目的:
- 规范代码风格
- 便于他人阅读
2.头文件由三部分内容组成:
- 头文件开头处的版权和版本声明(参见示例 1-1)。
- 预处理块。
- 函数和类结构声明等
3.头文件书写规则建议:
- 【规则 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-2-3】如果有自定义的结构体,请先在类前集中定义
- 【建议 1-2-4】使用//=========结构体定义开始===========``//=========结构体定义结束===========的注释来规划整体的代码分块
代码示例:
/* * Copyright (c) 2022,北京象元气象观测技术研究院 * All rights reserved. * * 文件名称:XYHead.h * 文件标识:见配置管理计划书 * 摘 要:进行公共的三方库的集中管理 * * 当前版本:1.1 * 作 者:Zry * 完成日期:2022年4月30日 * * 取代版本:1.0 * 原作者 :Zry * 完成日期:2022年4月29日 */ #ifndef XYHEAD_H // 防止 XYHead.h 被重复引用 #define XYHEAD_H #include <math.h> //库文件引用和预处理块声明间隔开一行 // 引用标准库的头文件 … #include “myheader.h” // 引用非标准库的头文件 … //=============结构体定义开始======================= /** * 基础的消息结构体 */ struct MsgData { int iMsgId; char chMsgTest; }; //=============结构体定义结束======================= //=============类定义开始======================= class Box // 类结构声明 { … }; //=============类定义结束======================= //=============函数声明开始======================= void Function1(…); // 全局函数声明 … //=============函数声明结束======================= #endif
1.3 定义文件的结构
定义文件有三部分内容:
定义文件开头处的版权和版本声明(参见示例 1-1)。
对一些头文件的引用。
程序的实现体(包括数据和代码)。
假设定义文件的名称为 XYworkMain.cpp,定义文件的结构参见示例
// 版权和版本声明见示例 1-1,此处省略。 #include “XYhead.h” // 引用头文件 … // 全局函数的实现体 void Function1(…) { … } // 类成员函数的实现体 void Box::Draw(…) { … }
建议:
- 如果是执行函数,使用bool类型作为返回值,告诉调用者执行结果
- 如果是重要函数,使用int类型作为返回值,告诉调用者错误种类
- 不要在代码中出现常量的比较,使用到的常量应使用宏的方式在头文件中集中定义。
1.4 头文件的作用
不必公布源码,提升保密性和安全性
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只
要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库
功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
加快开发效率
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件
中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错
的负担
1.5 目录结构
如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分
别保存于不同的目录,以便于维护。
例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级
目录)。
如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声
明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。
举例说明:
目录结构:
Src ├── OpInclude │ └── OpBase └── OpModule ├── Algorithm ├── Connect └── FileSend
将代码放在Src下,公有的库文件调用写在OpInclude中,OpBase中写入框架设计代码
OpModule中写入业务功能 模块的代码。
从而实现了模块化的架构设计,当新增功能业务需求时,只需要改动添加模块部分,不需要整体重构,同时也将整体业务进行了拆分实现了精细化管理管理的条件。## 1.1 版本和版本声明
作用:形成版本跟踪和版本管控,
- 用以在实验过程和运维过程里遇到突发情况时即时回退
- 研发交付时,运维和甲方能够拿到成熟的产品项目
- 新人接入时能够快速上手
- 管理者在项目跟踪和项目改造时能够及时查看开发进度。
后续待添加
包含内容:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
样例示意:示例 1-1:
/* * Copyright (c) 2022,北京象元气象观测技术研究院 * All rights reserved. * * 文件名称:XYHead.h * 文件标识:见配置管理计划书 * 摘 要:进行公共的三方库的集中管理 * * 当前版本:1.1 * 作 者:Zry * 完成日期:2022年4月30日 * * 取代版本:1.0 * 原作者 :Zry * 完成日期:2022年4月29日 */
1.2 头文件的结构
本节目的:
规范代码风格
便于他人阅读
头文件由三部分内容组成:
头文件开头处的版权和版本声明(参见示例 1-1)。
预处理块。
函数和类结构声明等
头文件书写规则建议:
【规则 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-2-3】如果有自定义的结构体,请先在类前集中定义
【建议 1-2-4】使用//=========结构体定义开始===========``//=========结构体定义结束===========的注释来规划整体的代码分块
代码示例:
/* * Copyright (c) 2022,北京象元气象观测技术研究院 * All rights reserved. * * 文件名称:XYHead.h * 文件标识:见配置管理计划书 * 摘 要:进行公共的三方库的集中管理 * * 当前版本:1.1 * 作 者:Zry * 完成日期:2022年4月30日 * * 取代版本:1.0 * 原作者 :Zry * 完成日期:2022年4月29日 */ #ifndef XYHEAD_H // 防止 XYHead.h 被重复引用 #define XYHEAD_H #include <math.h> //库文件引用和预处理块声明间隔开一行 // 引用标准库的头文件 … #include “myheader.h” // 引用非标准库的头文件 … //=============结构体定义开始======================= /** * 基础的消息结构体 */ struct MsgData { int iMsgId; char chMsgTest; }; //=============结构体定义结束======================= //=============类定义开始======================= class Box // 类结构声明 { … }; //=============类定义结束======================= //=============函数声明开始======================= void Function1(…); // 全局函数声明 … //=============函数声明结束======================= #endif
1.3 定义文件的结构
定义文件有三部分内容:
定义文件开头处的版权和版本声明(参见示例 1-1)。
对一些头文件的引用。
程序的实现体(包括数据和代码)。
假设定义文件的名称为 XYworkMain.cpp,定义文件的结构参见示例
// 版权和版本声明见示例 1-1,此处省略。 #include “XYhead.h” // 引用头文件 … // 全局函数的实现体 void Function1(…) { … } // 类成员函数的实现体 void Box::Draw(…) { … }
建议:
如果是执行函数,使用bool类型作为返回值,告诉调用者执行结果
如果是重要函数,使用int类型作为返回值,告诉调用者错误种类
不要在代码中出现常量的比较,使用到的常量应使用宏的方式在头文件中集中定义。
1.4 头文件的作用
不必公布源码,提升保密性和安全性
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只
要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库
功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
加快开发效率
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件
中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错
的负担
1.5 目录结构
如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分
别保存于不同的目录,以便于维护。
例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级
目录)。
如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声
明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。
举例说明:
目录结构:
Src ├── OpInclude │ └── OpBase └── OpModule ├── Algorithm ├── Connect └── FileSend
将代码放在Src下,公有的库文件调用写在OpInclude中,OpBase中写入框架设计代码
OpModule中写入业务功能 模块的代码。
从而实现了模块化的架构设计,当新增功能业务需求时,只需要改动添加模块部分,不需要整体重构,同时也将整体业务进行了拆分实现了精细化管理管理的条件。
服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI