基于工程实践选题《基于VSLAM的室内地图三维重建系统设计》,讨论的是ORB SLAM算法源码。开源代码是Linux环境下的C++编译和运行。
一、分析源代码目录结构
图1.ORB SLAM算法开源代码文件
在ORB SLAM算法开源代码中:
build:CMake编译是分内部编译和外部编译两种的,如果工程量很小,可以是内部编译。但是,为了养成良好的编译风格,增加代码的可读性,我们通常还是采用的外部编译方式,即建一个build文件夹,在里面进行编译,也是为了增加代码可读性,把整个工程整理的很清楚。
bin:用来放编译好的可执行二进制文件,二进制文件就是可以直接运行的程序。
src:用来放源代码。
lib:用来放编译好的库文件夹,库文件是为二进制提供函数。
include:用来放头文件。
CMakeLists.txt:cmake的所有语句。
database(rgbd_dataset_freiburg1_xyz):存放数据。
Thirdparty:与项目相关的包。
Vocabulary:项目生产的字典文件。
二、文件名/类名/函数名/变量名等命名规范
图2.类名命名规范
在该开源项目代码中,文件名/类名/函数名都采用帕斯卡(Pascal)命名法,与驼峰命名法类似,只不过驼峰命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。因此这种命名法也有人称之为“大驼峰命名法”。变量一般采用驼峰命名法,常量及宏的命名采用下划线分割大写字母的方式命名。
三、接口定义规范
图3.接口的定义
接口定义的规范:返回格式要统;输入参数要统一;返回类型要统一。在该开源项目中,接口的定义较为规范,定义了虚函数的实现功能,便于调用。
四、列举哪些做法符合代码规范和风格一般要求
1.无论是在“空行”还是在“空格”,都使该开源项目设计的非常易读,代码更清晰;
2.该项目的命名格式遵从帕斯卡命名法,而且名称本身就具有含义,增加了代码的可读性;
3.该项目的缩进严格按照要求,使整体代码更加美观;
图4.部分代码示例
4.关于注释部分,该项目大都使用“//”进行注释,在一些关键的地方都会给出注释,便于读者理解,以及方便读者按照自己的需求修改代码功能;
5.该开源项目将不同的功能分开写成不同的库函数,用有意义的单词和下划线命名,功能更加清晰易读。
五、列举哪些做法有悖于“代码的简洁、清晰、无歧义”的基本原则,及如何进一步优化改进
1.该开源项目大都使用帕斯卡命名法,但是也有个别命名未使用大写,影响代码整体的美观;
2.该项目是一个优秀的学习榜样,在我看来几乎没有违背代码的简洁、清晰、无歧义的基本原则,对于读代码的人当然希望注释越多越好,虽然在关键地方给出了注释,但是还是远远不够的。
六、总结同类编程语言或项目在代码规范和风格的一般要求
1.多行初始化列表,":"前四空格缩进,以","结尾,多个变量折行对齐;单行初始化列表,构造函数中只进行那些没有实际意义的初始化;
2.参数过多时","结尾,每行一个变量对齐,参数过多时","结尾;
3.条件括号内无空格,(condition)左右1空格,if执行体2空格缩进;
4.临时方案使用TODO注释;
5.if-else语句中,大括号与else同行,else左右1空格,尽量使用初始化声明。
6.swith语句中,(var)左右1个空格,条件相对switch 2空格缩进,执行体相对switch 4空格缩进;
7.命名空间结束时注释;
8.头文件使用前置声明,STL类例外不使用前置声明,使用#include;
9.命名空间全小写,顶头无空格。
10.类名大写开头单词,接口类命名以“Interface”结尾;
11.普通函数命名,大写开头单词,输入参数在前为const引用,输出参数在后为指针;
12.变量命名全小写,有意义的单词和下划线,类成员变量下划线结尾;
13.头文件只用了指针/引用,则前向声明而非引入头文件。