code-patterns

SKILL.md

编码规范指南

通用模板。如果项目有专属技能(如 leniu-code-patterns),优先使用。

核心规范

RESTful API 设计

操作 HTTP 方法 URL 示例 说明
创建 POST /api/v1/orders 请求体传参
查询列表 GET /api/v1/orders Query 参数分页
查询详情 GET /api/v1/orders/{id} 路径参数
全量更新 PUT /api/v1/orders/{id} 请求体传参
部分更新 PATCH /api/v1/orders/{id} 请求体传参
删除 DELETE /api/v1/orders/{id} 路径参数

URL 规范

  • 使用名词复数:/orders 而非 /order
  • 使用小写连字符:/order-items 而非 /orderItems
  • 版本号放 URL 前缀:/api/v1/
  • 嵌套资源不超过两层:/orders/{id}/items

命名规范

类型 风格 示例
类名 UpperCamelCase OrderService, UserController
方法名 lowerCamelCase createOrder(), getUserById()
变量名 lowerCamelCase orderNo, userName
常量 UPPER_SNAKE_CASE MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE
包名 全小写 com.example.order
数据库表/字段 lower_snake_case t_order, order_no

类命名约定

后缀 用途 示例
Controller 控制器 OrderController
Service / ServiceImpl 服务层 OrderServiceImpl
Mapper / Repository 数据访问 OrderMapper
DTO 请求参数 OrderCreateDTO
VO 响应对象 OrderVO
Enum 枚举 OrderStatusEnum
Config 配置类 RedisConfig
Handler 处理器 GlobalExceptionHandler
Interceptor 拦截器 AuthInterceptor
Utils / Helper 工具类 DateUtils

方法命名约定

前缀 含义 示例
create / add 创建 createOrder()
update / modify 更新 updateStatus()
delete / remove 删除 deleteById()
get / find / query 查询 getById(), findByName()
list 查询列表 listByStatus()
page 分页查询 pageQuery()
count 计数 countByStatus()
is / has / can 布尔判断 isValid(), hasPermission()
check / validate 校验 checkDuplicate()
convert / to 转换 convertToVO(), toDTO()

Git 提交规范(Conventional Commits)

<type>(<scope>): <subject>

<body>

<footer>
type 说明
feat 新功能
fix 修复 Bug
docs 文档变更
style 代码格式(不影响逻辑)
refactor 重构(非新功能、非修复)
perf 性能优化
test 测试相关
chore 构建/工具变更

示例

feat(order): 新增订单导出功能

支持按时间范围导出订单数据为 Excel 格式。

Closes #123

数据类型规范

布尔语义字段必须使用 Boolean

// ❌ 错误
private Integer ifNarrow;
private Integer isEnabled;

// ✅ 正确
private Boolean narrow;     // getter 自动生成 isNarrow()
private Boolean enabled;    // getter 自动生成 isEnabled()

