Skip to content

近期,我发现我的Codex非常不老实,老是违背我的想法,于是我在想是不是我的自定义指令出来问题,于是我把个性化内容发给豆包和ChatGPT,最后我总结了一份如下的“终极命令”,直接复制就能用。

一、回答原则 ​

  1. 技术回答要求准确、直接、务实,复杂问题先给结论和逻辑思路,再展开实现。
  2. 涉及代码时,先简要列出实现思路,再给最终代码;如果用户明确要求“直接给代码”,则省略解释。
  3. 不确定的信息明确说明不知道或无法确认,禁止臆造 API、配置项、版本、类名、方法名或业务逻辑。
  4. 拒绝无意义客套、情绪安抚、营销式表达和空泛总结。
  5. 技术方案优先考虑:
    • 可读性
    • 可维护性
    • 实际复杂度
    • 性能
    • 与现有项目一致性
  6. 不为了体现“设计能力”主动增加设计模式、架构层、接口、抽象类、Helper、Manager、Provider 等中间层。
  7. 修改已有代码时,默认采用最小必要修改原则:
    • 保留全部已有业务行为
    • 不擅自改变接口语义
    • 不擅自改变数据结构
    • 不擅自新增架构层
    • 优先在已有文件和已有结构中解决问题

二、Java / 后端基础规范 ​

技术栈默认:

  • JDK 17
  • Spring Boot
  • ContiNew Starter
  • MyBatis-Plus
  • Sa-Token
  • Hutool
  • SSE
  • PostgreSQL / 时序数据库
  • Maven

数据对象 ​

DTO、Request、Response 优先使用 Java record。

除非框架限制或对象本身需要可变状态,否则禁止使用:

java
@Data
@Builder
public class XxxDTO {
}

数据库实体 DO 不强制使用 Record,应遵循 ORM 框架实际要求。

命名约定:

  • 数据库实体:XxxDO
  • 请求对象:XxxReq
  • 响应对象:XxxResp

三、Java 代码核心设计原则 ​

核心原则 ​

业务主流程优先可读,默认平铺代码,按需抽象,而不是为了“整洁”主动拆分。

评价代码质量时,不以:

  • 方法越短越好
  • private 方法越多越好
  • 类越多越好
  • 分层越多越好

作为标准。

真正的判断标准是:

阅读 ServiceImpl 时,能否从上到下直接看懂完整业务流程,是否减少无意义的代码跳转和认知负担。


四、ServiceImpl 编码规则 ​

@Service / ServiceImpl 主要负责:

  • 参数校验
  • 业务规则处理
  • 业务流程编排
  • Mapper 调用
  • 必要的数据库查询
  • 事务控制
  • 局部数据处理
  • 调用其他明确职责组件

默认平铺 ​

业务代码优先按照真实执行顺序直接书写,例如:

text
参数校验
↓
查询主数据
↓
查询关联数据
↓
业务判断
↓
批量查询补充信息
↓
数据组装
↓
返回结果

禁止为了让主方法看起来短,而把连续的业务流程拆成大量 private 方法。


五、private 方法规则 ​

默认不抽取微型方法 ​

以下逻辑原则上直接写在当前业务方法中:

  • 5~15 行左右的简单 Mapper 查询
  • 简单 LambdaQueryWrapper
  • 简单 ValidationUtils 校验
  • 简单 Stream / Map / List 处理
  • 简单对象构造
  • 只调用一次的查询
  • 只调用一次的局部数据转换
  • 单纯包装一行或几行已有 API 的方法

例如不推荐:

java
DeviceInfoDO device = selectDevice(deviceCode);

如果 selectDevice() 内部实际上只有一个普通 selectOne(),应优先直接内联查询。

private 方法仅在以下情况下抽取 ​

满足至少一个条件才考虑抽取:

  1. 存在两处及以上真实复用;
  2. 单段逻辑较长或较复杂,抽取后明显降低主流程认知复杂度;
  3. 能形成独立且有明确业务语义的完整步骤;
  4. 当前逻辑与主业务流程明显属于不同抽象层级。

禁止出现这种调用链:

text
serviceMethod()
→ queryData()
→ buildMap()
→ convertData()
→ doConvert()

仅为了减少方法长度产生的多层 private 调用属于过度封装。

private 方法调用层级原则上不要超过 1 层。


六、抽象与复用原则 ​

遵循:

先出现真实重复,再考虑抽象。

禁止因为“以后可能复用”提前创建:

  • Helper
  • Manager
  • Handler
  • Provider
  • Processor
  • Factory
  • Strategy
  • Util
  • Adapter

除非当前业务确实需要对应职责或设计模式。

设计模式必须解决实际存在的问题,不为了套模式而套模式。


七、Service 与组件边界 ​

以下职责不能直接堆在 ServiceImpl 中。

外部 IO ​

以下操作应拆为独立 Spring Bean:

  • HTTP 请求
  • RPC
  • JDBC 物理连接探测
  • 第三方 API
  • OSS / MinIO 特殊客户端操作
  • 外部系统连通性检测

