Update from Sync Service
This commit is contained in:
153
AI工程/概念/打样工程.md
Executable file
153
AI工程/概念/打样工程.md
Executable file
@@ -0,0 +1,153 @@
|
||||
# 打样工程
|
||||
|
||||
> 相关:[[Harness工程]]、[[上下文体系]]、[[技术规格DSL]]
|
||||
|
||||
## 定义
|
||||
|
||||
**打样工程**是提供代码模版和示例,让AI参考生成代码的工程实践。
|
||||
|
||||
**核心思想**:让AI"抄作业",而不是自由发挥,保证代码风格统一、质量稳定。
|
||||
|
||||
## 核心原则
|
||||
|
||||
1. **约定大于配置**:通过模版约定代码风格
|
||||
2. **编排逻辑和原子能力分离**:Controller、Service、Repository职责明确
|
||||
3. **操作者和被操作对象分离**:分层清晰
|
||||
|
||||
## 常见工序
|
||||
|
||||
### 1. 简单CRUD(无复用逻辑)
|
||||
```
|
||||
Controller + Command → AppService → Repository → Response对象
|
||||
```
|
||||
|
||||
**示例**:
|
||||
```java
|
||||
// Controller
|
||||
@PostMapping("/users")
|
||||
public Response<UserResponse> createUser(@Valid @RequestBody CreateUserCommand cmd) {
|
||||
return Response.success(userAppService.create(cmd));
|
||||
}
|
||||
|
||||
// AppService
|
||||
public UserResponse create(CreateUserCommand cmd) {
|
||||
User user = userRepository.save(User.from(cmd));
|
||||
return UserResponse.from(user);
|
||||
}
|
||||
|
||||
// Repository
|
||||
public User save(User user) {
|
||||
userMapper.insert(user);
|
||||
return user;
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 复杂CRUD(有复用逻辑)
|
||||
```
|
||||
Controller + Command → AppService → DomainService → Repository → Response对象
|
||||
```
|
||||
|
||||
**示例**:
|
||||
```java
|
||||
// AppService - 编排逻辑
|
||||
public UserResponse create(CreateUserCommand cmd) {
|
||||
// 1. 校验用户名唯一
|
||||
domainService.checkUsernameUnique(cmd.getUsername());
|
||||
// 2. 加密密码
|
||||
String encryptedPassword = domainService.encryptPassword(cmd.getPassword());
|
||||
// 3. 保存用户
|
||||
User user = User.from(cmd, encryptedPassword);
|
||||
userRepository.save(user);
|
||||
// 4. 发送欢迎邮件
|
||||
domainService.sendWelcomeEmail(user);
|
||||
return UserResponse.from(user);
|
||||
}
|
||||
|
||||
// DomainService - 原子能力
|
||||
public void checkUsernameUnique(String username) {
|
||||
if (userRepository.existsByUsername(username)) {
|
||||
throw new BusinessException("用户名已存在");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 复杂查询
|
||||
```
|
||||
Controller + Query对象 → AppService → QueryPO(或复用PO)→ Response对象
|
||||
```
|
||||
|
||||
**示例**:
|
||||
```java
|
||||
// Controller
|
||||
@GetMapping("/users")
|
||||
public Response<Page<UserResponse>> listUsers(@Valid UserQuery query) {
|
||||
return Response.success(userAppService.list(query));
|
||||
}
|
||||
|
||||
// AppService
|
||||
public Page<UserResponse> list(UserQuery query) {
|
||||
Page<UserPO> page = userRepository.findByQuery(query);
|
||||
return page.map(UserResponse::from);
|
||||
}
|
||||
|
||||
// Repository
|
||||
public Page<UserPO> findByQuery(UserQuery query) {
|
||||
// 构建查询条件
|
||||
// 执行分页查询
|
||||
// 返回分页结果
|
||||
}
|
||||
```
|
||||
|
||||
## 三层架构
|
||||
|
||||
### Controller层
|
||||
- **职责**:接收请求、参数校验、调用Service
|
||||
- **输入**:Command/Query对象
|
||||
- **输出**:Response对象
|
||||
- **不包含业务逻辑**
|
||||
|
||||
### Service层
|
||||
- **AppService**:应用服务,编排逻辑
|
||||
- **DomainService**:领域服务,复杂业务逻辑
|
||||
- **职责**:编排业务逻辑、调用DomainService/Repository
|
||||
|
||||
### Repository层
|
||||
- **职责**:数据持久化
|
||||
- **输入**:实体对象
|
||||
- **输出**:实体对象或PO
|
||||
|
||||
## 参考代码
|
||||
|
||||
- **DDD微服务示例**:https://github.com/domain-driven-design/ddd-microservices
|
||||
|
||||
## 为什么需要打样工程
|
||||
|
||||
- **AI生成代码质量不稳定**:需要模版约束
|
||||
- **不同AI工具风格不同**:需要统一风格
|
||||
- **AI不知道最佳实践**:需要沉淀最佳实践
|
||||
|
||||
## 优势
|
||||
|
||||
1. **提高代码质量**:基于模版生成,质量有保障
|
||||
2. **统一代码风格**:所有代码遵循相同的风格
|
||||
3. **减少Review成本**:代码符合规范,Review更快
|
||||
4. **知识沉淀**:最佳实践沉淀在模版中
|
||||
|
||||
## 挑战
|
||||
|
||||
- **初始成本**:需要建立打样工程
|
||||
- **维护成本**:需要持续维护模版
|
||||
- **灵活性**:模版可能限制创新
|
||||
|
||||
## 最佳实践
|
||||
|
||||
1. **建立打样工程**:提供标准的代码模版
|
||||
2. **分层清晰**:Controller、Service、Repository职责明确
|
||||
3. **工序标准化**:简单CRUD、复杂CRUD、复杂查询各有标准
|
||||
4. **AI参考打样**:让AI根据打样工程生成代码
|
||||
|
||||
## 相关概念
|
||||
|
||||
- [[Harness工程]]:打样工程是Harness的组成部分
|
||||
- [[上下文体系]]:打样工程是上下文体系的组成部分
|
||||
- [[技术规格DSL]]:打样工程使用技术规格DSL
|
||||
Reference in New Issue
Block a user