命名规范
在一个项目中,系统工程全部使用大写字母,尽量避免使用下划线,如果使用,要保证下划线两侧字母大小写一致,如PRE_PROCESS(预处理),如使用驼峰法命名,则不允许试用下划线,驼峰法指大小写字母结合的命名方法,首字母用大写,后面的用小写,如PreProcess
命名时类型全部大写,对应的变量采用驼峰法命名,较好区分,比如
IP_BASE IpBase;
RUN_PARAM RunParam;
CFG_PARAM CfgParam;
这样就一目了然谁是类型谁是变量,项目中的规范数据类型(类似于系统参数)全部使用“大写字母+下划线”的方法命名.
但是图像的命名方法有时例外,有时图像的命名表示特殊属性,所以前面的全部使用大写,但是不使用下划线,如
Mat SVImg;
Mat GRAYImg;
Mat RGBImg;
有时在变量名字前加上特定的小写字母表示特定的含义,如
指针 pGRAYImg;
向量 vGRAYImg;
全局变量 gGRAYImg;
枚举类型 eMatch;
在定义枚举类型的时候要注意辨识度,比如简单的使用"ETYPE"来命名,当我需要声明枚举变量时,键盘上敲一个“E”会瞬间弹出来很多系统变量,不利于编程。所以可以命名为“E_IT_TYPES”,当大厨E_IT时就会直接弹出来了,里面的枚举类型也是同理。
函数的形参一般在前面加上i,如iImg
编码规范
全局变量不可以和形参同名,否则会带来混淆,编程者难以确定全局变量是否改变,是个坑
class demo{ public: Rect iRect; void func(Rect iRect) { iRect.x=1; iRect.y=2; } }
全局变量实际上没有改变,但是容易带来混淆。
if(flag==1) {} else
如果少写个“=”,就会变成赋值,导致死循环,并且这个bug不好发现
if(flag=1) {} else
怎样修改代码才能使这个错误容易发现呢,将参数和常量反过来
if(1==flag) {} else
这样写错了的话就变成了1=flag,编译器就会直接报错了
同样,在做函数封装时要写好保护,比如彩色图像转灰度图像之前要检查图像通道,获取图像时要检测图像是否为空,输入输出图像的大小是否一致,图像中像素点的阈值时候超过了255等等,并且每个保护都要用注释注明其目的。
在调用函数时或者模块时,没吊用一个函数(模块)都要做消息处理,这样在debug时可以快速定位
当一个类中既有函数又有成员变量时,且函数调用自己的成员变量,那么函数不需要设置形参,在函数里面直接调用就可以了。当为类的成员变量做封装时,将它们定义成私有类型,这样别人在调用类的时候就无法访问成员变量了,只能通过访问类的函数来使用这些成员变量,可以通过定义固定的接口函数,来限制外界对这些成员变量的操作,如get(),set(),UpdateRunParam(),接口函数定义成公有类。
注释规范
一页代码的头部要注明文件名称、功能描述、创建日期等信息,在函数模块前要注明功能描述,输入图元,输出图元,输入控制,输出控制。IP层要采用halcon式的注释