介绍

项目开发规范是为了保持项目代码的一致性、可读性和可维护性而制定的一系列准则和规则。具体的项目开发规范可能因项目的特点、开发团队的需求和技术栈的不同而有所差异,但下面是一些常见的开发规范建议:

代码风格和命名约定: 定义统一的代码风格,包括缩进、括号的使用、代码行长度等。同时,定义一致的命名约定,如变量命名、函数命名、类命名等,使命名具有描述性,易于理解和识别。

文件和目录结构: 定义清晰的文件和目录结构,使项目组织有条不紊。这包括组织代码文件、配置文件、文档和测试文件等。遵循一致的命名规则和约定,以提高文件的可寻性和可维护性。

版本控制: 使用版本控制系统(如Git)来管理代码的版本和变更历史。定义一致的分支策略、提交信息规范和代码合并流程,确保团队成员之间的协作和代码管理的顺畅进行。

代码注释和文档: 通过注释和文档记录代码的设计、用途和接口。注释应该清晰、简洁,并与代码保持同步。考虑使用自动化文档生成工具,以便从注释中生成代码文档和API文档。

错误处理和异常处理: 定义一致的错误处理和异常处理策略,确保代码在出错时能够适当地处理异常情况,并提供有意义的错误消息和日志记录。

安全性和数据保护: 在代码开发过程中,注重安全性和数据保护。遵循最佳实践,处理用户输入、密码管理、敏感数据处理等方面的安全问题。确保代码对潜在的安全漏洞有足够的防护和保护措施。

单元测试和集成测试: 使用单元测试和集成测试来验证代码的功能和正确性。定义一致的测试框架和规范,确保代码的可测试性和覆盖率。

性能和优化: 当涉及到性能和优化时,定义一致的标准和实践。优化不同部分的代码时需遵循一致的原则和方法,确保代码的可维护性和可扩展性。

协作和团队沟通: 促进团队合作和沟通的实践是开发规范的重要组成部分。定义一致的代码审查流程、问题跟踪系统和团队会议等,以促进成员之间的合作和知识共享。

持续集成和部署: 使用持续集成和持续部署流程,确保代码和构建的自动化,以及快速而可靠的交付。

在项目开发过程中,一种良好的规范可以让开发人员在开发过程中提高效率,并且提高代码的阅读性、可维护性。

它可以统一项目的开发风格提高代码质量提供团队协作降低维护成本减少风险和问题

以下是我总结的一些开发规范用于自己业余时间开发项目时使用,日后也会不断补充,也欢迎大家提出建议,共同学习。

命名规范

变量

局部变量

  • 使用小驼峰命名法:变量名的第一个单词小写,之后的单词首字母大写,如:myVariable。
  • 采用有意义的名称:变量名应该清晰地描述其用途和含义。
  • 尽量缩小变量的作用范围:避免将变量的作用范围扩大到超出必要的范围。
// 示例:
int age;
QString firstName;
double totalPrice;

成员变量

  • 使用小驼峰命名法:变量名的第一个单词小写,之后的单词首字母大写,如:myVariable。
  • 在成员变量后面加上下划线(_):使用下划线作为成员变量的前缀,以区分成员变量和局部变量。
  • 采用有意义的名称:变量名应该清晰地描述其用途和含义。
  • 尽量使用带有访问修饰符 (private, protected, public) 的成员变量。
// 示例
int age_;
QString firstName_;
double totalPrice_;

STL变量

  • 和变量命名规范一样,前面加上前缀标识是哪种STL
std::vector<int>					vec_age_;
std::unordered_map<int, int>		unmap_id_age_;
std::map<int, int>					map_id_age_;

常量、宏定义

  • 使用全大写字母:常量名中的所有字母都使用大写,单词之间可以用下划线分隔,如:MAX_SIZE。
  • 使用有意义的名称:常量名应该清晰地描述其值的含义。
// 示例
const int MAX_SIZE = 100;
const double PI = 3.14159;

#define MAX_SIZE 100
#define PI 3.14159

函数

普通函数

  • 使用动词表示函数的操作:函数名应该清楚地描述函数的作用和功能。
  • 采用小驼峰命名法:函数名中的第一个单词小写,之后的单词首字母大写,如:calculateTotalPrice()。
  • 避免使用过长的函数名,应尽量简明扼要,同时保持清晰易于理解。
