DOORS中使用DXL跨模块对比对象属性的代码优化求助
DOORS DXL跨模块对象属性对比优化方案
原代码核心问题
- 未遍历模块对象:直接使用未初始化的
obj1,触发空指针错误 - 低效对象匹配:
obj1 in m2会遍历整个m2模块查找对象,数据量大时性能极差 - 拼写错误:路径中的
Firts应为First - 属性处理不严谨:未考虑m2中不存在对应属性、属性类型非字符串的情况
- 资源未释放:未关闭打开的m2模块,可能导致DOORS资源占用异常
优化后的代码
// 定义模块路径(修正拼写错误) string m2Path = "/First project/System/Module Verification" // 打开目标模块(用read模式替代edit,避免误修改) Module m1 = current Module m2 = read(m2Path, true) // true表示打开时不弹窗提示 if (m2 == null) { print "无法打开模块:" m2Path "\n" exit } // 建立m2的ID到对象的哈希表,实现O(1)快速查找 HashTable htM2Ids = create() Object obj2 for obj2 in m2 do { string reqId = obj2."Req Id" "" if (!null reqId && reqId != "") { put(htM2Ids, reqId, obj2) } } // 遍历m1中的所有对象,对比属性 Object obj1 for obj1 in m1 do { string ieId = obj1."IE ID" "" if (ieId == "") { print "m1中对象" obj1."Absolute Number" "缺少IE ID属性,跳过对比\n" continue } // 通过哈希表快速查找m2中对应的对象 obj2 = get(htM2Ids, ieId) if (obj2 == null) { print "m2中未找到匹配IE ID为[" ieId "]的对象(m1对象编号:" obj1."Absolute Number" ")\n" continue } // 对比除IE ID外的所有属性 print "正在对比m1对象" obj1."Absolute Number" "与m2对象" obj2."Absolute Number" "(匹配ID:" ieId ")\n" Attribute attr for attr in obj1 do { string attrName = name(attr) if (attrName == "IE ID") continue // 跳过ID属性 // 处理属性类型,避免非字符串属性转换错误 string val1 = "" string val2 = "" if (type(attr) == TypeString) { val1 = obj1.attr "" // 先检查m2是否存在该属性 if (exists(obj2, attrName)) { val2 = obj2.(attrName) "" } else { val2 = "[m2中无此属性]" } } else if (type(attr) == TypeInteger) { val1 = string(obj1.attr 0) if (exists(obj2, attrName)) { val2 = string(obj2.(attrName) 0) } else { val2 = "[m2中无此属性]" } } else if (type(attr) == TypeDate) { val1 = string(obj1.attr date(0,0,0)) if (exists(obj2, attrName)) { val2 = string(obj2.(attrName) date(0,0,0)) } else { val2 = "[m2中无此属性]" } } else { // 其他类型暂时转为字符串处理 val1 = string(obj1.attr) if (exists(obj2, attrName)) { val2 = string(obj2.(attrName)) } else { val2 = "[m2中无此属性]" } } // 检测差异并输出 if (val1 != val2) { print " 差异检测:" print "属性=" attrName "," print "m1值=" val1 "," print "m2值=" val2 "\n" } } } // 清理资源 delete htM2Ids close(m2) // 关闭模块,释放资源 print "\n对比完成\n"
关键优化点
- 哈希表加速匹配:预先将m2的
Req Id与对象映射到哈希表,查找时间从O(n)降到O(1),大幅提升大模块对比效率 - 严谨的属性类型处理:支持字符串、整数、日期等常见属性类型,避免类型转换错误
- 边界情况处理:处理m1对象无ID、m2无对应对象、m2无对应属性等场景,输出更清晰的提示
- 资源安全:使用
read模式打开模块避免误修改,对比完成后关闭模块并删除哈希表,释放DOORS资源 - 错误提示完善:针对不同异常场景输出明确信息,便于定位问题
内容的提问来源于stack exchange,提问作者Emilie rei
相关产品推荐
相关产品推荐

