明盒开发
未经允许,严禁转载本栏目内容
本文经许可转载自软件工程专家网www.21cmm.com,
未经CSDN许可,请勿随便转载,谢谢合作[url=http://www.21cmm.com/prelogin.asp?page=/bbs/index.asp?Type=D][/url]
(一) 明盒结构
明盒定义了实现转换状态盒功能的过程。明盒和相应状态盒的输入、响应集、外部的行为和状态都是同样的。明盒过程通常围绕着外部服务来组织,其用户(人、硬件或其他的明盒)能调用这些服务。例如:一个数据管理明盒可以提供加入、删除和检索用户数据的服务。
明盒设计的焦点是算法的开发。执行由case语句组成的明盒过程能实现只需要很少的算法细节而构造的状态盒规范。这些语句检测当前的输入和以前的状态以进行合适的响应并产生新的状态。这些过程本质上相当于检索状态盒表,以用于确定正确的变换。通常也可以通过对单独的状态盒变换与它们以明盒语句的局部实现的等价性比较来完成验证。
然而,在一个算温柔密集的系统里,状态盒规范需要扩展的明盒分析、设计和正确性验证这些系统可能倒显示简单的状态盒规范,这些状态盒规范仍然需要以明盒形式执行。这些肯盒通常导致大型的过程设计,也需要定义新的黑盒或使用忆有的黑盒。
明盒由顺序、选择和循环控制结构组成。在表4.1中以图形和设计语言形式显示了一个例子(Mills,Linger和Hevner,1986)。同样也可以引入并行控制结构。控制结构本身由功能结点和判定结点组成,在表中用g、h表示功能结点,用p表示判定结点。用圆圈表示的汇集结点汇合了控制流。一个功能结点可以代表从最简单的赋值到复杂的计算的任何操作。任何功能结点自身可以是一个新的或重用的黑盒。明盒中的每个功能结点可以将当前状态作为输入,也可以产生一个新的状态作为输出。每个判定结点可以访问但不能改变当前状态。顺序控制结构可以推广到多个功能结点的情况(表4.1给出了一个有两个功能村点的例子),或对索引类序列来说是一个功能结点在索引变量控制下的重复执行,就像fordo结构。Iftfenelse则可被认为是有多重分支的case结构。
为了便于引用,每个部分可以用一个名字代替,例如对顺序,g和h 是第一部分和第二部分。在Ifthen中,p、g、h分别表示条件测试,肯定执行部分,否定执行部分。在Whiledo中,p和g分别表示循环条件测试和执行部分。
每个明盒控制结构有一个单一的入口行和一个单一的出口行,在控制流中无副作用。从入口行到出口行,一个控制结构仅仅执行数据的变换。加为单入/单出的特性,这些控制结构。相当于数学函数。例如,以下是个三步顺序赋值,变量为t、x、y(:=相当于师范值操作)
do
t:=x
x:=y
y:=t
enddo
如下图中所示。Point1中,一个初始化定义域定义了txy的值(加0代表初始值,如,t0是t的初始值)。第一步t:=x将t 的值改为x的初始值以形式point2、point3中实现x到y的师范值。最后到达point4。整个顺序从1到4的排列结果可以由自然语言表述为:
将x的初值赋给t并交换x,y的值。或者等价地写成并行赋值:
t,x,y:=x,y,x
在并行赋值中,赋值号右方的所有变量或表达式的值同时赋给相应位置的左方变量。也就是说,x到t、y到xx到y同时典型值。用集合表示法,{(<t,x,y>,<x,y,x>)}函数定义是与次序无关的。该定义也与上下文无关。即使是在一个大的明盒中,函数定义也是相同的任何明盒控制结构都像图4.2中的例子一样实现了从定义域到值域的映射。
(二) 明盒抽象化和文档化
人们应该依据控制结构从入口到出口对数据的影响来解读和理解它们,并以函数定义的形式文档化。程序函数,定义为将变量的终值表示为初值的函数,这些定义由函数抽象所决定。定义的表达方式多种多样,从自然语言到数学公式。程序函数与相应的控制结构是功能等价的。
系统地解读和抽象程序逻辑有助于恢复丢失的或不完整的文档。尤其是以结构化形式表示的继承性系统和重用部件,可将其解读和抽象 得到设计文档,有助于恢复内嵌的事务规则最终增加可维护性和可扩展性。
例如,下表中(wxy和z是正整数)列出了要解读和分析 的控制结构和对其函数功能的抽象结果。Sequence的程序函数是其中单个操作的组合。在这里,在第一步操作中得到的w的值可代替第二部分中出现的w。ifthenelse结构要将其真假操作合为一个表达式。这样,真假操作可被看作是执行了一个通用的数学操作。Whiledo和其他循环结构可能需要更多的分析,不过通常要将对一个表达式的多次循环执行的结果进行组合。在这个例子中,如果x是奇数,它的值在每个循环中减少2,直到为1,循环终止。如果为偶直到3终止。这个程序函数可以用如下两个条件规则很方便地表示:
(condition1→rule1|
condition2→rule2)
这里,每个条件是定义环境的断言,以决定是否执行相应的规则(赋值)。垂直条(|)代表"或"。这样,如果初始x是奇数,它最终的值宵是1。否则,如果x的初始值是偶数,最终值就为0(一般情况下,条件规则可有多个部分)。
如果条件规则中所有的条件都是互相独立的,此条件规则称为不相关规则,同时条件的排列顺序并不影响结果。不相关规则在表示程序函数时很有用。注意一个状态盒也定义了可能含有许多条件的不相关规则,这些规则对输入和已有状态做出评价以确定输出和新的状态。
上表中的sepuence、ifthenelse 和whiledo结构的程序函数分别是次序无关、选择无关以及循环无关的。这就是说,这些结构的程序函数将控制流进行抽象,只定义从入口到出口对数据的实际影响。
控制结构和功能节点的单入单出性质对于明盒抽象、设计和验证的可扩展性是很关键的。因此,明盒设计中应该避免使用影响这些性质的特定语句(如导致随意分支逻辑的goto语句)。单入单出结构使得在创建大型设计时仍然能对它们的结构和功能进行良好控制,因此拥有良好的可扩展性。特别是如果需要实现状态盒转换功能,可以在明盒设计中以顺序或嵌套方式不断地连接控制结构。
为说明这个问题,考虑下图所示的明盒过程设计。位于设计的最底层的while q do ienddo,从入口到出口的实际效果(net effect)可被抽象为与循环无关的程序函数,命名为A。do g;h enddo则被抽象为与顺序无关的程序函数,命名为B。而ifthenelse则可以被表示为在玩高层次上的、功能等价的抽象层次,表述为if p then A else B,这里不需要sequence和whiledo的任何细节;而它又可被抽象为C。现在do C;k enddo又可以被当作更高层的、功能等价的抽象层次,也不需要ifthenelse的任何细节。这个sequence的作用可被抽象为程序函数D,它代表了整个明盒的总体函数功能。这样,明盒设计就定义了一个很自然的抽象的层次结构,这些抽象记录了每个层次中抽象操作的完整的函数效果,与要求的过程细节无关,但抽象过程中的行为都应是可理解的。抽象层次中的抽象操作是一种代数操作,其中仅仅用程序函数替换中的行为都应是可理解的。抽象层次中的抽象操作是一种代数操作,其中仅仅用程序函数替换控制结构,用do、if等关键字作为函数运算符。函数抽象化是一个完美的、系统的方法,可以恢复程序文档,以理解和维护系统。