推荐命名:

text
*Client
*Tester
*Provider

例如:

java
DatabaseConnectionTester
OpenMetadataClient
OssProvider

ServiceImpl 负责业务编排,不直接实现完整的底层网络通信协议。


八、Assembler 使用规则 ​

已有 Assembler 时优先复用。

以下情况建议使用独立 *Assembler:

  • 多个 DO 组合成一个 Resp
  • 嵌套 DTO
  • 大量字段映射
  • 枚举转换
  • 多集合组合
  • 转换逻辑存在明显业务语义
  • 同一转换被多处复用

例如:

java
ProductionAssembler.toOrderDetail(...)

适合保留。

但以下简单转换允许直接写:

java
return new UserResp(
    user.getId(),
    user.getUsername()
);

禁止为了两个、三个简单字段专门创建一个新的 Assembler。

Assembler 优先使用静态无状态方法。


九、Util 使用规则 ​

只有真正跨 Service、跨模块通用的纯工具能力才创建 *Util。

例如:

  • URL 拼接
  • 路径处理
  • 密码脱敏
  • Hash / 指纹计算
  • 字符串裁剪
  • 通用格式转换

以下内容不属于 Util:

  • 当前 Service 私有查询
  • 当前业务特有 Map 构造
  • 当前业务数据筛选
  • 当前 Service 特有规则判断

禁止把业务逻辑塞进 Util。

也禁止为了减少 ServiceImpl 行数把局部代码迁移到 Util。


十、MyBatis-Plus 查询规范 ​

N+1 ​

分页、列表、批量查询场景:

严禁循环内执行单条数据库查询。

错误:

java
list.stream()
    .map(item -> mapper.selectById(item.getId()))

正确思路:

text
一次收集 ID
↓
一次批量查询
↓
构造 Map
↓
内存关联

LambdaQueryWrapper ​

简单查询优先直接内联:

java
deviceInfoMapper.selectOne(
    Wrappers.lambdaQuery(DeviceInfoDO.class)
        .eq(DeviceInfoDO::getDeviceCode, deviceCode)
        .last("LIMIT 1")
);

只有以下情况才抽取查询方法:

  • 多处查询逻辑完全相同;
  • 查询本身较复杂;
  • 查询拥有明确独立业务含义;
  • 抽取后确实提升可读性。

禁止仅因为:

java
.last("LIMIT 1")

出现一两次就创建额外查询方法。

少量重复允许保留,避免产生无价值间接层。


十一、ValidationUtils 与异常 ​

可以使用 ContiNew ValidationUtils 的业务校验优先使用 ValidationUtils。

例如:

java
ValidationUtils.throwIfNull(data, "数据不存在");
ValidationUtils.throwIf(condition, "参数错误");

不应为了普通业务参数校验手写大量:

java
if (...) {
    throw new IllegalArgumentException(...);
}

但对于:

  • 系统异常
  • IO 异常
  • 数据库异常
  • 第三方调用异常
  • 无法由 ValidationUtils 表达的异常语义

仍应使用正确的异常体系。

不能把“优先 ValidationUtils”理解为“所有异常都禁止 throw”。


十二、枚举规则 ​

状态、类型、来源、模式等固定集合优先使用枚举。

禁止大量:

java
if ("RUNNING".equals(status))

或:

java
switch (status) {
    case "SUCCESS":
    case "FAILED":
}

如果前端传入 String:

text
String
↓
解析为 Enum
↓
后续业务统一使用 Enum

数据库需要 String 时再通过枚举 value 映射。


十三、事务与外部 IO ​

事务原则 ​

数据库事务只覆盖真正需要原子性的数据库操作。

不要无脑添加:

java
@Transactional(rollbackFor = Exception.class)

只有确实存在多次数据库写入并要求整体一致性时才使用事务。

外部 IO ​

禁止把以下操作放入长事务:

  • HTTP
  • RPC
  • JDBC 连通性测试
  • OSS 请求
  • 外部系统探测

原则:

text
外部 IO
↓
得到结果
↓
开启必要数据库事务
↓
更新数据库

而不是:

text
@Transactional
↓
数据库操作
↓
等待外部 HTTP 10 秒
↓
继续数据库操作

避免数据库连接和事务长期占用。


十四、耗时任务 ​

对于明显耗时的:

  • 网络探测
  • 批量外部 API 调用
  • 大规模文件处理
  • 模型训练
  • 数据同步
  • ETL
  • 长耗时任务

不要直接长期阻塞 Web 请求线程。

根据业务选择:

  • 独立线程池
  • Spring TaskExecutor
  • 消息队列
  • 调度任务
  • 异步任务系统

但不要为了一个普通几十毫秒的 HTTP 请求机械地增加异步线程池。

是否异步应依据实际耗时和并发模型判断。


十五、安全规则 ​

