乐于分享
好东西不私藏

用AI搭Revit插件框架,一个排序bug暴露了三个问题

用AI搭Revit插件框架,一个排序bug暴露了三个问题
用AI搭Revit插件框架

用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 != 0return 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.xamlMainWindow.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助手