1、代码编写风格
一个成熟的程序员,他们的代码从不只是给自己看的。清晰的排版,合理的逻辑分层,会使代码好看很多,也让枯燥生活中引入一丝强迫症的趣味。
1.0、语法部分
缩进原则:以各语法默认格式进行缩进
排版原则:以各代码功能进行划分,空行为界
#include <iostream>
using namespace std;
class salary
{
public:
salary(){}
~salary(){}
virtual void pay(){}
private:
};
class member1:public salary
{
public:
member1(double a){_total = a;}
~member1(){}
void pay()
{
cout << "每月给员工 1 的薪水为:" << _total << "元" << endl;
}
private:
double _total;
};
class member2:public salary
{
public:
member2(double a){_total = a;}
~member2(){}
void pay()
{
cout << "每月给员工 2 的薪水为:" << _total << "元" << endl;
}
private:
double _total;
};
int main()
{
member1 m1(4000.0);
member2 m2(10000.0);
salary *sa1 = &m1;
salary *sa2 = &m2;
sa1->pay();
sa2->pay();
return 0;
}
1.1、主项目文件部分(.cpp)
// 预定义部分
#include <iostream> // 头文件
#include “MyHead.h” // 自定义头文件
#define SIZE 233 // 明示常量
#define PI x * x // 宏函数
// 结构体部分
struct abc { }; // 结构声明
// 函数部分
void function(); // 函数声明
// 自定义类型部分
typedef char byte; // 类型定义
// 全局变量部分
const int PI = 3.14; // const限定符定义
int a; // 全局变量
// 主函数
int main()
{
return 0;
}
// 其余函数
void function()
{
}
1.2、自定义头文件部分(.h)
编写原则:只写声明,不写定义
#pragma once
// 预定义部分
#include <iostream> // 头文件
#include “MyHead.h” // 自定义头文件
#define SIZE 233 // 明示常量
#define PI x * x // 宏函数
// 结构体部分
struct abc { }; // 结构声明
// 函数部分
void function(); // 函数声明
// 自定义类型部分
typedef char byte; // 类型定义
// 全局变量部分
const int PI = 3.14; // const限定符定义
int a; // 全局变量
1.3、自定义头文件内置函数定义部分(.cpp)
void function()
{
}
2、命名约定
初学计算机的时候,我们常使用形如 a、b、c
的变量,来进行编程。但是随着学习的深入,简单的变量名无法满足我们的需求。比如在进行算法题的时候,或者是进行未来进行独立的软件开发的时候。故而我们要采用一种比较通用的规范命名,让自己和他人比较快速和比较清晰看懂原本繁杂的代码。
命名的风格能让我们在不需要去查找类型声明的条件下快速地了解某个名字代表的含义:类型,变量,函数,常量,宏等等。我们大脑中的模式匹配引擎非常依赖这些命名规则.
命名规则具有一定随意性,但相比按个人喜好命名,一致性更重要。下面我们以目前的技术水平为基础,规定一套详细的命名规则。
2.1、通用命名规则
总述
函数命名,变量命名,文件命名要有描述性;少用缩写。
说明
尽可能使用描述性的命名,别心疼空间,毕竟相比之下让代码易于新读者理解更重要。不要用只有项目开发者能理解的缩写,也不要通过砍掉几个字母来缩写单词。
int price_count_reader; // 无缩写
int num_errors; // "num" 是一个常见的写法
int num_dns_connections; // 人人都知道 "DNS" 是什么
int n; // 毫无意义.
int nerr; // 含糊不清的缩写.
int n_comp_conns; // 含糊不清的缩写.
int wgc_connections; // 只有贵团队知道是什么意思.
int pc_reader; // "pc" 有太多可能的解释了.
int cstmr_id; // 删减了若干字母.
注意,一些特定的广为人知的缩写是允许的,例如用 i
表示迭代变量( for
语句的循环)。
2.2、文件命名
总述
文件命名不只是我们的C语言,更加是包括今后所有的命名。命名要有意义,最好是能详细的表示文件的主要内容,如 Factorial Calculation
。
命名原则
我们采用单词命名法:以单词组成的名字给文件进行命名,不同单词以空格分格。
注意:文件命名时不允许使用下划线等任何形式符号。
2.3、类型命名
总述
类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass
, MyExcitingEnum
.
说明
所有类型命名 —— 结构体,枚举,类型模板参数 —— 均使用相同约定,即以大写字母开始,每个单词首字母均大写,不包含下划线.。
// 结构体
struct UrlTableProperties { ...
// 枚举
enum UrlTableErrors { ...
2.4、变量命名
普通变量命名
使用小驼峰命名法,即除第一个单词小写外,其他的均使用大写开头。
int myLocalVariable;
long int myInstanceVariable;
结构体变量
结构体名使用大驼峰命名法;结构体数据成员不管是静态的还是非静态的,都可以和普通变量一样。
struct UrlTableProperties {
string name;
int num_entries;
static Pool<UrlTableProperties>* pool;
};
结构体与类的使用讨论, 参考 结构体 vs. 类.
2.5、常量命名
声明为 const
的变量,或在程序运行期间其值始终保持不变的,命名完全大写。
const int SIZE = 7;
所有具有静态存储类型的变量 (例如静态变量或全局变量)都应当以此方式命名。对于其他存储类型的变量, 如自动变量 auto
等,这条规则是可选的。如果不采用这条规则,就按照一般的变量命名规则。
2.6、函数命名
总述
函数名采用大驼峰命名法,没有下划线. 对于首字母缩写的单词,更倾向于将它们视作一个单词进行首字母大写 (例如, 写作 StartRpc()
而非 StartRPC()
).
AddTableEntry();
DeleteUrl();
OpenFileOrDie();
2.7、枚举命名
枚举的命名应当和 常量 或者 宏 一致:ARRAY
、 ENUM_NAME
。
单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚举名 UrlTableErrors
以及 AlternateUrlTableErrors
是类型,,所以要用大小写混合的方式.
enum UrlTableErrors;
enum AlternateUrlTableErrors
{
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
2.8、宏命名
我们一般采用以下的方式来进行宏的命名
#define MY_MACRO_THAT_SCARES_SMALL_CHILDREN
通常 不应该 使用宏. 如果不得不用,其命名像枚举命名一样全部大写,并使用下划线:
2.9、命名规则的特例
总述
如果你命名的实体与已有 C/C++ 实体相似, 可参考现有命名策略.
bigopen()
: 函数名, 参照 open()
的形式
uint
: typedef
bigpos
: struct
或 class
, 参照 pos
的形式
sparse_hash_map
: STL 型实体; 参照 STL 命名约定
LONGLONG_MAX
: 常量, 如同typedef
2.10、常见的编程命名缩写
通用 | 缩写 | 翻译 | 控件 | 缩写 | 翻译 |
---|---|---|---|---|---|
address | addr | 地址 | calendar | cdr | 日历 |
application | app | 应用程序 | messageDialog | msgdlg | 消息框 |
asynchronization | asyn | 异步 | drawer | drw | 抽屉 |
average | avg | 平均数 | buttonGroup | btngrp | 按钮分组 |
bitmap | bmp | 位图 | checkBox | chk | 复选框 |
buffer | buf | 缓冲区 | container | cntr | 容器 |
character | char | 字符 | button | btn | 按钮 |
color | clr | 颜色 | comboBox | cmb | 下拉框 |
command | cmd | 命令 | lable | lbl | 标签 |
delete | del | 删除 | progressBar | prg | 进度条 |
destination | dest/dst | 目的地 | pageIndicator | pgindic | Tab分页控件 |
decrease | dec | 减少 | radioButton | rdo | 单选框 |
device | dev | 设备 | rangeSlider | rngsld | 滑块 |
different | diff | 不同的 | scrollView | svw | 视图滚动 |
directory | dir | 目录 | scrollBar | vsb(垂直)/hsb(水平) | 滚动条 |
document | doc | 文档 | slider | sld | 滑动器 |
dynamic | dyna | 动态的 | spinBox | spn | 旋转框 |
environment | env | 环境 | splitView | spltvw | 分割视图 |
error | err | 错误 | stackView | stackvw | 堆栈视图 |
execute | exec | 执行 | statusBar | statbr | 状态条 |
group | grp | 组 | swipeView | swpvw | 滑动控件 |
image | img | 图像 | switch | sw | 开关 |
information | info | 信息 | tabBar | tbbr | tab栏 |
initialize | init | 初始化 | textField | txtfld | 文本输入框 |
library | lib | 库 | toolBar | tlbr | 工具栏 |
maximum | max | 最大值 | toolTip | tltp | 提示框 |
minimum | min | 最小值 | toolButton | tlbtn | 工具按钮 |
message | msg | 消息 | treeView | trvw | 树形视图 |
number | num | 数字,数,数量 | layout | lyt | 布局 |
object | obj | 对象 | mainMenu | mmnu | 菜单栏 |
parameter | Param | 参数(形参) | groupBox | gbx | 组合框 |
package | pkg | 打包 | pictureBox | pic | 图片框 |
position | pos | 位置 | listView | lvw | 列表视图 |
previous | pre | 前一个 | window | win(wnd) | 窗口 |
process/Procedure | proc | 进程/过程 | form | frm | 表单 |
pointer | ptr | 指针 | textBox | txt | 文本框 |
password | pwd | 密码 | linkLabel | llbl | 超链接标签框 |
public | pub | 公共的 | dialog | dlg | 对话框 |
reference | ref | 引用 | scrollIndicator | scrlindic | 滚动指示器 |
source | src | 源 | |||
string | str | 字符串 | |||
summation | sum | 和 | |||
synchronization | sync | 同步 | |||
system | sys | 系统 | |||
table | tbl | 表格 | |||
temporary | tmp | 临时 | |||
text | txt | 文本 | |||
variable | var | 变量 | |||
addition | add | 加法/添加 | |||
argument | arg | 实参 | |||
array | arr | 数组 | |||
calculate | calc | 计算 | |||
configuration | config | 配置 | |||
column | col | 列 | |||
control | ctrl | 控制 | |||
hexadecimal | hex | 十六进制 | |||
original | orig | 原件 | |||
return | rtn | 返回 | |||
repeat | rpt | 重复 | |||
signal | sig | 信号 | |||
status | stat | 状态 | |||
stack | stk | 栈区 | |||
standard | std | 标准 | |||
trigger | trig | 触发 | |||
background | bg | 背景 | |||
escape | esc | 退出 | |||
user | usr | 用户 | |||
list | lst | 列表 | |||
server | srv | 服务 | |||
manager | mgr | 管理者 | |||
insert | ins | 插入 | |||
point | pt | 点 | |||
function | func | 函数 | |||
back | bk | 返回 | |||
break | brk | 间断 | |||
data | dat | 日期 | |||
edit | edt | 编辑 | |||
flag | flg | 标志 | |||
grid | grd | 网格 | |||
increment | inc | 增量 | |||
length | len | 长度 | |||
oracle | ora | 甲骨文数据库 | |||
panorama | pano | 全景 | |||
prn | 打印 | ||||
program | prg | 程序 | |||
statistic | stat | 统计 | |||
administrator | adm | 管理员 | |||
database | db | 数据库 | |||
change | chg | 改变 | |||
click | clk | 点击 | |||
compare | cmp | 比较 | |||
coordinates | coord | 坐标 | |||
copy | cpy | 复制 | |||
current | cur | 当前的 | |||
dictionary | dict | 字典 | |||
display | disp | 显示 | |||
driver | drv | 驱动 | |||
extend | ex/ext | 扩展 | |||
frame | frm | 框架/帧 | |||
index | idx / ndx | 索引 | |||
horizontal | horz | 水平 | |||
instance | ins | 实例 | |||
increase | inc | 增加 | |||
link | lnk | 链接 | |||
middle | mid | 中间 | |||
multiply | mul | 乘 | |||
resource | res | 资源 | |||
select | sel | 选择 | |||
test | tst | 测试 | |||
vertical | vert | 垂直 |