王银《编程的智慧》
编程是一种创造性的工作,是一门艺术
一:反复推敲代码
反复提炼,剔除垃圾
二:写优雅的代码
枝丫分明,树状代码
三:写模块化的代码
- 避免写太长的函数
- 制造小的工具函数(编译时会内联/inline)
- 每个函数只做一件简单的事情
- 避免使用全局变量和类成员(class member)来传递信息,尽量使用局部变量和参数
四:写可读的代码
- 使用有意义的函数和变量名字
- 局部变量应该尽量接近使用它的地方(清晰易读)
- 局部变量名字应该简短
- 不要重用局部变量(易读)
- 把复杂的逻辑提取出去,做成“帮助函数”
- 把复杂的表达式提取出去,做成中间变量
- 在合理的地方换行(不要让换行干扰语义理解)
五:写简单的代码
- 避免使用自增减表达式(i++,++i,i–,–i):读和写这两种完全不同的操作不能混淆缠绕
- 永远不要省略花括号。
- 合理使用括号,不要盲目依赖操作符优先级
- 避免使用continue和break
- 如果出现了continue,你往往只需要把continue的条件反向,就可以消除continue。
- 如果出现了break,你往往可以把break的条件,合并到循环头部的终止条件里,从而去掉break。
- 有时候你可以把break替换成return,从而去掉break。
- 如果以上都失败了,你也许可以把循环里面复杂的部分提取出来,做成函数调用,之后continue或者break就可以去掉了。
六:写直观的代码
如果有更加直接,更加清晰的写法,就选择它,即使它看起来更长,更笨,也一样选择它。
七:写无懈可击的代码
if双分支,穷尽可能,滴水不漏
八:正确处理错误异常
- 务必处理异常返回值
- 尽量在异常出现的当时就作出处理
- 异常捕获应该尽量具体,不可宽泛
- try { … } catch里面,应该包含尽量少的代码
九:正确处理null指针
- 尽量不要产生null指针(尽量不要用null来初始化变量,函数尽量不要返回null)
- 不要catch NullPointerException
- 不要把null放进“容器数据结构”里面(如果你真要表示“没有”,那你就干脆不要把它放进去;你可以指定一个特殊的,真正合法的对象,用来表示“没有”)
- 函数调用者:明确理解null所表示的意义,尽早检查和处理null返回值,减少它的传播(null在不同的地方可能表示不同的意义)
- 函数作者:明确声明不接受null参数,当参数是null时立即崩溃
- 使用@NotNull和@Nullable标记
- 使用Optional类型(把“检查”和“访问”这两个操作合二为一,成为一个“原子操作”)
十:防止过度工程
先可用后重用、扩展
- 先把眼前的问题解决掉,解决好,再考虑将来的扩展问题。
- 先写出可用的代码,反复推敲,再考虑是否需要重用的问题。
- 先写出可用,简单,明显没有bug的代码,再考虑测试的问题。
原文:编程的智慧-王垠
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~