根据王垠大牛的《编程的智慧》文章总结,我看的原文地址是https://kb.cnblogs.com/page/549080/
当经历有一些年头的编程后,才会更为共鸣,真正厉害的剑法,总是简单到无以复加的。
一、提炼代码是编程的修行
-
反复回头推敲代码(优化、精简)是提高编程水平最高效的方法,这和写文章提炼是同样道理
-
衡量程序员水平不是看他写了多少代码,而是看他删除了多少代码
-
如反复提炼代码不再有进展,暂时放下,几个星期或几个月后再回头看,也许有焕然一新的灵感(也即温故而知新)
-
反复回头提炼能积累起灵感和智慧,从而在遇到新问题时直接朝正确或接近正确的方向前进
-
优雅代码的形状是枝丫分明的树状结构(tree)
二、 如何写模块化代码
-
模块化不是文件或文本意义上的,而是逻辑上的
-
一个模块化就像电路芯片一样,有定义良好的有输入输出,函数就是这个电路片
-
避免写太长的函数,不超过40行最好,超出就拆分掉
-
常重复的哪怕只有二行也宜提取出去制造小的工具函数,它们能大大简化主函数逻辑(无散乱代码乱眼,每句都有意义能让函数更为清晰)
-
不要用宏来代替小函数,用宏是过时的观念,会使程序难以理解、调试,容易出错
-
每个函数只做一件简单的事情,不要搞通用函数
-
避免使用全局变量和类成员传递信息
-
真正优雅可读的代码,是几乎不需要注释的
-
不需注释,让代码自己解释自己
-
用程序语言的简洁严谨本身来表达它到底在干什么
-
使用能切实描述它们逻辑的函数和变量名字
如put (elephant1, fridge2); 把大象放进冰箱。 -
局部变量应该尽量接近使用它的地方
-
局部变量名字应该简短
-
不要重用局部变量,局部变量应在有效域或可见范围内意义唯一
-
把复杂的逻辑提取出去做成帮助函数,则原来的地方就可使用一个有意义的函数代替注释
-
把复杂的表达式提取出去做成中间变量
-
按一句一表达的逻辑换行
三、写简单代码
-
避免使用自增减表达式(i++,++i,i–,–i)
-
永远不要省略花括号(一块一作用域)
-
合理使用括号,不要盲目依赖操作符优先级
-
避免使用continue和break,如出现,努力改写循环
-
写直观的代码,如把
if (action1() || action2() && action3()) { ... }
写为:
if (!action1()) { if (action2()) { action3(); } }
-
写无懈可击的代码,程序流的所有分支应到位,避免出现疏漏(例如if..else)
-
if..else如果省略分支,每次读这段代码,你都不能确信它照顾了所有的情况,又得重新推理一遍,带来沉重的头脑开销
四、正确处理错误
-
try…catch里面,应该包含尽量少的代码
-
在异常出现的当时就作出处理,不要丢回给调用者
-
不应该使用 Exception这么宽泛的类型。你应该正好 catch 可能发生的那种异常A
五、正确处理null指针
-
尽量不要产生null指针(不要用null初始变量、函数不要返回null)
-
不要把 null 放进“容器数据结构”里面
-
函数调用者:明确理解 null 所表示的意义,尽早检查和处理 null 返回值,减少它的传播
-
函数作者:明确声明不接受 null 参数,当参数是 null 时立即崩溃
六、防止过度工程
-
当过度思考“将来”是过度工程即将出现的重要信号
-
过度关心并为“代码重用”设计也是过度工程,拖垮进度
-
过度关心“测试”也会引起过度工程
根据这些,作者给出了防止过度工程的原则如下:
-
1.先把眼前的问题解决掉,解决好,再考虑将来的扩展问题。
-
2.先写出可用的代码,反复推敲,再考虑是否需要重用的问题。
-
3.先写出可用,简单,明显没有 bug 的代码,再考虑测试的问题。