目录
前言
规范标准
C++规范
C#规范
规范记录
命名
硬编码
单例类【线程安全】
Qt定义类【隐式内存共享】
前言
作为软件工程师,出产物就应该具备工程的健壮性和美观性。因此代码规范是作为软件工程师的职业素养。但总所周知,程序员的工作基本就是在维护一座屎山,这确实是现实中种种客观条件约束下导致的。 记录本篇博客,也是希望本人在打码过程,能够保持负责任的初心,以及追求完美的极客精神吧。 诸君共勉。愿人间没有ugly的代码。
规范标准
首先列出一些常见的编码规范。
C++规范
一. 变量声明与命名风格
(1) 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。但也常以双下划綫标识类内部变量。
反例:_name / __name / $name / name_ / name$ / name__
(2) 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式 也要避免采用。
正例:alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3
(3) 变量名和函数名以小写字母开头,开头之后的部分每个单词以大写字母开头。
正例:short counter; / char itemDelimiter = ' ';
(4) 类名以大写字母开头。
正例:XmlService / User
(5) 常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 正例:MAX_STOCK_COUNT
(6) 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾。
(7) 避免短的或无意义的命名。使用尽量完整的单词 组合来表达其意。
正例::AtomicReferenceFieldUpdater。
反例:变量 int a 的随意命名方式。
(8) 枚举成员名称需要全大写,单词间用下划线隔开。
(9) 单个字符的变量名只适用于用来计数的临时变量,因为此时该变量的用途十分明显
(10) 声明每一个变量都要用独立的一行
正例:int height; / int width;
(11) 当一个变量被用到时再声明它。
(12) 对于指针或引用,在类型名和*或&之间用一个空格,但是在*或&和变量名之间没有空格
正例:char *x; / const QString &myString; / const char * const y = "hello";
(13) Qt的ui相关的,在ui里的变量也尽量要进行命名,特别是在代码中使用到的,反例:ui->frame,命名时注意添加该界面的标识性字段,尽量使得ui里所有变量名字在整个程序域中不重名,便于在QSS中控制。
正例:如在SE_ReportDialog.ui中的命名,m_reportFrame;在SE_CalculateWindow.ui中的命名:m_calculateFrame等。
(14) 如上个例子,在特定地方声明的变量应添加适当的前缀,如类的成员变量添加m_前缀;全局变量添加g_;局部变量添加l_。
(15) 接上一点,在前缀下划线后第一个字母,常为变量类型的缩写,如int为i,double为d。
正例:int m_iMonth; double l_dMoney;
二.代码格式
(1) 大括号的使用约定。如果是大括号内为空,则简洁地写成{
}即可,不需要换行;如果 是非空代码块统一如下例:
if ( ... )
{
...
}
else
{
...
}
(2) 左小括号和字符之间不出现空格;同样,右小括号和字符之间也不出现空格
反例:if (空格 a == b 空格)
(3) if/for/while/switch/do 等保留字与括号之间都必须加空格。
正例:if (foo)
(4) 任何二目、三目运算符的左右两边都需要加一个空格。
正例:lineF == lineN
(5) 注释的双斜线与注释内容之间有且仅有一个空格。
正例: // 这是示例注释,请注意在双斜线之后有一个空格
(6) 方法参数在定义和传入时,多个参数逗号后边必须加空格。即逗号左边没有空格,逗号右边有一个空格。
正例: QT_REQUIRE_VERSION(argc, argv, "4.0.2")
(7) 左引号的左边和右引号的右边都有一个空格,左引号的右边和右引号的左边都没有空格。如果右引号右边是右括号的话,它们之间没有空格。
正例: qDebug() << Q_FUNC_INFO << "was called with value1:" << value1 << "value2:" << value