目录
3.1 使用PIMPL(Pointer to Implementation)技术
一、问题背景
在日常停车管控软件开发中,随着不同人员添加新的功能、接入新的设备;程序代码越来越臃肿,每一次全量编译都将近一个小时,甚至修改极少的代码编译也几乎要近一个小时,严重影响开发效率。
二、代码规范方面的解决方案
为了提升编译速度,主要从以下几个方面对代码进行了部分重构和优化,优化后的项目全量编译约二十分钟,极大提升了开发进度。
2.1 拆分头文件
随着项目需求的不断递增、新设备、新平台、新服务接口等不断接入,项目组成员之间负责功能模块不同,逐渐出现了一些巨型头文件,且这些巨型头文件被包含在近乎所有的模块中,导致这种文件每新增一些内容就会引发几乎所有模块重新编译。
本着功能模块的原则,将这些巨型头文件按照模块进行拆分,分别归入到不同的功能模块下,并规范后续开发新增模块功能需自增头文件,避免出现包含内容过多的头文件。
2.2 拆分巨型类
在优化项目过程中发现使用频次很高的类成员特别多,功能特别全面;许多新增的需求也会有人关联到这种常用类中,这也导致这种类由于功能过于全面,项目中到处都是,稍微修改即会引发大量相关文件重新编译。
本着将功能模块尽量细分的原则,一个类的功能尽量单一,将这种较大的巨型类逐渐细化拆分,降低不同文件之间的依赖。
2.3 使用前置声明
由于项目组里不同人员开发习惯不同,一部分开发人员定义的头文件包含了过多的头文件,导致文件之间的依赖性和编译时间恶化。
在项目优化中逐渐优化头文件的包含文件,去除不相关的头文件,其余相关的头文件大部分头文件实际上也没必要包含,只需要声明即可,在实现文件中在包含相应的头文件可以极大的降低头文件与其他文件之间的依赖关系。如下面代码所示:
// 在头文件中,尽量使用前置声明,而不是 #includeclass ClassA;
// 前置声明
class ClassA;
class ClassB
{
public:
ClassA* myObject; // 使用指针或引用,不需要完整定义
};
2.4 避免在头文件中包含实现
项目组中存在开发人员因为所新增的功能及其简单,遂将实现的实际细节逻辑一并写在头文件中,后续随着需求的复杂化和多样化后续开发人员逐渐在该基础上进行逻辑补充,导致该头文件剧烈变化,从而几乎每次新down下的代码重新编译都会因为这种头文件变动导致依赖的文件均重新编译,一定程度拖慢整体开发效率。
后续逐步将程序中头文件中的细节实现移动到对应的实现cpp文件中,将项目中头文件的定义与实现细节拆分;后续以此为规范,代码评审环节进行检测。
2.5 避免头文件重复包含
头文件通常包含在多个源文件中,规范头文件代码具有防止重复包含的设计,可以使用#pragma once或者宏。
// 使用 include 守卫
#ifndef _CLASSA_H_
#define _CLASSA_H_
class ClassA {
// 类定义
};
#endif // _CLASSA_H_
2.6 将常用且变动较少的独立到一个文件
项目中有一些与业务不想关的代码,如sdk