脚本修复技术是修复非法的事件序列,使得这些脚本可以在修改过的 GUI 上执行。表 1 中将 GUI 的变化主要是由 3 类构成的,对象的增加(例如增加了新的按钮),对象的删除(原有按钮被删除),对象的修改(原先的按钮变成了菜单选项)[30]。如果将这三类分析清楚,那么脚本修复功能就能够实现。除此之外,还有考虑依赖关系,因为对象如果存在被依赖关系,那么它的改变势必会对其产生依赖的对象产生一定的影响,因此可以将 GUI 的变化分为六类。下面分别介绍这六种状况。
表 1 GUI 的六类变化
对象变化类型 | 是否被依赖 |
增加对象 | 独立 |
增加对象 | 存在被依赖关系 |
删除对象 | 独立 |
删除对象 | 存在被依赖关系 |
修改对象 | 独立 |
修改对象 | 存在被依赖关系 |
(1) 该对象不存在被依赖关系
存在事件序列 (e 1,e 2...e n)。新增对象 i,如果在该序列中不存在对对象 i 的依赖事件,那么关于 i 的事件 e i 可以不放入该队列中。如图 6 中 “事件序列图 1 ” 所示,因此原事件序列可以不用改变。
图 6. 事件序列图 1
(2) 该对象存在依赖关系
存在事件序列 (e 1,e 2...e n)。如果在该序列中存在对对象 i 的依赖事件,即 e i 是某个事件运行的前提条件。那么关于 i 的事件 e i 要放入该队列中。将 e i 放入依赖事件之前,这样可以保证原理的事件序列可以正常运行。因为对象树被更新,所有对象的事件集合也会被更新。因此在事件序列中只需要将原来 e x(依赖于 e i),更换为 e x'(e x' 为默认操作,包含了对 i 的操作)。如图 7 中 “事件序列图 2 ” 所示,e x' 替代了 e x 加入到新的事件序列中。
图 7. 事件序列图 2
可见对于新增对象,只要原有事件序列没有产生对其的依赖,原有事件序列依然可以正常运行。
(1) 该对象不存在被依赖关系
存在事件序列 (e 1,e 2...e i...e n)。如果在该序列中不存在对对象 i 的依赖事件,那么关于 i 的事件 e i 可以直接从该队列中删除。如图 8 中 “事件序列图 3 ” 所示,因此原事件序列只用删除 e i 事件。
图 8. 事件序列图 3
(2) 该对象存在被依赖关系
存在事件序列 (e 1,e 2...e i...e n)。如果在该序列中存在对对象 i 的依赖事件,那么除了关于 i 的事件 e i 要被删除之外,同时要将 e x 更改为 e x'(e x' 为默认操作,在默认操作中也删除了对 i 的依赖事件)。如图 9 中 “事件序列图 4 ” 所示,新的事件序列中原有 e i 被删除。