You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题排查与优化方案

你的代码存在几个关键问题,导致结果不符合预期:

  1. 变量覆盖问题:每次遍历mVerification的对象时,s都会被重新赋值,最终Display s只输出最后一个对象的判断结果,而非你预期的逻辑结果。
  2. 字符串匹配误差:DOORS属性值可能包含前后空格,或Acceptance值存在大小写差异(比如accepted而非Accepted),导致匹配失败。
  3. 查找效率低下:每次遍历都全量扫描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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:02:49