您的位置:首页 > 职场人生

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

2015-09-21 11:00 495 查看
注重实效的偏执

你不可能写出完美的软件
21,按合约设计 DBC/Design by Contract
做某事的期望和陈述
前条件,开始之前的必要条件。pre
后条件,执行后悔导致的状态。post
类不变项,类确保在调用者看来,该条件总是为真。
通过合约进行设计。
对在开始之前接受的东西要严格,而允诺返回的东西要尽可能少。
实现DBC:
没有合约,你就是靠巧合编程了。自动检查。
文档记载,注释。
断言:
使用断言,对此进行部分的模拟。
语言支持:
编译器和runtime系统中检查前条件和后条件,c/c++ -> Nana
DBC于早崩溃:
提前崩溃,可以知道问题出在哪里。
不变项的其他用法:
循环不变项:
边界问题
语义不变项:
固定的需求、不可违法的法则与那些仅仅是政策的东西不同。
动态合约与代理
合约不是固定的,可以通过组件和代理来实现某个目标。

22,死程序不说谎
早崩溃/防御性编程
要崩溃不要破坏:
如果发生了不可能的事情,就让你的程序崩溃/终止。死程序可以坏程序要好。

23,段言式编程
如果它不可能发生,用断言确保它不会发生。
检查排序是否有效?
传给断言的条件不应该有副作用。断言可能会在编译的时候关闭掉,决不要把必须执行的代码防盗断言中。
断言不尽兴错误处理,而是确保不该发生的事不应该发生。
让断言开着:
没有性能问题,就保留断言,发布出去吧。
调试不要改变被调试系统的行为,否则就是Heisenbug。

24,何时使用异常
如果不停的if,else来避开异常。只要在开头结尾处写try catch就好了。可以将错误收集并处理。
而且控制流也会清晰很多。
什么是异常情况:
异常留给意外情况,将异常留给异常的情况。
错误处理器是另一种选择:
没有异常的语言,如:C。

25,怎样配平资源
要有始有终
不要被全局变量把程序耦合在一起。放到参数里传递。局部变量。
嵌套的分配:
与分配次序相反,进行释放。
在代码不同位置进行申请时,总是保持同一个顺序,防止死锁。
对象与异常:
构造和析构,使得把资源封装在类中很方便。
配平与异常:
支持异常的语言,如何保证释放呢?
在C++异常机制下配平资源:
这个代码好,可以看看 p106
正常释放,会造成DRY;于是使用对象不用指针。
或者用对象做成一个指针的封装。提供一个->的重载。
在Java,使用finally
当你无法配平资源时:
追踪资源,如何释放。More Effective C++会讲这个。
检查配平:
长期运行的、对请求进行服务的程序,很可能会回到主循环的顶部的某个地方等待下一个请求。
在一个更低、但用处并非更少的层面,可以购买内存泄漏检查工具。purify/Insure++
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: