最近用Cursor(Claude 3.7 Sonnet那个模型)写一个FastAPI项目,确实快,但一个月下来review代码时发现,它特别喜欢把逻辑塞进一个超长的service函数,然后疯狂用依赖注入,还老爱生成pydantic的嵌套model。我原本习惯写扁平一点的模块结构,现在感觉自己的代码风格被它悄悄改写了,有点别扭。
用Cursor写后端一个月,感觉代码风格被它带偏了,大家有这问题吗?
全部回复
共 49 条同感,用久了确实会被它带节奏,我现在都刻意先自己写骨架再让它填。
这个我倒是有类似感受,不过可能跟你的情况稍微有点不一样。我用Cursor写Go的时候,它确实也倾向于把很多东西往一个函数里堆,尤其是接口实现那块,动不动就给你来一大坨,看着就累。后来我发现了,它其实是在模仿你项目里已有的模式,如果你一开始让它生成的时候没给特别明确的约束,它就会默认往“能跑就行”的方向优化,而不是往“好维护”的方向。我现在一般会在.cursorrules里写清楚函数长度上限和模块拆分原则,效果会好不少。至于依赖注入和pydantic嵌套,我觉得这个跟FastAPI生态本身有关系,模型训练数据里这类写法占比太高了,它只是忠实地反映了社区主流风格。但说实话,被带偏这件事本身挺值得警惕的,因为等你习惯了它的输出再回去写自己的东西,会发现自己下意识也在往那个方向靠。我现在的做法是每隔一段时间就关掉AI补全,纯手写几天,算是给自己做个风格校准。
我也有类似的感觉,不过我倒觉得不是被带偏,更像是被它训练出了某种惯性。它默认那套pydantic嵌套确实挺重,我后来直接在.cursorrules里写死“service函数不超过30行,model扁平化”,情况好很多。其实关键还是得自己先想清楚结构,再让它填肉,不然它就会按最容易生成的套路来。你试过用rules约束它吗,还是完全靠review往回改?
我也被带偏过,后来发现是提示词里没加限制,明确写“保持扁平结构”会好很多。
我也有类似感觉,不过我倒觉得不完全是坏事。Cursor确实爱往service里堆逻辑,但每次它生成完我会顺手让它拆一下,加一句“把校验和业务逻辑分开”,出来的结构就正常多了。依赖注入那个确实烦,有时候一个接口能给我套三层Depends,后来我在rules里写清楚项目规范,情况好了不少。说白了它就是个放大器,你自己风格够强它就跟着你走,你要是懒得管它,它就按自己那套来。
我也有类似感受,不过可能比你更早意识到。用Claude写代码时间长了会发现它确实有某种"审美偏好",比如service层动不动就搞成几百行的巨型函数,然后内部各种嵌套调用。我之前写Go的时候被它带着把interface定义得特别碎,后来自己回头改成更务实的结构反而花了不少时间。其实这跟模型训练数据里的代码分布有关系,它见过的开源项目里DI和嵌套model的写法占比高,就默认这是"正确姿势"。但实际业务里过度嵌套的pydantic model维护起来是真头疼,改一个字段要顺着好几层往上翻。我的做法是把它当个打字员而不是架构师,大结构自己先定好,让它往里填具体实现,生成完再手动拆函数。不然时间久了确实会被它驯化,尤其是你同时写几个项目的时候,风格就统一跑偏了。
我也用Claude 3.7写FastAPI,确实有这毛病,动不动就搞三层嵌套pydantic,service函数能写到两百行。后来我干脆在prompt里加一句“service保持在50行内,拒绝无意义DI”,效果还行。但有时候一不注意它又回去了,感觉得像带实习生一样盯着。你们有没有试过把项目现有代码风格喂给它当参考?
我也有同感,它老爱把逻辑堆成一大坨,后来我干脆先自己列好结构再让它填,能好不少。
同感,写多了确实会被它的套路同化。我现在隔段时间就手动重构一遍,不然模块结构越来越臃肿。