编程风格与高效编程
编程风格
- 命名规则
- 命名清晰简洁,部分命名首次出现可以加注释,大型代码可以在文件首部加变量说明文档
- 命名细则
- 常量全部大写,单词之间以下划线分隔;
- 变量小写字母为主体,除第一个单词外的后续单词首字母大写作为分隔(驼峰命名法);
- 结构体、类全部单词的首字母大写,其余小写
- 函数名全部小写,单词间以下划线分隔
- 单输出变量可以以输出变量实际意义命名,实现某一功能的函数以功能命名
- tips
- 同一属性的变量名可以加统一前缀以强调同类性,如COLOR_RED, COLOR_GREEN,但是不需要强调统一类型的时候不需要多此一举。
- 部分数值变量命名时可以加上单位,使意义更加清晰,如incidentAngleRadians
- 约定俗成:
- 整数用 i, j, m, n, k; 小数用x,y,z
- 前缀n表示数值对象变量,如 nfiles;前缀i, j, k表示循环对象变量,如istudent;前置is表示布尔型变量
- 后缀array表示向量对象变量;后缀Flag表示标志变量,如openFlag;其他词缀还有,min,max
- get和set前缀表示访问变量或者属性的函数;其他类似的还有find, init/initialize
- 前缀compute表示一些需要比较复杂耗时的计算的函数
- 注意事项
- 避免使用保留字作为变量名,如某些内置函数名和内置变量
- 避免变量中同时出现仅有单复数形式不同的两个变量名
- 避免定义否定式的变量,如 isNotFound, 这种可能造成 ~isNotFound的双重否定影响可读性
- 对于一些专有名词,比如USA等,尽量保持原来的大小写形式
- 为了便于交流传播,代码和注释等应以英文方式
- 编码、注释与文档
- 编码
- 基本原则
- 主导原则:根据程序的主次要,合理安排不同条件语句的位置等
- 在 if else 结构的时候,发生较频繁的事件应该放在 if 部分,例外情况放在 else 部分
- 可控原则:函数或者程序在各种条件下的输出都是可控可预知的
- 一个 switch 语句应该包含 otherwise 条件,防止出现不可预测的结果
- 视觉规范
- 一行代码不应该过长,在恰当的地方应该将行进行切分
- 在一个逗号或者空格之后进行断开;
- 在一个操作符之后断开;
- 在表达式开始前的地方重新开始新的一行
- 操作符前后留空格,逗号后空格,一个逻辑块结束留空行,可以提升可读性
- 一行代码不应该过长,在恰当的地方应该将行进行切分
- 语句
- 长的嵌套循环可以在每一层循环结束后添加注释行,方便了解当前循环位置及结束的功能
- 应该避免复杂的条件表示式,而采用临时逻辑变量进行替代
- 通常情况下,一行代码应该只包含一个可执行语句,这种方式可以提高可读性,并且允许 JIT 加速。短的单个 if,for 或者 while 语句可以写在一行
- 表达式中尽量少使用数字,而使用常量进行代替,一方面提高可读性(知道该数值具体意义),另一方面当改数值多次使用时,方便修改(不需要一个个改数值)
- 函数
- 每个函数只完成一个任务;没有移植必要(只为某一上层函数或者当前文件服务)的子函数应和上层函数放在一个文件中
- 良好的交互:避免全局变量;避免过多的参数(可以使用结构体、数组之类的整合变量);
- 函数要有良好的注释和功能、使用说明,包括具体变量定义与约束(参见程序代码头信息.note)
- 善于利用现成的成熟的函数
- 为主要函数写测试脚本
- 基本原则
- 注释
- 解释性注释
- 注释应简洁明了
- 注释需要包含的内容:是什么,为什么,怎么做(根据复杂程度决定具体内容)
- 功能性注释
- 文件与程序头信息
- 功能说明、使用说明、修改信息等(参见程序代码头信息.note)
- 文件与程序头信息
- 解释性注释
- 文档
- 内容:代码打算干什么(要求),它是如何工作的(设计),它依赖于什其他什么函数以及怎么被其他代码调用(使用),以及它是如何测试(调试)的等。对于额外的考虑,文档可以包含解决方案的选择性的讨论以及扩展与维护的建议(扩展)。
- 格式:
- 编码
- 程序与文件结构
- 模块化和逻辑分隔:
- 优点:可读性强,便于测试,便于修改,便于移植
- 做法:
- 一个文件只完成一个大任务;
- 文件中某一逻辑单元结束时按逻辑大小以不同空行分隔
- 变量定义
- 同种类型的相近的变量可以在同一个语句中定义,如 int hight, width
- 部分不是很清晰的变量定义或者有使用约束的变量定义需要加注释说明
- 尽可能的少使用全局变量
- 模块化和逻辑分隔:
- 工程管理、维护与更新
- 代码的变更需要有明确的记录,最好有可回溯措施
- 大型代码——采用版本控制工具,如git
- 小型代码——每次修改时在文件头信息或者修改记录文档中更新修改信息,代码中主要更改部分加注注释。
- 代码的变更需要有明确的记录,最好有可回溯措施
【reference】
Python 代码风格 和 PEP8
Python PEP8 编码规范中文版
高效编程
matlab
- 运算速度
- 尽量使用矩阵运算代替循环运算,提高运算速度
- 循环中的变化量应该提前定义并赋特殊值,加速运算的同时,特殊值也可以用来检验运行结果
- 编码安全
- 反常识语句
- 浮点数的比较应该要小心,由于程序的精度问题,可能直观上明显相等的浮点数表达式会被“==”判定为不等
- 在进行整数类型的计算时,一般需要注意将数据先转化为double类型再计算,最后再转换为整数类型,以免在uint类型下计算由小数丢弃和数值截断造成误差甚至错误
- 保证语句、函数的输出可控性
- 重视异常处理
- 重视非关心情况,以免出现不可预知的结果。非关心情况(如switch的otherwise)应该在程序中有体现,而非忽略,它可以用于异常诊断
- 反常识语句
- 编码习惯
- 复制粘贴代码时,一定要注意粘贴后按需要依次修改各个变量名等内容,不要遗漏