112 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 1. SDK开发规范
 | 
						||
 | 
						||
## 1.1. 编码规范
 | 
						||
 | 
						||
### 1.1.1. 指针/智能指针
 | 
						||
 | 
						||
* C++编码只能使用智能指针;
 | 
						||
* 指针遵循谁使用谁进行“非空”判断,且无比使用前进行“非空”判断;
 | 
						||
* 智能指针经过转换后务必进行“非空”判断;
 | 
						||
 | 
						||
理论上,**明显不可能为空的指针,可以不进行“非空”判断**,可以不进行“非空”判断的场景:
 | 
						||
 | 
						||
```
 | 
						||
void McuManagerImpl::OtherSideSendIpcMission(const unsigned int &serialNumber, const unsigned char &mission)
 | 
						||
{
 | 
						||
    class McuRecvIpcMission : public McuRecvImpl, public McuRecv<unsigned char>
 | 
						||
    {
 | 
						||
    public:
 | 
						||
        McuRecvIpcMission(std::shared_ptr<McuManagerImpl> &mcuManager, const unsigned int &serialNumber,
 | 
						||
                          const OtherSideSendType &sendType, const unsigned char &mission)
 | 
						||
            : McuRecvImpl(serialNumber, sendType)
 | 
						||
        {
 | 
						||
            McuRecv::mDataRecvReply = mission;
 | 
						||
            McuRecvImpl::mMcuManager = mcuManager;
 | 
						||
        }
 | 
						||
        ~McuRecvIpcMission() = default;
 | 
						||
        void ReplyFinished(const bool result) override
 | 
						||
        {
 | 
						||
            // 此处可以不进行“非空”判断,该值在有限范围内(OtherSideSendIpcMission函数内部)就能看出是否为空
 | 
						||
            McuRecvImpl::mMcuManager->ReplyOtherSideSendIpcMission(ASK_RESULT::SUCCEED, McuRecvImpl::mSerialNumber);
 | 
						||
        }
 | 
						||
    };
 | 
						||
    std::shared_ptr<VMcuMonitor> monitor = GetMcuMonitor();
 | 
						||
    std::shared_ptr<McuManagerImpl> manager = std::dynamic_pointer_cast<McuManagerImpl>(SharedFromThis());
 | 
						||
    std::shared_ptr<VMcuRecv> recv =
 | 
						||
        std::make_shared<McuRecvIpcMission>(manager, serialNumber, OtherSideSendType::SEND_IPC_MISSION, mission);
 | 
						||
    if (monitor) {
 | 
						||
        monitor->RecvIpcMissionEvent(recv, static_cast<IpcMission>(mission));
 | 
						||
    }
 | 
						||
    else {
 | 
						||
        LogWarning("mMonitor is nullptr, AddMcuRecv.\n");
 | 
						||
        AddMcuRecv(recv);
 | 
						||
    }
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
**没有进行“非空”判断的代码,应该开发测试用例,保证“空指针”的报错。**
 | 
						||
 | 
						||
### 1.1.2. 注释
 | 
						||
 | 
						||
* 注释必须使用英文,且使用翻译器翻译;
 | 
						||
  避免编码问题导致的乱码,且需要保证阅读困难时可使用翻译器翻译成可读的中文;
 | 
						||
 | 
						||
**注:** 注释翻译工具使用[百度翻译](https://fanyi.baidu.com/);翻译的注释在使用doxygen工具生成接口文档时,在网页上方便翻译成中文。
 | 
						||
 | 
						||
### 1.1.3. C++继承
 | 
						||
 | 
						||
* 子类使用父类的函数时,函数前必须加父类名,降低阅读难度,没有父类名的一律为本类函数(有可能是虚函数);
 | 
						||
 | 
						||
### 1.1.4. 变量命名
 | 
						||
 | 
						||
#### 1.1.4.1. 结构体/类成员
 | 
						||
 | 
						||
* 结构体和类成员必须要使用驼峰命名法,且首字母必须为m表示成员变量;
 | 
						||
 | 
						||
```
 | 
						||
typedef struct app_get_product_info
 | 
						||
{
 | 
						||
    app_get_product_info();
 | 
						||
    std::string mModel;
 | 
						||
    std::string mCompany;
 | 
						||
    std::string mSoc;
 | 
						||
    std::string mSp;
 | 
						||
} AppGetProductInfo;
 | 
						||
```
 | 
						||
 | 
						||
### 1.1.5. 文件命名
 | 
						||
 | 
						||
* 文件名必须使用驼峰命名法,且首字母大写;
 | 
						||
 | 
						||
### 1.1.6. 代码排版
 | 
						||
 | 
						||
* 使用统一标准的代码排版风格,保持多人开发时代码的整洁,避免因为排版(特别是编辑工具的自动排版功能)导致每次提交时都产生大量的排版修改,影响后续代码异常排查;
 | 
						||
 | 
						||
  请使用仓库跟目录下.clang-format配置文件进行排版,如果使用vscode编辑器开发代码,可直接使用快捷键ctrl+alt+f进行排版;也可以使用构建脚本对代码进行排版。
 | 
						||
 | 
						||
**对发生修改的代码进行格式化:**
 | 
						||
 | 
						||
```code
 | 
						||
$ make cmake                     // 在仓库根目录执行,对发生修改的文件创建格式化命令
 | 
						||
$ cd cmake-shell/
 | 
						||
$ make improve_modified_code     // 文件格式化命令,统一排版,此命名只对发生修改的文件进行格式化
 | 
						||
```
 | 
						||
 | 
						||
**对全部文件进行格式化:**
 | 
						||
 | 
						||
```code
 | 
						||
详见配置文件://build/global_config.cmake
 | 
						||
把 COMPILE_IMPROVE_SUPPORT 设置为 true 时,将会在每次编译代码时进行格式化。
 | 
						||
if(${LINUX_TEST} MATCHES "true")
 | 
						||
    set(CLANG_TIDY_SUPPORT                     "true")
 | 
						||
    set(CLANG_FORMAT_SUPPORT                   "true")
 | 
						||
    set(COMPILE_IMPROVE_SUPPORT                "false") # 开启后每次编译可能会很慢
 | 
						||
    set(LLVM_PATH                              "$ENV{HOME}/llvm-project")
 | 
						||
endif()
 | 
						||
```
 | 
						||
 | 
						||
### 1.1.7. 函数
 | 
						||
 | 
						||
* 单个函数代码行控制在50行内,阅读时无需上下滚动去理解代码逻辑;极少数初始化数据的无逻辑推理的代码除外;
 | 
						||
* 函数参数不能超过10个;
 |