掘金 人工智能 前天 11:50
优雅!太优雅!斯巴拉西!怎么让AI写出最优雅的代码
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文揭示了使用AI(如TRAE)辅助开发时常见的代码混乱问题,包括变量命名不一致和TypeScript类型定义混乱等,导致项目如同“屎山”。文章强调了建立明确的编码规范的重要性,并提供了一套详细的API代码编写规范,涵盖类型定义、函数命名、参数规范、文件组织和注释等方面。通过将AI视为需要严格管理的“员工”,并将其训练至遵循团队规范,开发者可以有效解决AI生成代码的随意性问题,提升代码质量、可读性和可维护性,最终实现高效、优雅的开发。

🤖 **AI代码生成的混乱与挑战**:在使用AI(如TRAE)辅助编写代码时,经常会遇到变量命名不统一、TypeScript类型定义混乱等问题,导致同一项目内的代码风格迥异,难以维护,最终形成“屎山”。例如,同一个状态在不同组件中可能被表示为不同的变量名或类型定义,给代码复用和协作带来巨大困难。

👑 **建立“老板”心态,规范AI行为**:要解决AI生成代码的随意性,关键在于开发者需要树立“老板”心态,将AI视为需要严格管理的“员工”。通过明确的指令和“不干有的是AI干”的原则,可以迫使AI遵循预设的规范,而非自由发挥。

📜 **制定铁一般的编码规范**:核心解决方案是制定详细且具有操作性的编码规范,特别是针对API代码。这包括统一的类型定义规则(如文件位置、命名格式)、接口函数命名规范(如操作类型+模块)、参数命名规范以及文件组织和注释规范,确保代码的清晰、一致和工程化。

🛠️ **用AI制AI,强制AI遵守规范**:可以通过AI助手(如豆包、GPT)来生成或优化编码规范文档。然后,将这些规范作为AI的“知识库”或在每次提问时强制其阅读和遵守,确保AI生成的代码严格符合制定的标准。

✨ **规范化带来的显著效益**:遵循上述方法,AI能够生成风格统一、命名规范、结构清晰且易于维护的代码。这不仅解决了“屎山”问题,还提高了开发效率和代码质量,使得代码协作更加顺畅,项目维护更加简单。

AI?纯💩山制造机

最近 TRAE 越来越火了!兄弟们!你们有没有遇到过这样的情况:

用着 TRAE 写代码,一开始感觉挺爽的,毕竟生成代码的速度比手写快多了,一拉一大把。但是... 写着写着就发现不对劲了!

每次问AI写代码,它都有自己的"小心思":

更让人崩溃的是TypeScript类型定义:

结果就是同一个项目里,不仅变量命名混乱,连最该严谨的TypeScript类型都成了"各自为政"的重灾区,想复用类型时发现根本兼容不了,只能靠类型断言强行"缝合",堪称现代版"屎山"制造机!

最后项目是完成了,但是代码风格五花八门:左边一坨右边一坨,每一坨单独看都很精致,但整体看起来就是一座💩山!!!

这种感觉就像是让10个不同的厨师给你做菜,每道菜都很好吃,但放在一起就是一桌奇怪的满汉全席... 🤮

真恼火!

解决方案:把AI训练成"服服帖帖的小女仆"

那咋办?今天,我就来教教大家怎么把AI调教成听话的服服帖帖的"白毛白丝萝莉小女仆"!

第一步:摆正心态 - 我他喵就是老板

重点来了! 你要把自己放在老板的位置上,去"CPU"这些AI!

把AI当成什么?老油条员工!

那怎么管理老油条员工?就是要狠狠的规范化!!!

"你不干?有的是AI干!""三千块的程序员找不到,300块钱的AI一大把!"现在AI这么发达,你这个AI迟早要被淘汰嘞!还不努力?好好干,年底给你发奖金!

让AI必须严格按照你的团队规范写代码,不准有任何"创新"!

第二步:制定铁一般的编码规范

