More Related Content Similar to 注重实效的编程(2) (20) More from Horky Chen (10) 注重实效的编程(2)1. 注重 效实注重 效实 的偏执的偏执
A Pragmatic Approach
(II)
Horky
28/May,2010
http://blog.csdn.net/horkychen
1
3. Enlarge your capability by tool
• find
• grep
• diff
• emacs
• sed
• M4
• python
• Perl
• ... Thousands more utilities in Unix/Unix like system.
(Windows User also could use them by Cygwin)
3
11. Story (III)
我们参加过一个项目的开发,有位高级工程师确信 select
系统调用在 Solaris 上有问题。再多的劝说或逻辑也无法
改变他的想法(这台机器上的所有其他网络应用都工作
良好这一事实也一样无济于事)。他花了数周时间编写
绕开这一问题的代码,因为某种奇怪的原因,却好像并
没有解决问题。当最后被迫坐下来、阅读关于 select 的
文档时,他在几分钟之内就发现并纠正了问题。现在每
当有人开始因为很可能是我们自己的故障而抱怨系统时
,我们就会使用“ select ”没有问题 作为温和的提醒。
思考 :
如何理解经验的益处与坏处?
11
12. No surprise!
• 在发现某个 bug 让你吃惊时(也许你在用我们
”听不到的声音咕哝说:“那不可能。 ),你必
”须重新评估你确信不疑的“事实 。在那个链表
——例程中 你知道它坚固耐用,不可能是这个
bug ——的原因 你是否测试了所有边界条件?另
——外一段代码你已经用了好几年 它不可能还
有 bug 。可能吗?
思考 :
• 两步曲:如何解决 BUG -> 如何预防 BUG
• 团队的集体智慧能够破除某个组员的误解吗?
12
13. Crash Early
• “ ”它不可能发生 是不可能发生的!
– 检查了打开的文件是否关闭?
– 检查了内存分配成功与否?
– 检查了不再使用的内存是否已经释放?
– 指针定位是否发生了漂移?
• Solution:
– 防御式编程
• 如果让你做个瓶子,要考虑哪些问题?瓶子装什么该是
首先要考虑的,水、油还是硫酸?
• 尽量提前检测出所有可能的异常!
13
14. Assertion
• 如果它不会发生,就用断言来确保它不会发生!
• 断言应用以下各项:
– 输入参数或输出参数的取值处于预期的范围内;
– 子程序开始(或者结束)执行时文件或流处于打开(或关闭)的状态;
– 子程序开始(或结束)执行时,文件或流的读写位置处于开头(或结尾
)处;
– 文件或流已用只读、只写或可读可写方式打卡;
– 仅用于输入的变量的值没有被子程序所修改;
– 指针或对象非空;
– 传入子程序的数组和其他容器至少能容纳 X 个数据元素;
– 表已初始化,存储着真实的数值;
– 子程序开始(或结束)执行时,某个容器是空的(或满的);
– 一个经过高度优化的复杂子程序的运算结果和相对缓慢但代码清晰的子
程序的运算结果相一致;
• 断言用于绝不会发生的状况!
14
16. Exception
• 可能 -> 错误检查
– 检查传入的文件是否存在
• 不可能 -> 异常处理
– 检查系统目录是否存在
• 错误发生与错误处理分割!
• 思考 :
– 异常与错误检查是否等效?
– 如何抛出异常?是否可以集中管理异常 ?
16
18. Story
• Donald E. Knuth在 TeX: The Program 的前言
中说:
" 我相信,在 1985 年 11 月 27 日, TeX 代
码里面的最后一个 BUG 已经被发现和解决
了。但是,如果代码中仍旧有 BUG ,我很
高兴付给任何第一个发现 BUG 的人 20.48
美元 ( 这是前一个金额的两倍,而且我计划
在一年内把它翻倍。你看,我很自信! )"
想知道后来发生了什么吗 ?
18
19. Design By Contracts
• http://en.wikipedia.org/wiki/Design_by_contract
• 确保程序做该做的事,并且把事做好!
– 前置条件及收尾条件 (Post Condition)
• GNU Nana -> Last updated at 2005!
19