变量命名神器
- CODELF(vscode有插件)
1. 一般命名法
(1)小驼峰命名法
bool isMelonRipe; //变量
int getMyCoin(); //函数
(2)大驼峰命名法
struct MyStruct; // 结构体
class MyClass; // 类
(3)下划线命名法
int an_integer_var; // 变量用下划线
void myFunction(); //函数用小驼峰
(4)大写单词命名法
const float GRAVITY = 9.8 // 常量
#define PI 3.14 // 宏定义
(5)匈牙利命名法
//变量名 = 属性 + 类型 + 对象描述
class Block{
private:
double m_dLong; // 长
double m_dWidth; // 宽
double m_dHeight; // 高
}
2. 函数的命名
前缀词 + 名词(is/can/has/ … + something)
其中,前缀词包括:
- 表示是否符合的状态 —— is
- 表示能否执行的状态 —— can
- 表示是否包含的状态 —— has/include/contains
- 表示是否需要的状态 —— should/needs
例如:
- 判断用户是否存在 —— isUserNameExist()
- 判断用户名是否应该修改 —— shouldUserNameChange()
- 判断宾馆是否具有wifi —— hasWifi()
- 判断宾馆能否预定 —— canBook()
3. 数据获取的命名
- 从数据结构获取 —— get
- 通过计算获取 —— calculate/cal
- 数据库获取 —— find/query
- 从配置文件获取 —— load/parse/build
- 从网络获取 —— fetch
例如:
- 直接从对象、数据结构中获取数据 —— getUserId()
- 通过计算获取数据 —— calculateUserAverageScore()
- 数据库查找数据 —— findUserName()/queryUserNmae()
- 从配置文件加载数据 —— loadUserInfo()/parseUserInfo()/buildUserInfo()
- 网络请求获取数据 —— fetchUserInfo()
4. 函数的形参少用bool型
5. 字符串组合拼接
字符串格式化(C++):snprintf, stringstream
6. 避免使用魔法数字
可以使用枚举类型来解决。
7. 冗长函数分解原则
一般需要写注释的地方可以封装成新的函数。
8. 数字系列的命名
例如a1,a2,这样命名纯属误导,没有提供正确信息,对可读性带来危害。
使用sourceChars/source和destinationChars/destionation作为参数名。
9. 函数命名动词选取大全
避免滥用单词,例如:
- 万能的get
- 万能的add
各类函数命名动词详细总结:
-
Creat —— 创建(实例创建/工厂方法)
-
Initialize —— 初始化(实例/属性)
-
Load —— 加载(配置)
-
Destory —— 销毁
-
Uninitialize —— 反初始化(实例/属性)
-
Get —— 通过获取(属性)
-
Fetch —— 获取(网络请求)
-
Calculate —— 计算
-
Read —— 读取(文件/配置)
-
Query —— 查询
-
Find/Search —— 查找(数据库/集合中)
-
Receive —— 接收
-
Pull —— 拉取
-
Set —— 通过设置(属性)
-
Write —— 写入(文件/配置)
-
Put —— 放入
-
Push —— 存入/推送(通知)
-
Reset —— 重置(标记/状态)
-
Refresh —— 刷新(页面/缓存)
-
Update —— 更新(配置/状态)
-
Add —— 通过添加
-
Append —— 追加(尾部)
-
Delete —— 删除
-
Remove —— 移除
-
Open —— 开启(开启状态/打开文件)
-
Start —— 开始(流程)
-
Launch —— 发送/启动(程序)
-
Close —— 关闭(关闭状态/关闭文件)
-
Stop —— 停止(流程)
-
Finish —— 完成(流程)
10. 给函数取个好名字
- 集合类型相关数据处理
动词 | 用途 | 示例 |
---|---|---|
Filter | 过滤/筛选(强调按照某些条件) | FilterByName |
Merge | 合并(有时会带上合并规则) | MergeTwoConfig |
Concat | 拼接(直接在结尾添加) | ConcatToArray |
Split | 分割 | SplitInput |
Deduplicate | 去重(去重完全相同的项) | DeduplicateList |
Reverse | 颠倒/反向排序 | ReverseRecord |
Sort | 排序(有时会带上排序规则) | SortDealsByAmount |
Fill | 填充(一般会进行覆盖) | FillAmountList |
- 通用业务数据处理
动词 | 用途 | 示例 |
---|---|---|
Parse | 解析(解析提取内容) | ParseFromJson/ParseResult |
Analyse | 分析 | AnalyseLocation |
Convert | 类型转换 | ConvertToString |
Format | 格式化数据 | FormatToLocalString |
Validate | 合法性/有效性的校验 | ValidateUserInputs |
Ensure | 期待值的校验 | EnsureUserAge |
Compose | 组成(由多项内容组合成一个结果) | ComposeMessage |
Encode | 编码(依赖约定的编码格式) | EncodeUrl |
Decode | 解码(依赖约定的编码格式) | DecodeUrl |
Encrypt | 数据加密(依赖约定的加密算法) | EncryptContent |
Backup | 备份(注意拷贝方式,避免误导) | BackupUserSettings |
Restore | 恢复 | RestoreUserSettings |
Import | 导入(按照特定的格式的文件转换) | ImportFromFile |
Export | 导出(用于转换成特定格式的文件) | ExportToFile |
Compress | 压缩(依赖约定的算法) | CompressOversizedFile |
Decompress | 解压缩(依赖约定的算法) | DecompressOversizedFile |
11. 代码命名容易出现的问题
- 取名过于简单,无法清晰表达含义
- 命名风格不一,影响代码阅读
- 没有参照规范命名
- 修改代码不更新注释,造成误导
- 无意义的注释(如日志型注释,废弃代码注释等)
- 过多篇幅的注释
- 函数过长,缺乏提炼
- 重复代码不做复用
- 不合理的变量/常量定义
- 定义时不考虑解耦
- 使用常量代替应该动态生成的内容,例如文件路径写成固定形式