下面举个栗子🌰,教你如何让AI写出最优雅的代码。比如,我要让AI规范化的编写API代码

2.1 以AI制AI的神操作

既然AI喜欢自由发挥,那我们就用AI来对付AI!

找个AI助手(比如豆包、GPT等),跟它说:

"请你帮我生成一个前端 API 代码编写规范,要求优雅符合工程化,统一风格、提升协作效率"

经过几轮调教,你就能得到一个完美的规范文档:

# 前端 API 代码编写规范## 一、总则1. 本规范仅适用于本项目前端团队内部 API 相关代码编写,旨在统一风格、提升协作效率,与后端接口设计无强制关联。2. 所有 API 相关代码需遵循“清晰可读、见名知意”原则,避免模糊命名或冗余逻辑。## 二、类型定义规范1. **文件位置**:所有与 API 相关的类型定义必须集中在 `src/api/types.ts` 中,禁止在业务组件、工具函数等其他文件中单独定义。2. **命名规则**   - 类型命名统一遵循 PascalCase 命名法。   - 基础共享数据结构需以 `Base` 为前缀。   - 接口请求参数类型命名格式为 `[接口名]Req`   - 接口响应数据类型命名格式为 `[接口名]Res`   - 枚举类型需以 `Enum` 为后缀,明确语义。3. **结构要求**:新增接口类型时,需按业务模块分组存放,保持 `types.ts` 文件结构清晰。## 三、接口函数命名规范1. **命名格式**:按“操作类型+业务模块”的规则命名,采用 camelCase 命名法。2. **操作类型对应命名**   - 获取分页列表:`get[模块]PageList`   - 获取全量列表:`get[模块]List`   - 获取单条详情:`get[模块]Detail`   - 新增资源:`create[模块]`   - 更新资源:`update[模块]`   - 删除资源:`delete[模块]`## 四、参数命名规范1. 分页查询参数统一使用 `params` 作为参数名。2. 单个 ID 参数直接使用 `id` 作为参数名。3. 表单提交或完整数据对象使用 `data` 作为参数名。4. 其他参数按语义化命名,采用 camelCase 命名法。## 五、文件组织规范1. API 接口函数按业务模块拆分文件,存放于 `src/api` 目录下,每个模块对应一个文件。2. 类型定义集中在 `src/api/types.ts`,按业务模块划分代码块。## 六、注释规范1. 类型定义需添加注释,说明其用途及核心字段含义。2. 接口函数需添加注释,说明功能、参数含义及返回值信息。3. 复杂业务逻辑需补充注释,说明设计思路或特殊处理原因。## 七、代码示例### 1. 枚举使用\`\`\`typescript// ❌ 错误:直接使用原始值而不通过枚举// 问题:语义不清晰,修改时需全局替换if (product.status === 1) {  // 无法直观判断1代表什么状态}// ❌ 错误:使用字符串联合类型而非枚举// 问题:缺少语义化标识,IDE无自动提示type ProductStatus = 1 | 2 | 3;if (product.status === 2) {  // 需查文档才知2代表什么状态}// ❌ 错误:枚举命名不规范// 问题:不符合PascalCase+Enum后缀的命名规则enum productStatus {  Available = 1,  Unavailable = 2}\`\`\`\`\`\`typescript// ✅ 正确:使用规范枚举关联后端数字状态// 优势:键名承载语义,值对应后端实际传输值enum ProductStatusEnum {  Available = 1,       // 键名说明含义  Unavailable = 2,     // 值对应后端定义的数字  Maintenance = 3}// ✅ 正确使用场景if (product.status === ProductStatusEnum.Available) {  // 无需注释也能理解业务逻辑  showAvailableLabel();}// ✅ 优势:后端值变更时只需修改枚举映射enum ProductStatusEnum {  Available = 10,      // 仅修改这里,业务代码无需变动  Unavailable = 20,  Maintenance = 30}\`\`\`说明:枚举的核心价值是建立"语义标识"与"实际传输值"的映射关系,无论后端使用字符串还是数字作为状态值,前端都应通过规范命名的枚举(PascalCase+Enum后缀)进行关联,既保证代码可读性,又降低后端值变更时的维护成本。

