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:" << value2;
QT_REQUIRE_VERSION(argc, argv, "4.0.2")
(8) 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性。
(9) 当条件语句的执行部分多于一句的时候才使用花括号。然而在if-else语句块中,如果if或else中的一个包含了多行,另一个为了对称性原则,也要用花括号。
正例:if (address.isEmpty())
return false;
(10) 每行代码不多于100个字符,超出需要换行。换行时:第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进。运算符与下文一起换行。方法调用的点符号与下文一起换行。方法调用中的多个参数需要换行时,在逗号后进行。
正例:if (longExpression
+ otherLongExpression
+ otherOtherLongExpression) { }
三.类相关
(1)避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成 本,直接用类名来访问即可。
(2)构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
(3)类内方法定义的顺序依次是:公有方法->公有槽->信号->保护方法->私有方法->私有槽。
(4)当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起, 便于阅读。
(5)成员变量一般为名词。函数成员一般为动词/动词+名词,当返回值为Bool型变量时,函数名一般以前缀’is’开头。
正例:void setDirty(bool b); / bool isDirty() const;
(6)每一个对象,只要它不是基础类型(int, float, bool, enum, or pointers),都应该以常量引用的形式传递。这条使得代码运行得更快。
正例:QString myMethod(const QString &foo, const QPixmap &bar, int number);
(7)为了使构造函数被错误使用的可能性降到最小,每一个构造函数(除了拷贝构函数)都应该检查自己是否需要加上explicit 符号。
(8)尽量减少在头文件中包含其他头文件的数量,可以用前置声明法。
正例:class KBar;
class KFoo : public KFooBase
{ … };
(9)假如你有一个Foo类,有Foo.h文件和Foo.cpp文件,在你的Foo.cpp文件中,要先包含Foo.h文件再包含其他头文件。
正例:// .h文件
class Foo
{ …};
// .cpp文件
#include "foo.h"
#include "bar.h"
四. 控制相关
(1) case标签和switch在同一列。每一个case语句的末尾都要有一个break语句或return语句。在一个 switch 块内,都必须包含一个 default 语句并且 放在最后,即使空代码。
(2) 除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将 复杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性
五. 注释相关
(1) 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释 使用/* */注释,注意与代码对齐。
(2) 对于注释的要求:第一、能够准确反应设计思想和代码逻辑;第二、能够描述业务含 义,使别的程序员能够迅速了解到代码背后的信息。完全没有注释的大段代码对于阅读者形同 天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路;注释也是给继任者看 的,使其能够快速接替自己的工作。
(3) 好的命名、代码结构是自解释的,注释力求精简准确、表达到位。避免出现注释的 一个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。
(4) 建议每个文件、每个类、每个函数,尤其是接口API部分,使用doxygen语法标注。
1. 命名规范
- 变量、函数、类和文件名应该简明易懂,使用英文单词或单词缩写,并使用下划线或驼峰命名法。
- 变量名应该使用名词,函数名应该使用动词,类名应该使用名词或名词短语,文件名应该使用有意义的名称。
- 举例:
first_name = "John"
last_name = "Doe"
(1)使用驼峰命名法
解释
def calculateSalary():
pass
class CustomerOrder:
pass
(2)使用有意义的文件名
customer_order.py
2. 格式化规范
- 代码行长度应该不超过80个字符。
- 使用一致的缩进和空格以使代码更易于阅读
- 在两个操作符之间使用空格,例如赋值、比较和算术操作符
- 举例:
(1)代码行长度不超过80个字符
def calculate_discount(price, discount_percentage):
return price * discount_percentage / 100
(2)使用一致的缩进和空格
解释
if user_age < 18:
print("You are a minor")else:
print("You are an adult")
(3)在赋值、比较和算术操作符之间使用空格
age = 25if age == 18:
print("You are a young adult")
3. 注释规范
- 注释应该清晰、有意义,并解释代码的目的,而不是显而易见的东西。
- 注释应该写在需要注释的代码上面,并在需要的地方使用空行分隔。
- 举例:
def calculate_discount(price, discount_percentage):
(1)计算折扣后的价格
return price * discount_percentage / 100
(2)两行空行分隔
class CustomerOrder:
4. 函数的长度规范
- 尽量保持函数的短小精悍,以提高代码的可读性和可维护性。
- 函数应该只做一件明确的事情,如果函数过于复杂,则需要将其拆分成较小的函数。
- 举例:
def process_customer_order(customer, order_items):
(1)检查客户地址的有效性
check_address(customer.address)
(2)检查订单是否有足够的库存
for item in order_items:
check_stock(item.product_code, item.quantity)
(3)保存订单
save_order(customer, order_items)
(4)较短函数
def check_address(address):
(5)检查地址的有效性
def check_stock(product_code, quantity):
(6)检查库存是否充足
pass
def save_order(customer, order_items):
(7) 保存订单
5. 错误处理规范
- 带有适当错误处理的代码不仅更可靠,而且更容易调试。
- 尽可能使用异常处理来处理错误。
- 举例:
(1)试图打开一个不存在的文件
try with open("non_existing_file.txt", "r") as f:
content = f.read()
(2)捕获文件不存在的异常
except FileNotFoundError:
print("File not found")
6. 冗余代码规范
- 尽管DRY(不要重复自己)原则已经很出名了,但它仍然是一个很好的编程实践,可以减少冗余代码和错误数量。
- 尽可能使用现有的代码或函数,而不是编写新的代码。
- 举例:
解释
if user_age < 18:
print("You are a minor")else:
print("You are an adult")
不需要重复代码
解释
if is_minor(user_age):
print("You are a minor")else:
print("You are an adult")
可以使用函数
def is_minor(age):
return age < 18
7. 通用开发模式规范
- 在编程实践中尽量使用通用的设计模式,以提高代码的可维护性。
- 使用面向对象编程的原则如高内聚、低耦合等。
- 举例:
解释
class Customer:
def __init__(self, name, email, phone):
self.name = name
self.email = email
self.phone = phone
解释
class Order:
def __init__(self, customer, items):
self.customer = customer
self.items = items
8.数学之美读后感
读了这本书,我才第一次惊讶的发现,数学原来并不只是枯燥的考试题,
而是人类理解世界最重要的一种工具。 数学不仅真的很美,而且真的很
有用,这本书最大的价值就在于,它没有直接告诉你答案,而是让你带
着新的启示、新的方法以及新的眼光、新的境界来重新理解这个世界 。
世界太复杂了,必须分步、分类从而化繁为简,数学就是一件非常有力的工具。
我觉得数学是非常重要的,他见证着历史的进程,为科技的进步发展打下了坚实的基础,没有数学的话,人类的进程也没有那么快。所以每个人应该重视数学的学习。