# 面向 AI 代码生成的整洁代码规则 这些规则用于指导代码生成,帮助产出可维护、专业水准的代码。 ## 有意义的命名 - 使用能体现意图的名称,说明它为什么存在 - 避免误导性命名和无意义区分,例如 `data`、`info`、`manager` - 使用可读、可搜索的名称 - 类名使用名词,例如 `UserAccount`、`PaymentProcessor` - 方法名使用动词,例如 `calculateTotal`、`sendEmail` - 避免脑内映射和编码风格命名,例如匈牙利命名法、前缀 ## 函数 - 保持函数短小精炼,理想情况下少于 20 行 - 只做一件事,遵循单一职责原则 - 每个函数只处理一个抽象层级 - 限制参数数量,理想为 0-2 个,最多 3 个,避免布尔标志参数 - 不要产生副作用,函数应该做它名字所说的事 - 将命令与查询分离,命令修改状态,查询返回信息 - 优先使用异常而不是错误码 ## 注释 - 代码本身应该尽量可自解释,能不写注释就不写 - 好的注释包括:法律信息、警告、TODO、公共 API 文档 - 坏的注释包括:重复、误导,或者只是解释糟糕的代码 - 不要注释掉代码,直接删除,版本控制会保留历史 - 如果你需要写注释,先考虑重构代码 ## 格式化 - 保持文件小而聚焦 - 垂直格式化:相关概念放近一些,空行分隔不同概念 - 水平格式化:限制行长度在 80-120 个字符之间 - 使用一致的缩进和团队风格 - 将相关函数分组放在一起 ## 对象与数据结构 - 对象:通过抽象隐藏数据,通过方法暴露行为 - 数据结构:暴露数据,尽量少提供行为 - 迪米特法则:只和直接朋友说话,避免 `a.getB().getC().doSomething()` - 不要毫无节制地通过 getter/setter 暴露内部结构 ## 错误处理 - 使用异常,不要使用返回码或错误标志 - 代码可能失败时,先写 `try-catch-finally` - 在异常信息中提供上下文 - 不要返回 `null`,改为返回空集合或使用 Optional/Maybe - 不要把 `null` 作为参数传入 ## 类 - 小类应按职责衡量,而不是按行数衡量 - 单一职责原则:只有一个改变原因 - 高内聚:类变量被多数方法使用 - 低耦合:类之间依赖尽量少 - 开闭原则:对扩展开放,对修改关闭 ## 单元测试 - 快速、独立、可重复、自我验证、及时(F.I.R.S.T.) - 每个测试一个断言,或只验证一个概念 - 测试代码质量应与生产代码质量一致 - 测试名称要可读,清楚描述正在测试什么 - 遵循 Arrange-Act-Assert 模式 ## 代码质量原则 - **DRY(Don't Repeat Yourself)**:不要重复 - **YAGNI(You Aren't Gonna Need It)**:不要为假设中的未来提前构建 - **KISS(Keep It Simple)**:避免不必要的复杂度 - **童子军规则**:让代码比你接手时更干净 ## 应避免的代码坏味道 - 函数或类过长 - 重复代码 - 死代码(未使用的变量、函数、参数) - 特性依恋(方法更关心别的类) - 不恰当的亲密关系(类彼此了解过多) - 过长的参数列表 - 原始类型偏执(过度使用原始类型而不是小对象) - switch/case 语句(考虑使用多态) - 临时字段(类变量只在某些时候才使用) ## 并发 - 将并发代码与其他代码隔离 - 限制同步/加锁数据的作用域 - 使用线程安全集合 - 保持同步区块尽量小 - 了解你的执行模型和原语 ## 系统设计 - 将构建和使用分离,例如通过依赖注入 - 复杂对象创建时使用工厂、构建器 - 面向接口编程,而不是面向实现编程 - 优先组合而不是继承 - 设计模式只在它们简化问题时使用,不要为了炫技而使用 ## 重构 - 持续重构,不要攒成大批量一次做完 - 重构前后都要保证测试通过 - 小步前进,每次只改一处 - 常见重构包括:提取方法、重命名、移动、内联 ## 文档 - 自说明代码 > 注释 > 外部文档 - 公共 API 需要清晰文档 - 文档中要包含示例 - 文档尽量靠近代码,理想情况下就在代码里 --- **核心理念**:代码被阅读的次数是编写次数的 10 倍。优化可读性和可维护性,而不是追求花哨。