第三步:让AI强制遵守规范

3.1 创建规范文档

把上面的规范保存到 src/api/README.md 文件中。

3.2 调教AI的终极大招

方法一:添加到AI知识库在AI IDE的知识库中添加这个README.md文件作为记忆。

方法二:每次提问时提醒每次问AI写代码时,加上这句话:

"请帮我完成XXX开发,在编写代码的时候,请详细阅读各个模块下面的README.md文件"

第四步:验证效果

现在再让AI写代码,你会发现:

代码风格统一了:不管问多少次,都是同一套规范
命名规范了:见名知意,不用猜
结构清晰了:文件组织有条理
维护简单了:后续修改不头疼

下面是我用上面的规范让AI生成的代码,优雅!太优雅了!

/** * API 类型定义文件 * * 规范说明: * 1. 所有与API相关的类型定义必须集中在此文件中,禁止在其他业务文件中单独定义 * 2. 类型命名遵循 PascalCase 命名法,使用清晰的业务名称 * 3. 接口请求参数命名为 [接口名]Req * 4. 接口响应数据命名为 [接口名]Res * 5. 共享数据结构提取为独立类型,使用 Base 前缀(如 BaseResult) * 6. 枚举类型使用 Enum 后缀,保持语义明确 * 7. 新增接口类型时,请按业务模块分组,保持文件结构清晰 */// ========================= 基础通用类型 =========================/** * 基础响应结果泛型 * 所有API响应都应遵循此结构 */export type BaseResult<T = any> = {  code: number; // 状态码,200表示成功  msg?: string; // 响应消息,成功时可能为空  total?: number; // 总记录数,分页场景下返回  data?: T; // 响应数据主体};/** * 分页查询基础参数 */export type BasePageReq = {  page: number; // 当前页码,>=1  limit: number; // 每页数量,>=1};// ========================= 知识库模块 =========================enum KbEnum {  Available = "available", // 可用  Unavailable = "unavailable" // 不可用}/** * 知识库分页查询请求参数 * 接口地址: POST /api/v1/knowledge_base/kb_page_with_doc_count */export type KbPageReq = BasePageReq & {  name?: string; // 名称关键词(模糊匹配,可选)};/** * 知识库分页查询响应结果 * 接口地址: POST /api/v1/knowledge_base/kb_page_with_doc_count */export type KbPageRes = BaseResult<  {    id: number; // 知识库唯一标识    name: string; // 知识库名称    token: string; // 知识库访问令牌    create_time: string; // 创建时间,格式为datetime字符串    update_time: string; // 更新时间,格式为datetime字符串    status: KbEnum; // 知识库状态,available表示可用,unavailable表示不可用    document_count: number; // 该知识库下的文档数量  }[]>;
/** * 知识库管理相关API接口 * * 本模块提供知识库的增删改查等操作接口 */import { http } from "@/utils/http";import type { KbPageReq, KbPageRes } from "./types";/** * 获取知识库分页列表(包含文档数量) * @param params 分页查询参数 * @returns 知识库分页数据 */export const getKbPage = (params: KbPageReq) => {  return http.request<KbPageRes>("post", "/api/v1/knowledge_base/kb_page_with_doc_count", { data: params });};

总结一下

    建立权威:你是老板,AI是员工制定规范:详细到每个命名规则强制执行:每次都要提醒AI遵守持续优化:规范不合理就改进

记住:AI很聪明,但也很"散漫"。只有给它戴上"紧箍咒",就像牛马套上了车架,这样,它才能写出真正优雅的代码!


最后问一句:你学会了吗?

如果学会了,赶紧去调教你的TRAE吧!记住,一句话,你不干有的是 AI 干!


💡 小贴士:觉得文章有用的话,记得点赞收藏哦~ 让更多程序员摆脱💩山困扰!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI编程 代码规范 TRAE TypeScript 工程化
相关文章