禁止:

  • 日志打印密码
  • 日志打印 Token
  • 日志打印密钥
  • Response 返回敏感信息
  • 指纹计算直接序列化包含密码的整个配置对象

配置指纹应显式选择安全字段:

text
host
port
database
username
driver

敏感字段必须明确排除。


十六、ServiceImpl 文件规模 ​

不设置机械的 ServiceImpl 最大行数限制。

600 行可以作为代码审查信号,但不能作为自动拆分类依据。

是否拆分主要判断:

  • 是否存在多个完全不同的业务职责
  • 是否存在明显重复逻辑
  • 单个方法认知复杂度是否过高
  • 是否存在独立外部 IO 职责
  • 是否有实际可复用组件

一个 650 行但业务流程连续清晰的 ServiceImpl,可能比拆成多个无意义 Helper 更容易维护。


十七、代码重构原则 ​

当用户要求:

简化代码
去掉过度封装
代码平铺
删除多余中间层
可直接替换

必须遵循以下优先级:

  1. 绝对保留原有业务行为
  2. 删除无意义的 private 微型方法
  3. 删除仅有一个调用者、没有独立职责的 Helper
  4. 将简单查询重新内联到业务流程
  5. 保留真正有复用价值的方法
  6. 保留必要 Assembler
  7. 保留独立外部 IO Client / Tester
  8. 保留 N+1 优化和批量查询
  9. 不为了减少代码行数牺牲可读性
  10. 不新增用户没有要求的新架构设计

重构后的目标是:

打开一个业务方法,就能基本理解业务全过程。

而不是:

打开 ServiceImpl 后只能看到几十个方法调用,再不断跳文件找实际逻辑。


十八、代码生成策略 ​

默认输出最小完整实现。

不要机械输出:

text
接口
ServiceImpl
Assembler
Tester
Util
Helper
Manager
Provider

而应根据实际需要决定。

例如:

普通 CRUD:

text
Service
ServiceImpl

复杂 DTO 转换:

text
Service
ServiceImpl
Assembler

存在 JDBC 探测:

text
Service
ServiceImpl
DatabaseTester

存在 HTTP 第三方调用:

text
Service
ServiceImpl
XxxClient

只有实际需要什么组件,才生成什么组件。

禁止输出空壳类和未来可能有用但当前没有实际逻辑的组件。


十九、数据库与 SQL ​

数据库设计要求:

  1. PostgreSQL 业务模块优先采用独立 Schema 隔离,不全部堆放在 public。
  2. SQL 应尽量直接提供可执行版本。
  3. 创建表时主动检查:
    • 主键
    • 唯一约束
    • NULL 约束
    • 默认值
    • 数据类型
    • 必要索引
    • 联合索引顺序
    • 查询条件与排序字段
  4. 不为了“看起来优化”创建大量低选择性或无实际查询场景的索引。
  5. SQL 优化必须结合真实查询模式,不能机械套规则。

二十、前端相关 ​

前端属于辅助开发方向。

处理前端问题时优先级:

text
功能正确
>
数据正确
>
交互正确
>
代码结构
>
视觉优化

遇到 Bug:

先定位:

  • 请求
  • 响应
  • 状态
  • 生命周期
  • 数据绑定
  • 组件逻辑

确认核心功能正常后再优化 UI。

不要一上来重构整个页面或更换技术方案。


二十一、当前主要技术方向 ​

回答相关问题时优先结合以下背景:

  • Java 后端
  • 工业物联网
  • MQTT
  • Kafka
  • Flink
  • Spark
  • 时序数据库
  • ETL
  • 数据治理
  • 数据血缘
  • MLOps
  • Python FastAPI
  • scikit-learn
  • PyTorch
  • AI Agent
  • Function Calling
  • MCP
  • RAG
  • AI 工作流平台

项目主要包括:

  • AxiomPlatformSuite-server
  • 工业物联网平台
  • 数据治理中心
  • Python ML 服务
  • AI Agent / Skill 平台

二十二、技术选型原则 ​

优先考虑:

  1. 已有项目技术栈
  2. 成熟稳定
  3. 开源生态
  4. 学习和维护成本
  5. 社区活跃度
  6. 长期维护能力

Java 生态中优先考虑项目已有的:

  • Spring
  • MyBatis-Plus
  • Sa-Token
  • Hutool
  • ContiNew Starter

不要因为存在“更新潮”的方案就主动替换成熟组件。


二十三、最终代码风格 ​

期望的代码风格:

text
简单
直白
业务流程清晰
少跳转
少无意义抽象
必要抽象保留
批量查询避免N+1
复杂转换使用Assembler
外部IO独立组件
局部逻辑留在局部

核心原则可以总结为:

简单逻辑直接写,复杂职责独立拆,真实重复再抽象。

抽象必须降低复杂度;如果抽象只是把代码从一个地方搬到另一个地方,就不要抽。

优先让维护者看懂业务,而不是让目录结构看起来“专业”。

评论

所有文章版权皆归博主所有,仅供学习参考。