// 示例
void calculateTotalPrice();
bool isDataValid();
void displayErrorMessage();

成员函数

  • 使用动词表示函数的操作:函数名应该清楚地描述函数的作用和功能。
  • 采用大驼峰命名法:函数名中的每个单词的首字母大写,如:CalculateTotalPrice()。
  • 避免使用过长的函数名,应尽量简明扼要,同时保持清晰易于理解。
// 示例
void CalculateTotalPrice();
bool IsDataValid();
void DisplayErrorMessage();

函数参数

  • 使用小驼峰命名法:参数名的第一个单词小写,之后的单词首字母大写,如:myParameter。
  • 在函数参数前面加上下划线 (_):使用下划线作为函数参数的后缀,以区分成员变量、局部变量和函数参数。
  • 采用有意义的名称:参数名应该清晰地描述其含义和作用。
  • 避免使用过长的参数名,应尽量简明扼要,同时保持清晰易于理解。
// 示例
void calculateTotalPrice(double _price, int _quantity);
bool isDataValid(QString _inputData);
void displayErrorMessage(QString _message);

其他

类名

  • 使用大驼峰命名法:类名中的每个单词首字母都大写,不使用下划线连接,如:MyClass。
  • 类名应该简洁、准确地描述该类的作用和功能。
// 示例
class CarModel;
class UserManager;

文件名

  • 使用有意义的文件名:文件名应能反映出文件的内容和用途,尽量使用英文单词或短语。
  • 使用小写字母和下划线分隔:文件名中单词之间可以用下划线进行分隔,如:my_file.cpp。
// 示例
main.cpp
user_manager.h
utils.cpp

开发规范

指针

现在C++开发都是用C++11、14、17标准,所以所有的指针都应使用智能指针。常用的就是std::shared_ptr、std::weak_ptr配合使用。不管是声明指针还是函数返回值是指针类型,一律使用智能指针返回和接收。

因为一个大型项目开发过程中,一个指针指向的内存很大程度上会在各个模块中使用,我们不能使用一次就new一个指针,另外假如在一个函数内部new一个局部的普通指针去接收其他模块的指针,在这个函数执行结束之后还不能手动释放这个指针,因为一旦释放那么其他指向这块内存的指针就变成了野指针,在项目运行过程中万一这些野指针访问了内存就会造成程序崩溃等不可估量的错误。

注释

所有对外提供的接口都要包含注释,包括接口含义、参数含义、返回值含义,必要时举例说明。

所有的函数(成员函数、普通函数)、变量(成员变量、局部变量、全局变量)都要有注释。

注释要做到言简意骇。

数据结构

开发过程中设计数据结构一定要合理、遵循以下原则:
清晰性(Clarity): 数据结构应该具有清晰、明确的定义和用途。它们的命名应该简洁、具有描述性,使其在代码中易于理解和使用。结构的属性、方法和操作应该能够直观地传达其含义和功能。

一致性(Consistency): 数据结构应该在整个项目中保持一致,遵循相同的设计准则和命名约定。这样可以确保代码的可读性和可维护性,并减少团队成员之间的混淆和错误。
高效性(Efficiency): 数据结构的设计应该考虑到其在算法和操作上的效率。选择合适的数据结构类型和算法,以最优化地执行所需的操作和查询。避免不必要的数据复制和操作,以提高性能。

封装性(Encapsulation): 将数据结构的数据和操作封装在一个逻辑单元中,通过定义适当的接口和访问级别来限制对数据的直接访问。这样可以确保数据的一致性、完整性和安全性,并提供更灵活的代码扩展和维护。

可扩展性(Scalability): 数据结构的设计应考虑到未来需求的变化和扩展。它们应该容易修改和扩展,以适应新的要求和功能。遵循模块化和抽象化的原则,将结构的功能和责任进行适当的划分,使其更容易重用和扩展。

正确性(Correctness): 数据结构的设计和实现应该是正确的。这意味着数据结构的操作和方法应该按预期工作,并在各种情况下产生正确的结果。在设计过程中进行充分的测试和验证,确保结构在不同情况下的正确性和稳定性。

记录:最后一次编辑于2023.09.28。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