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

来源:互联网 发布:天天特价淘宝网服装 编辑:程序博客网 时间:2024/05/04 17:30

注重实效的偏执

你不可能写出完美的软件
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++


0 0
原创粉丝点击