DBC最早是有Bertrand Meyer 的 Eiffel programming language提出。DBC在Evans DDD的柔性设计中也谈到了。所以,DDD是集OO设计大成,正因为它是一个总结,你就不能把它和其他思想并列在一起,这有上下层次之分,我在这里强调DDD了,就是排斥其他思想,这是很多初学者外行看热闹的误解。
Contract契约是对Object对象行为的描述表达,也就是说:一个对象的行为方法做到什么样为合适?这是有数据库背景的人转到OO上一个鸿沟,而通过契约来约定是一种主要的设计方法。
http://en.wikipedia.org/wiki/Design_by_contract
DBC分三种:
1.Post-conditions 后置条件postcondition 表示调用一个方法一定会得到的结果。类似断言Assertion,如果语言不支持断言,那么我们就必须自己写断言,也就是测试驱动了。
2.Pre-conditions 前置条件precondition ,预先保证后置条件必须满足前置条件。
前置条件必须满足,后置条件必须实现,通过契约的前置和后置条件的结合,就不会出现有隐藏的功能obligations,这样,事情清清楚楚地被摆出来。这样设计才能落实为代码,保证正常的对象调用。
3.类不变量class invariant 表示对象状态的断言,执行完任何操作后都都应该被满足,不变量还是对聚合体进行完整性严格定义。
不变性意义非常重要,不变性意思是对象的所有属性必须由其方法来保证一致性。DDD推广到根对象要通过方法保证其聚合体内所有对象的属性保持一致性。比如ForumThread的addMessage就保证加入新的Message以后,其聚合体内相关属性一致修改,保持不变性是一个排他性过程,或者说需要由锁或事务来完成,这又和伸缩性scalable设计有关。
http://www.jdon.com/jivejdon/forum/messageList.shtml?thread=36063&message=23122565#23122565
[该贴被banq于2009-05-21 15:00修改过]
[该贴被admin于2012-10-17 09:34修改过]