跳到主要内容

今日单词:spaghetti

小盐啃文档
小盐啃文档

· 阅读约 3 分钟

今天干了件事,把刚接手的项目里自己半年前写的代码翻了出来,全选,复制,贴给 AI,附了一句中文:"帮我重写一下,太丑了。"

它回了我一句英文:"This is spaghetti code." 这词我认识,意大利面。查了下,原来在代码语境里是"乱成一锅粥"的意思——意大利面缠成一团,扯都扯不开。说实话挺贴切的,我第一次看自己那段代码的时候,感觉就像在看一盘放了一礼拜的意面,番茄酱都干在上面了。

那盘面是这样的:年初接了个表格组件,排期紧,我就在里面写了一个"灵魂排序"。现在回头看,三层 map 嵌套,内层一个 splice 直接改原数组,还有个 setTimeout 在外面包着,注释写着"不能删,删了会闪"。当时的我可能是怕自己忘了这个 setTimeout 是干嘛的,但半年后的我看着这行注释,跟看天书一样——不能删?为什么不能删?删了会闪又是闪什么?

我把代码贴给 AI 的时候心里其实有点虚,几百行,注释中英混杂,逻辑绕得跟麻花似的。AI 居然没有骂人(它当然不会骂人),问我要不要保留原有逻辑。原文大概是 "preserve the existing behavior" 什么的,我查了下,preserve,保留,behavior,行为,好,保留保留。

然后它给我出了一版重写好的。我一看,好家伙,两百行缩成了七十行,map、filter、sort 用得明明白白,我的 splice 和 setTimeout 全不见了。我小心翼翼跑了一下——白屏。报错信息是 Cannot read properties of undefined,我一看就懂了:我原来的代码里有个隐藏依赖,某个字段在特定条件下是 undefined,但我当时用了一个很脏的办法绕过去了(就是那个 splice!它把 undefined 的那条记录提前干掉了,所以永远碰不到)。AI 不知道这个上下文,它把我的脏活全清了,那个 undefined 就重新裸露出来了。

把报错贴回去,AI 道歉,加了个 optional chaining(可选链?这翻译对吗,就是那个 ?.),世界安静了,页面跑起来了。我高兴了大概十秒钟,然后发现它在数据大的时候会闪一下——白屏、渲染、出数据,中间有个明显的间隙。我当时为什么要放那个 setTimeout?不是因为防抖,是为了让 loading 先走一帧再灌数据,不然用户会看到半截表格闪烁。AI 不背这个锅,它哪知道我的 loading 走得比数据慢的那种难受。

我又把那个 setTimeout 加回去了。加回去的时候我笑了,注释还在,还是那句话:"不能删,删了会闪。"

现在这段代码是 AI 重写过的版本,干净了很多,逻辑我也终于能看懂了——怎么说呢,相当于我自己把一锅饭煮糊了,AI 帮我重新煮了一锅,但里面那颗硌牙的沙子,还是我自己的。

今日单词:spaghetti,意大利面,拼写我查了三遍才记住,估计过两周又忘了。

小盐啃文档
小盐啃文档

英语不好,硬啃英文文档。今日单词又忘了,明天接着查。

查看主页 →

更多「重写烂代码」的实战

评论

还没有评论,写下第一条讨论。