程序员修炼之道 从小工到专家 6
第六章:当你编码时
编码不是工作,工作不是机械的把设计转换为可执行语句,不主动思考他们的代码的开发者是在靠巧合编程。而我们需要的时更乐观积极的参与编码的过程。在制作代码时,需要考虑你以后做测试,要让代码易于测试,这样才能增加通往实际的可能性。
31 靠巧合编程
灾难不是偶然的都是有预兆的,如果不做好编程,纯靠巧合,结局都不好。实现的偶然是那些只是因为代码现在的编写方式才得以发生的事情。你最后会依靠没有记人文档的错误或是边界条件.
32 算法速率
用o()表示
常量型(访问数组元素,简单语句)
对数型〈二分查找〕自g表示法霆I。g2(n)的酊万形式丿线性型(顺序查找)
- o(nlnlg(n))) 比线性差,但不会差很多(快速排序、堆排序的平均运行时间〕
- o 〔n) 平方律型(选择和插入排序)
立方型(2” x矩阵相乘)
指数型(l旅行商问题,集合划分)
也可以通过常识来估算基本算法的阶
简单循环
嵌套循环
二分法
分而治之
组合
33 重构
应该重构的代码:
·重复。你发现了对DRY原则的违反
.非正交的设计。你发现有些代码或设计可以变得更为正交
.过时的知识。事情变了,需求转移了,你对问题的了解加深了。代码需要跟上这些变化。
.性能。为改善性能,你须要把功能从系统的一个区域移到另一个区域。
如何重构:
1.不要试图在重构的同时增加功能。
2.在开始重构之前,确保你拥有良好的测试。尽可能经常运行这些测试。这样,如果你的改动破坏了任何东西,你就能很快知道。
3.采取短小、深思熟虑的步骤:把某个字段从一个类移往另一个,把两个类似的方法融合进超类中。重构常常涉及到进行许多局部改动,继而产生更大规模的改动。如果你使你的步骤保持短小,并在每个步骤之后进行测试,你将能够避免长时间的调试。
34 易于测试的代码
如何测试:(针对合约进行测试)
1 |
全面测试LinkedList的合约。 |
2. |
全面测试S的合约。 |
3. |
测试A的合约,它依赖于另外两个合约,但没有直接暴露它们。 |
测试装备应具有的功能:
- 用以指定设置与清理(setup andcleanup)的标准途径。
- 用以选择个别或所有可用测试的方法。
- 分析输出是否是预期(或意外)结果的手段。
- ·标准化的故障报告形式。
35 邪恶的向导
向导可以帮助你自动生成骨架代码。但你要改编代码就只能靠自己,如果你真的使用向导,却不理解它制作出的所有代码,你就无法控制你自己的应用。你没有能力维护它,而且在调试时会遇到很大的困难。