一、要记得重构重要性和基本的设计原则
高内聚低耦合MVC架构插件化微内核化架构,依赖倒置接口原则/接口隔离原则 ,开放关闭原则/里氏原则,迪米特法则/组合优先 ,单一职责原则 。
代码需要不断重构 架构分离MVC,接口提取,类的抽象,分解组合,函数提取去掉重复冗余,通信尽量集中简单。重复冗余,结构混乱,通信混乱需要消耗巨大资源和陷入泥潭漩涡需要时刻警惕和规范化和不断重构。函数简单只做一件事情,健壮可靠,可读,可维护,可复用,可拓展,可测试。
第一代架构实现为主,第二代架构重构分层设计横向解耦,第三代架构设计模式面向接口设计插件化设计横向纵向解耦,第四代架构微内核或多内核引擎结构+组件插件化设计内核可以放置在客户端组件插件放置在服务器。
无论是接口,类,函数,变量都应该只做一件事,就是单一职责。
二、编码规范细节
1.文件包含
用class XXX前置声明减少头文件依赖,在.cpp中引入方便支持相互调用,头文件的引入顺序很重要先自身.h文件,然后CC++库,接着第三方库,接着自己的模块头文件。
2.健壮性安全性检查
多线程中可重入数据的加锁或信号量,函数参数合法性检验由被调用者或调用者维护。
3.命名空间的使用
匿名命名空间在cpp中,头文件中必须要命名的命名空间且在include和全局声明之后,命名空间用using 具体命名空间类变量和函数,除了std以外不用用全局 using namespace,也可以用命名空间别名,合理使用命名空间可以有效的避免命名冲突特别是多人协作开发时候。一个命名空间下可以嵌套其它命名空间类似irrlich中。
4.内嵌类使用
内嵌类在和外部类关系很密切时候用,一般是类似结构体一样使用的。
5.过程设计的灵活性优势和管理好
静态成员,内联成员,共用函数可封装为独立的类,这样整个框架更加清晰,更少冗余。
6.变量声明和初始化设计
局部变量声明时候需要初始化,尽可能就近原则声明,类对象有时候要恰当处理避免构造函数不停调用,gcc和vc都是支持循环作用域限定的。
7.全局对象不能使用/只能用全局基本类型和全局指针
全局变量内建类声明时候要初始化;非內建类型一般依赖于其它类,其它系统资源如设备句柄网络数据库不能声明为全局变量,若一定要使用要声明为全局指针的单件模式;多线程下不要声明非常数的全局变量,交互数据通过局部对象new出来的缓存进行数据同步访问。字符串全局常量需要用c语言风格; 因为stl类对象调用顺序也是不可控的;所有全局变量都是可以封装到命名空间,放到cpp类中,或者类静态数据中的。
8.构造函数不能做太多事情/虚函数不能放置在构造函数中
类实质的初始化不要写在构造中,因为异常,可能失败,还有构造函数中虚函数不会得到正确的调用即使父类不实现。默认构造必须写,否则不会初始化且数组调用会有问题。子类的父类实现了且子类没有数据成员那么可以不用实现。