DXL问题:DOORS中两模块属性对比代码异常排查
问题概述
我需要遍历mVerification模块中的每个对象,提取其(dxl) Req. Id属性值,接着在mdata模块中查找具有相同Req. Id属性值的对应对象,再检查该mdata对象的Acceptance属性值是否为Accepted。若是则将变量s赋值为"True",否则赋值为"False"。
但我编写的代码始终显示"False",即便条件满足,恳请协助优化或改进实现方案。
原始代码
Module mVerification = current Module // Module "mVerification" Module mdata = read("/Requirements/Analysis/data") // Path to the "mdata" module Object Verif Object oDATA string reqID string s = null Object findObjectByReqID(Module mdata, string reqID) { Object obj for obj in mdata do { if (obj."Req. Id" "" == reqID) { return obj } } return null } for Verif in mVerification do { reqID = Verif."(dxl) Req. Id" "" oDATA = findObjectByReqID(mdata, reqID) if (!null oDATA && oDATA."Acceptance" "" == "Accepted") { s = "True" } else { s = "False" } // Display the value of s for this object } Display s
问题排查与优化方案
你的代码存在几个关键问题,导致结果不符合预期:
- 变量覆盖问题:每次遍历
mVerification的对象时,s都会被重新赋值,最终Display s只输出最后一个对象的判断结果,而非你预期的逻辑结果。 - 字符串匹配误差:DOORS属性值可能包含前后空格,或
Acceptance值存在大小写差异(比如accepted而非Accepted),导致匹配失败。 - 查找效率低下:每次遍历都全量扫描
mdata模块,数据量大时性能极差。
优化后的代码(汇总判断逻辑)
如果需求是只要有一个对象满足条件,就将s设为True,使用以下代码:
Module mVerification = current Module Module mdata = read("/Requirements/Analysis/data") // 预构建Req. Id到对象的哈希映射,提升查找效率 HashTable reqIdMap = create() Object dataObj for dataObj in mdata do { string reqId = dataObj."Req. Id" "" if (reqId != "") { put(reqIdMap, reqId, dataObj) } } string s = "False" // 默认设为False,找到满足条件的对象则改为True Object verifObj for verifObj in mVerification do { string verifReqId = verifObj."(dxl) Req. Id" "" if (verifReqId == "") continue // 跳过无Req. Id的对象 Object targetDataObj = get(reqIdMap, verifReqId) if (!null targetDataObj) { string acceptanceVal = trim(targetDataObj."Acceptance" "") // 统一转为小写比较,避免大小写差异问题 if (lower(acceptanceVal) == lower("Accepted")) { s = "True" // 若找到第一个满足条件的对象就停止遍历,可添加break // break } } // 可选:打印当前对象的单独判断结果 print "对象[" identifier(verifObj) "] 验证结果:" s "\n" } Display s delete reqIdMap // 释放哈希表资源 close mdata // 关闭打开的模块,避免内存泄漏
优化后的代码(逐个对象判断逻辑)
如果需求是每个对象单独判断并输出结果,使用以下代码:
Module mVerification = current Module Module mdata = read("/Requirements/Analysis/data") HashTable reqIdMap = create() Object dataObj for dataObj in mdata do { string reqId = dataObj."Req. Id" "" if (reqId != "") { put(reqIdMap, reqId, dataObj) } } Object verifObj for verifObj in mVerification do { string s = "False" string verifReqId = verifObj."(dxl) Req. Id" "" if (verifReqId != "") { Object targetDataObj = get(reqIdMap, verifReqId) if (!null targetDataObj) { string acceptanceVal = trim(targetDataObj."Acceptance" "") if (lower(acceptanceVal) == lower("Accepted")) { s = "True" } } } // 显示当前对象的判断结果 print "对象[" identifier(verifObj) "] 验证结果:" s "\n" } delete reqIdMap close mdata
关键改进点
- 哈希表映射:提前将
mdata模块的Req. Id与对象存入哈希表,将单次查找时间从O(n)降为O(1),大幅提升性能。 - 字符串处理:用
trim()去除属性值前后空格,lower()统一转为小写比较,避免空格或大小写导致的匹配失败。 - 逻辑修正:根据实际需求调整
s的赋值逻辑,避免循环覆盖导致的结果偏差。 - 资源清理:添加哈希表删除与模块关闭操作,避免DOORS内存泄漏。
内容的提问来源于stack exchange,提问作者Chahd Sai
相关产品推荐
相关产品推荐

