程序员修炼之道---从小工到专家(第6章)

当你编码时

31, 靠巧合编程
怎样靠巧合编程:
一开始就不知道它为什么能工作。
实现的偶然:
因为代码现在的编写方式才得以发生的事情。最后会依靠没有记入文档的错误或是边界条件。
理由:
     它也许不是真的能工作--它也许只是看起来能工作。
     你依靠的边界条件也许只是一个偶然。
     没有记入文档的行为可能会随着库的下一次发布而变化。
     多余的和不必要的调用会使你的代码变慢。
     多余的调用还会增加引入它们自己的新bug的风险。
结论?
     对于你编写给别人调用的代码,良好的模块化以及把实现隐藏再撰写了良好文档的小接口之后,这样一些基本原则都能对你有帮助。
     对于你调用的例程,要只依靠记入了文档的行为。如果出于任何原因你无法做到这一点,那就充分地把你的各种假定记入文档。
语境的偶然:
        只是你现在为GUI环境编写代码,该模块就必须依靠给你的GUI吗?你是否依靠说英语的用户?有文化的用户?你还依靠别的什么没有保证的东西?
隐含的假定:
     巧合可以在所有层面让人误入歧途--从生产需求知道测试。特别是测试,充满了虚假的因果关系和巧合的输出。不要假定,要证明。
Don't Program by Coincidence
怎么深思熟虑地编程
     总是意识到你在做什么。
     不要盲目地编程。
     按照计划行事
     依靠可靠的事物,不要依靠巧合或假定。
     为你的假定建立文档。
     不要只是测试你的代码,还要测试你的假定。断言
     为你的工作划分优先级。把时间花在重要的方面,很可能也是最难的地方。如果基础设施不正确,再好的口哨都没用。
     不要做历史的奴隶。准备好进行重构。
所以下次有什么东西看起来能工作,而你却不知道为什么,要确认它不是巧合。

32, 算法速率
我们说估算算法是什么意思?
     只要我们编写的是含有循环或递归调用的程序,我们就会下意识地检查运行时间和内存需求。
O()表示法:
    1:常量型,访问数组元素,简单语句
    lg(n): 对数型,二分查找
     n:线性型,顺序查找
     nlg(n):比线性差,但不会差很多(快速排序,堆排序)
     n的平方,平方律型(选择和插入排序)
     n的立方,立方型,2n×n 矩阵相乘。
     Cn,指数型,旅行商问题,集合划分。
常识估算:
     简单循环,从1循环到n,很可能是O(n)
     嵌套循环,O(m*n) -> O(n的平方)
     二分法,O(ln(n))
     分而治之,O(nln(n))
     组合,常常用启发式方法来优化。
实践中的算法速率:
     时间和空间的权衡。
     估算你的算法的阶,只需要几个点就可以确定。
     测试你的估算。
最好的并非总是最好的:
     最快的算法未必是最合适的。有时候追求简单,快速。

33,重构
重写,重做和重新架构代码合并起来,成为重构,refactor
你应在何时进行重构:
不要对改动犹豫不决
     重复,非正交的设计,过时的知识,性能。
现实世界的复杂情况:
     重构就像是切除肿瘤,需要停止花时间修复。否则。。。
早重构,常重构。
如果不能立刻重构,将其加入计划。
怎样进行重构:
     重构就是重新设计,新的事实、新的理解、新的需求等。
     重构要慎重、深思熟虑、小心进行的活动。
1, 不要试图在重构的同时增加新的功能。
2, 在开始重构之前,确保你拥有良好的测试。尽可能经常运行这些测试。这样,如果你改坏了,你也会知道。
3, 采取短小、深思熟虑的步骤。在每个步骤后测试。
修改了代码,也要修改依赖代码的地方。最好一劳永逸地修正它,不要容忍破窗户。

34, 易于测试的代码
单元测试:
软件的单元测试是对模块进行演练的代码,建立某种人工环境,然后调用被测试的模块中的例程。然后不同的测试值,对返回值进行检查。
针对合约进行测试:
代码是否符合合约,以及合约的含义是否与我们所认为的一样。边界,前后条件等。
这种风格的测试要求你首先测试模块的自组件。这样容易得知哪里出了错误。
为测试而设计。
早发现问题比解决问题更好。
编写单元测试:
将它们放在方便的地方。
这个给开发者带来无价的资源:
1, 一些例子,说明怎样使用你的模块的所有功能。
2, 用于构建回归测试、以验证未来对代码的任何改动是否正确的一种手段。
可以用#ifdef在编译的时候跳过单元测试的代码。
也可以借助shell脚本。

使用测试设备:
     可以是GUI驱动,也可以是makefile与perl脚本组合
测试装备都应该有以下功能:
     用以指定设置与清理的标准途径。
     用以选择个别或所有可用测试的方法。
     分析输出是否是预期结果的手段。
     标准化的故障报告形式。
可以通过子组件来构成一个系统,达到任意深度。
即兴测试,临时测试,print,或者交互。可能需要将它正式化。
构建测试窗口:
     含有跟踪消息的日志文件就是一种机制,格式要正规一致。
     使用不为普通用户所知的热键,来打开诊断调试窗口。
     更大的程序,可以使用web服务器。
测试文化:
     测试是技术,更是文化。
     测试你的软件,否则你的用户就得测试。
35,邪恶的向导
     谨慎使用wizard,向导为你写好的代码你可能不清楚。如果你不清楚,可能就是在靠巧合编程。
     不要使用你不理解的向导代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值