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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:05:05