Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

编程格调

Programming Style


表达

  1. 如何表达每一个语句很大程度上决定了程序本身是否易于理解,语句的完美表达是用任何注释、格式规范或补充文档都无法替代的。
  2. 简单直接地表达你要说的意思
  3. 使用库函数
  4. 避免使用临时变量
  5. 代码要清晰,不要为了“效率”牺牲可读性
  6. 让机器干脏活
  7. 用函数调用替代重复的表达式
  8. 加括号来避免歧义
  9. 选择不会被混淆的变量名
  10. 避免不必要的冲突
  11. 使用语言好的特性,避免使用不好的特性
  12. 不要使用条件分支来代替一个逻辑表达式
  13. 用“电话测试”来检查可读性

控制结构

  1. IFELSE 强调两个操作只有一个被执行
  2. DODOWHILE 来强调循环的存在
  3. 确保你的程序是自顶向下阅读的
  4. 使用 IF...ELSEIF...ELSEIF...ELSE 来实现多路分支
  5. 使用基本的控制结构
  6. 先用容易理解的伪语言编写代码,然后再翻译成你需要使用的语言
  7. 避免使用 ELSEGOTOELSERETURN
  8. 判断要尽可能挨着与之相关的操作
  9. 使用数组来避免重复的控制流
  10. 选择可以简化程序的数据表示方法
  11. 不要止步于第一遍的代码草稿

程序结构

  1. 模块化,使用子例程
  2. 让模块之间的耦合变得可见
  3. 每一个模块都应该做好一件事
  4. 确保每一个模块都隐藏好一些东西
  5. 以数据为向导来构建程序的结构
  6. 不要修补蓝代码————重写它
  7. 分块编写和测试大的程序
  8. 对于递归定义的数据结构使用递归过程

输入输出

  1. 校验输入的合法性和合理性
  2. 保证输入的数据不会违背程序的限制
  3. 利用文件结束符或结束标志来终止输入,不要让用户去计数
  4. 识别出非法输入数据,如果可能则纠正之
  5. 使用统一的形式处理文件结束条件
  6. 让输入数据易于准备,并让输出数据意义不言自明
  7. 使用统一的输入格式
  8. 让输入数据易于校对
  9. 尽可能选择自由格式输入
  10. 使用含义自明的输入,指定默认值,将以上二者输出
  11. 将输入与输出局限在子例程中
  12. 确保所有的变量在使用之前都被初始化
  13. 不要停留在一个 bug 上
  14. 在边界值上测试程序
  15. 预防性编程
  16. 0.1+0.2 != 0.3
  17. 不要比较浮点数是否相等
  18. 先做对,再做快
  19. 再提高程序运行速度时,要保持其正确性
  20. 先把程序改得更简洁,再提高其运行速度
  21. 不要为了“效率”上的蝇头小利而牺牲程序的间接性
  22. 让编译器执行平凡优化
  23. 不要勉强地复用代码,应该进行改编
  24. 保证特殊情况真的有特殊性
  25. 保持简单性,反而会更快
  26. 不要为了提高速度而画蛇添足————寻找更好的算法
  27. 在程序中放置测试语句,“增效”之前执行测试

文档

  1. 确保注释和代码一致
  2. 不要用注释复述代码做的事情,每个注释都要有实际意义
  3. 不要注释糟糕的代码————重写它
  4. 使用含有意义的变量名
  5. 使用含有意义的语句
  6. 程序的格式要有助于读者的理解
  7. 用缩进来体现程序的逻辑结构
  8. 记录你的数据规划
  9. 不要过度注释

总结

  1. 从数据的角度来构造程序
  2. 既要保证程序效率又要保证可读性,变量和函数应该指明是什么,而不是怎么做
  3. 在程序结构章节中主要体现单一职责,利用抽象隐藏细节
  4. 输入输出要保持统一,格式尽可能自由,避免让用户(使用 API 的程序开发人员)记格式
  5. 好的代码便是文档,好的命名和好的代码结构尤其重要。主要考虑避免重复,自上而下的方法编写程序。