# 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 { public: McuRecvIpcMission(std::shared_ptr &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 monitor = GetMcuMonitor(); std::shared_ptr manager = std::dynamic_pointer_cast(SharedFromThis()); std::shared_ptr recv = std::make_shared(manager, serialNumber, OtherSideSendType::SEND_IPC_MISSION, mission); if (monitor) { monitor->RecvIpcMissionEvent(recv, static_cast(mission)); } else { LogWarning("mMonitor is nullptr, AddMcuRecv.\n"); AddMcuRecv(recv); } } ``` **没有进行“非空”判断的代码,应该开发测试用例,保证“空指针”的报错。** ### 1.1.2. 注释 * 注释必须使用英文,且使用翻译器翻译;   避免编码问题导致的乱码,且需要保证阅读困难时可使用翻译器翻译成可读的中文; **注:** 注释翻译工具使用[百度翻译](https://fanyi.baidu.com/); ### 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. 文件命名 * 文件名必须使用驼峰命名法,且首字母大写;