
用AI搭Revit插件框架,一个排序bug暴露了三个问题
作者:优易科技 | 优易BIM助手
上周做了一件事:让AI分析我们用了三年的UBIMApp插件框架。
结果AI不仅看懂了代码,还在三个地方找到了问题——包括一个从小到大没人发现的排序bug。
这个故事值得写下来。不是说AI多厉害,而是有些bug你在一个系统里待久了,就是看不见。
背景:一个JSON驱动的动态菜单
UBIMApp是我们整套Revit插件的公共入口。它不做具体功能,只做一件事:读JSON,生成Ribbon菜单。
每个子插件(净高分析、楼层设置、装配出图……)只需要提供一个JSON注册文件,描述自己要挂在哪个Tab、哪个Panel、按钮图标在哪、DLL路径在哪。UBIMApp启动时扫一遍Json目录,动态构建出整个U-Tools选项卡。
听起来很优雅对吧?子模块完全解耦,加新功能改改JSON就行,不用动核心代码。
这个设计用了三年,一直没问题。直到上周我让AI把整个框架读了一遍。
问题一:排序逻辑写错了三年
AI读完代码后给我提了一个问题:
★
RibbonData.cs第40行,ButtonIndex计算属性:get { if (RibbonSplitButtonIndex != 0) return RibbonSplitButtonIndex;
elsereturn RibbonButtonIndex; }当
RibbonSplitButtonIndex = 0时,会错误回退到RibbonButtonIndex。
翻译成人话:SplitButton分组的索引,默认值是 -1。如果你真的把某个按钮的分组索引设为 0,它会跑进 else 分支,按独立的按钮索引排序,而不是按分组排序。
这个bug存在了至少三年。
为什么没发现?因为没人把分组索引设为 0。项目里的索引都是从 1 开始的。直到有一天子模块多了,某个新加的JSON想用 index=0 表示"最前面",结果跑了排序后位置不对,没人知道为什么。
修起来很简单——改成 if (RibbonSplitButtonIndex >= 0) 就行了。一句话。
但发现了就是发现了。这种bug你让活在这个系统里的人自己看,很难看出来的。 因为每个人心里都预设"这块逻辑是对的",不会主动怀疑一个用了三年的条件判断写错了。
问题二:项目引用路径和实际路径差了两年
排序bug修完,准备编译。AI又说了一句话:
★你的 .csproj 里引用路径指向的目录不存在。
我查了一下,果然。Revit API的引用路径写的是 d:\SDK\packages\Revit\2020\,但实际上NuGet包的路径是 d:\SDK\packages\Autodesk.Revit\lib\2020\。中间差了两层目录。
谁写的这些路径?三年前某个同事写的。那时候NuGet包的目录结构还是 Revit\2020\,后来升级了包版本,目录结构变了,但 .csproj 没跟着改。
为什么之前能编译?因为同一台机器上,Revit\2020\ 这个旧路径还存在——之前的旧版本NuGet包没删干净。直到某天 dotnet restore 清了一次缓存,旧目录被删了,编译才炸。
你永远不知道你项目里的路径是"对了"还是"没炸"。 能编译通过不等于路径写对了,可能只是旧文件还没被清理。
问题三:WPF模板残留
这个最奇怪。AI说:
★
App.xaml、MainWindow.xaml是WPF项目模板残留,可以清理。
我看了一下,确实是。UBIMApp是个Revit插件,输出类型是Library,根本没有自己的窗口。但项目文件里引用了 App.xaml,还设了 ApplicationDefinition 编译项。
也就是说,这个项目从创建到现在,每次编译都会尝试编译这两个根本没用的文件。 虽然它们只是空壳,不影响编译结果,但多了一个毫无意义的编译步骤。而且如果哪天不小心改了 App.xaml,编译会莫名其妙报错,排查起来得花半小时才能意识到是残留文件的问题。
删掉,编译清爽。
所以,用AI做框架审查值不值?
这个问题我问了自己三天。
先说结论:值,但和你想的值不一样。
我原本期待的是:AI能帮我写新功能、生成代码、提速。实际发生的却是:AI在老旧代码里找到了我从来没想过会有问题的陈年bug。
这给了我一个启发:
用AI做新功能开发,效率提升大概20-30%。但用AI做现有代码审查,发现的问题往往是那种"如果没人发现,它会一直在那里烂到项目废弃"的bug。
新功能写错了,跑一次就发现了,代价很小。框架层面的隐式bug,藏在代码逻辑的细节里,没人发现就是三年、五年、直到换人维护才炸。
而AI没有"习惯性预设"。它读每一行代码都是第一次读。它不会因为"这行代码从项目开始就在那"就放过它。
几个想法
第一,定期让AI读一遍自己的旧代码。不需要改,就让它"说说有什么可疑的地方"。它没有心理负担,不怕得罪人,不怕冒犯三年前的自己。
第二,写代码时多做一件事:把"默认值"和"边界值"单独标出来拆分出来。排序逻辑用 >= 0 还是 != 0,这种问题有标准答案吗?没有。但如果你自己都不确定,那就应该拆出来写成注释,而不是夹在条件表达式里。
第三,项目引用路径这种东西,别手写。用环境变量或构建脚本生成。能少一个手动配置就少一个。
AI不是你代码的替代品,是你代码的第三只眼睛。而这只眼睛最大的价值,是它从来看不见"历史包袱"——每个文件它都是第一次读。
欢迎转发
优易科技 | 优易BIM助手
夜雨聆风