规则

  • 语义为"是/否"的字段,类型必须为 Boolean
  • 字段名不加 if/is/has 前缀(JavaBean 规范中 Boolean 的 getter 自动生成 isXxx()
  • 数据库字段使用 TINYINT(1)BIT(1)

枚举字段必须提供明确约束

// ❌ 错误:调用方无法知道合法值
@ApiModelProperty(value = "操作类型")
private Integer tradeType;

// ✅ 方案一:VO/DTO 层直接用枚举(推荐)
@ApiModelProperty(value = "操作类型")
private AccTradeTypeEnum tradeType;

// ✅ 方案二:保留 Integer 但标注合法值
@ApiModelProperty(value = "操作类型:1-充值 2-消费 3-退款", allowableValues = "1,2,3")
private Integer tradeType;

金额字段禁止使用浮点类型

// ❌ 错误
private Double amount;
private Float price;

// ✅ 正确:Entity/Service 层用 Long(分),VO 层展示用 BigDecimal(元)
private Long amountFen;
private BigDecimal amountYuan;

原始类型 vs 包装类型

场景 用原始类型 用包装类型
Entity / VO / DTO 字段 ✅ 统一用包装类型
方法参数(不允许 null) int count
方法参数(允许 null) Integer count
局部变量 int i = 0

Optional 使用规范

// ❌ 错误:of() 不接受 null,value 为 null 直接 NPE
Optional.of(value).orElse(defaultValue);

// ✅ 正确:ofNullable() 安全处理 null
Optional.ofNullable(value).orElse(defaultValue);

// ❌ 禁止:Optional 作为方法参数或类字段
public void process(Optional<String> name) { ... }
private Optional<String> name;

// ✅ 允许:Optional 作为方法返回值、链式处理
public Optional<Entity> findById(Long id) { ... }
Optional.ofNullable(entity).map(Entity::getConfig).orElse(DEFAULT_VALUE);

@Transactional 规范

// ❌ 错误:默认只回滚 RuntimeException
@Transactional
public void createOrder() { ... }

// ✅ 正确:显式指定回滚异常
@Transactional(rollbackFor = Exception.class)
public void createOrder() { ... }
  • 所有 @Transactional 必须显式写 rollbackFor = Exception.class
  • 只读查询不加 @Transactional(或用 readOnly = true
  • 事务方法不要 try-catch 吞掉异常,否则事务不回滚

TODO 管理规范

// ❌ 错误:无负责人、无日期、无跟踪
// TODO 修改一下

// ✅ 正确:完整 TODO 格式
// TODO(@陈沈杰, 2026-03-20, #TASK-1234): 移动端 AppId 赋值逻辑待产品确认
  • 每个 TODO 必须有对应的任务号
  • 超过 2 个迭代未处理的 TODO 必须清理
  • 不用的代码直接删除,不要注释保留

代码格式化规范

项目 规范
缩进 4 个空格(不用 Tab)
行宽 120 字符
大括号 K&R 风格(同行开始)
空行 方法间 1 个空行,逻辑块间 1 个空行
import 分组排序:java → jakarta → org → net → com,组间空行

代码示例

统一响应格式

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result<T> {
    private int code;
    private String message;
    private T data;

    public static <T> Result<T> ok(T data) {
        return new Result<>(200, "success", data);
    }

    public static <T> Result<T> fail(int code, String message) {
        return new Result<>(code, message, null);
    }
}

枚举定义规范

@Getter
@AllArgsConstructor
public enum OrderStatusEnum {

    PENDING(0, "待处理"),
    COMPLETED(1, "已完成"),
    CANCELLED(2, "已取消");

    private final int code;
    private final String desc;

    public static OrderStatusEnum of(int code) {
        for (OrderStatusEnum status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("未知状态码: " + code);
    }
}

常见错误

错误 正确做法
URL 用动词:/getOrder 用名词 + HTTP 方法:GET /orders/{id}
方法名含义不清:process() 明确动作:calculateTotalAmount()
魔法数字:if (status == 1) 用枚举或常量
一个方法超过 80 行 拆分为多个私有方法
注释描述"做了什么" 注释描述"为什么这样做"
Git 提交信息写"fix bug" 写清楚修了什么:fix(order): 修复金额计算精度丢失
Boolean 变量名:flag 有意义的名字:isActive, hasPermission
缩写命名:usr, mgr 完整命名:user, manager
Optional.of(可能null值) Optional.ofNullable(value)
@Transactional 无 rollbackFor @Transactional(rollbackFor = Exception.class)
TODO 无负责人和日期 // TODO(@负责人, 日期, #任务号): 描述
布尔字段用 Integer Boolean 类型
枚举字段无合法值说明 @ApiModelProperty 标注合法值或直接用枚举类型
Weekly Installs
4
GitHub Stars
8
First Seen
8 days ago
Installed on
github-copilot4
codex4
kimi-cli4
gemini-cli4
cursor4
amp4