增量式开发的理论基础 |
未经允许,严禁转载本栏目内容 |
本文经许可转载自软件工程专家网www.21cmm.com, 未经许可,请勿随便转载,谢谢合作 |
净室过程中实践的增量式开发技术是基于引用透明性原理的。引用透明性意味着一个表达式所关心的惟一的事情是它的值,能用其值相等的子表达式代替。引用透明性暗示,一个实体的有关低层细节被抽象了,而不是忽略了高层描述的特定系统。因此,当置身于较大的上下文中时,高层描述包含的每一件事必须明白表达实体。引用透明性的概念已在广泛的领域得到应用,这些领域包括:计算机科学、语言学、数学和逻辑学。 算术中的引用透明性 引用透明性具有的特性,保证冗长的算术表达式的估算将产生正确的回答。例如,在表达式(6+2)*(5-3)中,因为6+2=8,表达式等价于8*(5-3)。另外因为5-3=2,它也等价于8*2。最后,因为8*2=16,它就等价于16。引用透明性保证无条件地用8来代替;无须担心是否结果将继续与(5-3)相乘,或者与17相减,等等。引用透明性只建立一次应用于形式算术逻辑中。 注意,因为引用透明性,可能每执行一步,都是往正确答案进一步。因此,我们充满信心地说,在三步问题中,第一步完成时,问题1/3已完成。这就是,完成后续的步骤,以前的步骤无须重新访问。另外,由于每一步对其他步无负影响,在同样的层次上,小组可按任意顺序进行评估。因此,这种特性与重要软件概念在抽象、规范、解决方案和没有负作用上具有相似性。 软件中的引用透明性 软件增量式开发的基础在于为程序和程序部分制定数学函数规则(Linger、Mills和Witt1977)。这种观点认为程序开发作为一种自顶向下的控制结构或子函数(子规范)的函数改进(规范)过程,这种改进将导致基于对象或函数分解,或者是二者的结合。例如,一个给定的函数(规范) f能改进为如下的任一种形式: do f1 ; f2 enddo 顺序 if p then f1 else endif 选择 while p do endo 循环 其中f1和 f2表示更进一步改进的子函数(子规范)。后续函数改进必须维持每一步正确性验证了的函数等价性。例如,在上述顺序改进中,子函数f1和 f2的合并对原函数f在数据影响上必须等价。引用透明性要求任意函数(f,f1或 f2)在设计中应该完整定义在该点所要求的效果,没有更多的为单独改进而涉及到其他设计部分的影响。 因为引用透明性,任何精化步骤的验证能够与其他精化步骤相互独立地进行,这就意味着,在系统的在部分组件写出之前,在早期的增量中,系统的体系能够被验证,在后期的增量中,体系结构不须重新验证。然而应注意,进入体系认证系统组件的规范,实际上提供了精确的接口文档,在编码完成时,保证系统作为一个整体达到所要求的性能。 引用透明性在程序设计级函数精化的实例如图。图中右边的两步精化保持了在每一步函数间的等价。首选,精化初始规范为f循环初始代码g和子规范k,其中k规定了接口和 图 精化引用透明性的一个实例 设计时所要求的处理效果。其次,在第二步精化子规范k为循环。这些扩充步是引用透明性的,代表可能的增量定义。这样,第一步增量用g表示循环初始代码,用k中顺序中定义和连接来验证f。但在代码中取消桩。关键是代码g顺序连接子规范k在功能上等价于原定义f。第二步增量应用while do 循环来精化,功能上等价于。另一种设计方案,如图左边给出的那样,将违背引用透明性和失去自定义向下设计的智能控制。在这个简单例子中,这些方法的差别很小,但如果g和k分别代表50000行和500行代码(KLOC),它们间存在复杂的接口,引用透明性就意味着在项目的成功和失效间的差别。 |