如何在DOORS中基于指定属性对比两个模块?
对比两个DOORS模块的快捷实现方案
你不需要完全依赖逐个循环遍历对象,DOORS提供了内置工具和高效的脚本技巧来简化对比工作:
1. 优先用DOORS内置的模块对比工具
这是最快捷的无代码方案:
- 打开需要对比的两个模块,点击菜单栏的
Tools > Compare Modules - 在弹出的对比设置窗口中,勾选你需要验证的属性:
- 基础属性:Object ID、Object Text
- 链接相关:勾选"Incoming Links"和"Outgoing Links"选项,工具会自动对比链接的目标、类型等信息
- 对比完成后,DOORS会生成可视化的差异报告,标注出对象缺失、文本不一致、链接增减的情况
2. 自定义对比用DXL脚本优化(减少循环冗余)
如果需要自定义对比逻辑,不用纯嵌套循环遍历,可借助以下技巧:
- 通过Object ID直接定位对象:Object ID在模块内唯一,用
obj(id, targetModule)可以直接从目标模块获取对应ID的对象,避免遍历整个模块查找:Module sourceMod = current Module targetMod = read("D:/DOORS/Modules/TargetModule", false) Object srcObj = first sourceMod while (!null srcObj) { // 直接通过ID定位目标模块的对应对象 Object targetObj = obj(srcObj."Object ID", targetMod) if (null targetObj) { print "Object ID " srcObj."Object ID" " missing in target module\n" } else { // 对比文本内容 if (srcObj."Object Text" != targetObj."Object Text") { print "Text mismatch for ID " srcObj."Object ID" "\n" } // 批量对比入链/出链 LinkSet srcInLinks = inLinks(srcObj) LinkSet targetInLinks = inLinks(targetObj) // 自定义逻辑对比链接集合(比如统计数量、匹配目标ID等) if (size(srcInLinks) != size(targetInLinks)) { print "InLink count mismatch for ID " srcObj."Object ID" "\n" } } srcObj = next srcObj } - 用哈希表(Skip结构)预存对象信息:如果需要双向对比(找两个模块互相缺失的对象),可以先把其中一个模块的所有Object ID存入
Skip,遍历另一个模块时直接查表,把时间复杂度从O(n²)降到O(n):Skip idMap = create() Module modA = read("D:/DOORS/Modules/ModA", false) Object objA = first modA while (!null objA) { put(idMap, objA."Object ID", objA) objA = next objA } // 遍历模块B,快速查找是否存在相同ID的对象 Module modB = read("D:/DOORS/Modules/ModB", false) Object objB = first modB while (!null objB) { if (!find(idMap, objB."Object ID")) { print "Object ID " objB."Object ID" " missing in ModA\n" } objB = next objB } delete idMap
3. 必须逐个循环的场景
如果你的对比逻辑不依赖Object ID(比如只匹配文本内容、忽略ID),或者需要自定义链接匹配规则(比如只对比链接的标签文本、不关心目标对象),那确实需要遍历对象和链接,但可以用上述的批量获取链接集、哈希表预存的方式优化,减少不必要的重复操作。
内容的提问来源于stack exchange,提问作者Erencan Tekin
相关产品推荐
相关产品推荐

