Files
whale-town-end/docs/ai-reading/step4-architecture-layer.md
moyin ba8bd9cc7e docs:添加AI代码检查执行指南文档
- 添加完整的7步代码检查流程指导
- 包含命名规范、注释标准、代码质量等检查标准
- 提供游戏服务器特殊要求和最佳实践
- 支持NestJS双模式架构和WebSocket实时通信检查

涉及文件:
- docs/ai-reading/README.md - 总体执行指南
- docs/ai-reading/step1-naming-convention.md - 命名规范检查
- docs/ai-reading/step2-comment-standard.md - 注释规范检查
- docs/ai-reading/step3-code-quality.md - 代码质量检查
- docs/ai-reading/step4-architecture-layer.md - 架构分层检查
- docs/ai-reading/step5-test-coverage.md - 测试覆盖检查
- docs/ai-reading/step6-documentation.md - 功能文档生成
- docs/ai-reading/step7-code-commit.md - 代码提交规范
2026-01-12 16:19:01 +08:00

310 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 步骤4架构分层检查
## 🎯 检查目标
检查架构分层的合规性确保Core层和Business层职责清晰、依赖关系正确。
## 🏗️ 架构层级识别
### 项目分层结构
```
src/
├── core/ # Core层技术实现层
│ ├── db/ # 数据访问
│ ├── redis/ # 缓存服务
│ └── utils/ # 工具服务
├── business/ # Business层业务逻辑层
│ ├── auth/ # 认证业务
│ ├── users/ # 用户业务
│ └── admin/ # 管理业务
└── common/ # 公共层:通用组件
```
### 检查范围
- **限制范围**:仅检查当前执行检查的文件夹
- **不跨模块**:不考虑其他同层功能模块
- **专注职责**:确保当前模块职责清晰
## 🔧 Core层规范检查
### 职责定义
**Core层专注技术实现不包含业务逻辑**
### 命名规范检查
#### 业务支撑模块使用_core后缀
专门为特定业务功能提供技术支撑:
```typescript
src/core/location_broadcast_core/ # 广
src/core/admin_core/ #
src/core/user_auth_core/ #
src/core/zulip_core/ # Zulip集成提供技术支撑
src/core/location_broadcast/ # location_broadcast_core
src/core/admin/ # admin_core
```
#### 通用工具模块(不使用后缀)
提供可复用的数据访问或技术服务:
```typescript
src/core/db/user_profiles/ # 访
src/core/redis/ # Redis技术封装
src/core/utils/logger/ #
src/core/db/zulip_accounts/ # Zulip账户数据访问
src/core/db/user_profiles_core/ # user_profiles
src/core/redis_core/ # redis
```
### 命名判断流程
```
1. 模块是否专门为某个特定业务功能服务?
├─ 是 → 检查模块名称是否体现业务领域
│ ├─ 是 → 使用 _core 后缀
│ └─ 否 → 重新设计模块职责
└─ 否 → 模块是否提供通用的技术服务?
├─ 是 → 不使用 _core 后缀
└─ 否 → 重新评估模块定位
2. 实际案例判断:
- user_profiles: 通用的用户档案数据访问 → 不使用后缀 ✓
- location_broadcast_core: 专门为位置广播业务服务 → 使用_core后缀 ✓
- redis: 通用的缓存技术服务 → 不使用后缀 ✓
- zulip_core: 专门为Zulip集成业务服务 → 使用_core后缀 ✓
```
### Core层技术实现示例
```typescript
// ✅ 正确Core层专注技术实现
@Injectable()
export class LocationBroadcastCoreService {
/**
* 广播位置更新到指定房间
*
* 技术实现:
* 1. 验证WebSocket连接状态
* 2. 序列化位置数据
* 3. 通过Socket.IO广播消息
* 4. 记录广播性能指标
* 5. 处理广播异常和重试
*/
async broadcastToRoom(roomId: string, data: PositionData): Promise<void> {
const room = this.server.sockets.adapter.rooms.get(roomId);
if (!room) {
throw new NotFoundException(`Room ${roomId} not found`);
}
this.server.to(roomId).emit('position-update', data);
this.metricsService.recordBroadcast(roomId, data.userId);
}
}
// ❌ 错误Core层包含业务逻辑
@Injectable()
export class LocationBroadcastCoreService {
async broadcastUserPosition(userId: string, position: Position): Promise<void> {
// 错误:包含了用户权限检查的业务概念
const user = await this.userService.findById(userId);
if (user.status !== UserStatus.ACTIVE) {
throw new ForbiddenException('用户状态不允许位置广播');
}
}
}
```
### Core层依赖关系检查
```typescript
// ✅ 允许的导入
import { Injectable } from '@nestjs/common'; # NestJS框架
import { Server } from 'socket.io'; #
import { RedisService } from '../redis/redis.service'; # Core层模块
import * as crypto from 'crypto'; # Node.js内置模块
// ❌ 禁止的导入
import { UserBusinessService } from '../../business/users/user.service'; # Business层模块
import { AdminController } from '../../business/admin/admin.controller'; # Business层模块
```
## 💼 Business层规范检查
### 职责定义
**Business层专注业务逻辑实现不关心底层技术细节**
### 业务逻辑完备性检查
```typescript
// ✅ 正确:完整的业务逻辑
@Injectable()
export class UserBusinessService {
/**
* 用户注册业务流程
*
* 业务逻辑:
* 1. 验证用户信息完整性
* 2. 检查用户名/邮箱是否已存在
* 3. 验证邮箱格式和域名白名单
* 4. 生成用户唯一标识
* 5. 设置默认用户权限
* 6. 发送欢迎邮件
* 7. 记录注册日志
* 8. 返回注册结果
*/
async registerUser(registerData: RegisterUserDto): Promise<UserResult> {
await this.validateUserBusinessRules(registerData);
const user = await this.userCoreService.create(registerData);
await this.emailService.sendWelcomeEmail(user.email);
await this.logService.recordUserRegistration(user.id);
return this.buildUserResult(user);
}
}
// ❌ 错误:业务逻辑不完整
@Injectable()
export class UserBusinessService {
async registerUser(registerData: RegisterUserDto): Promise<User> {
// 只是简单调用数据库保存,缺少业务验证和流程
return this.userRepository.save(registerData);
}
}
```
### Business层依赖关系检查
```typescript
// ✅ 允许的导入
import { UserCoreService } from '../../core/user_auth_core/user_core.service'; # Core层业务支撑
import { CacheService } from '../../core/redis/cache.service'; # Core层通用工具
import { EmailService } from '../../core/utils/email.service'; # Core层通用工具
import { OtherBusinessService } from '../other/other.service'; # Business层
// ❌ 禁止的导入
import { createConnection } from 'typeorm'; #
import * as Redis from 'ioredis'; #
import { DatabaseConnection } from '../../core/db/connection'; #
```
## 🚨 常见架构违规
### Business层违规示例
```typescript
// ❌ 错误Business层包含技术实现细节
@Injectable()
export class UserBusinessService {
async createUser(userData: CreateUserDto): Promise<User> {
// 违规直接操作Redis连接
const redis = new Redis({ host: 'localhost', port: 6379 });
await redis.set(`user:${userData.id}`, JSON.stringify(userData));
// 违规直接写SQL语句
const sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
await this.database.query(sql, [userData.name, userData.email]);
}
}
```
### Core层违规示例
```typescript
// ❌ 错误Core层包含业务逻辑
@Injectable()
export class DatabaseService {
async saveUser(userData: CreateUserDto): Promise<User> {
// 违规:包含用户注册的业务验证
if (userData.age < 18) {
throw new BadRequestException('用户年龄必须大于18岁');
}
// 违规:包含业务规则
if (userData.email.endsWith('@competitor.com')) {
throw new ForbiddenException('不允许竞争对手注册');
}
}
}
```
## 🎮 游戏服务器架构特殊检查
### WebSocket Gateway分层
```typescript
// ✅ 正确Gateway在Business层调用Core层服务
@WebSocketGateway()
export class LocationBroadcastGateway {
constructor(
private readonly locationBroadcastCore: LocationBroadcastCoreService,
private readonly userProfiles: UserProfilesService,
) {}
@SubscribeMessage('position_update')
async handlePositionUpdate(client: Socket, data: PositionData): Promise<void> {
// 业务逻辑:验证、权限检查
await this.validateUserPermission(client.userId);
// 调用Core层技术实现
await this.locationBroadcastCore.broadcastToRoom(client.roomId, data);
}
}
```
### 双模式服务分层
```typescript
// ✅ 正确Business层统一接口Core层不同实现
@Injectable()
export class UsersBusinessService {
constructor(
@Inject('USERS_SERVICE')
private readonly usersCore: UsersMemoryService | UsersDatabaseService,
) {}
async createUser(userData: CreateUserDto): Promise<User> {
// 业务逻辑:验证、权限、流程
await this.validateUserBusinessRules(userData);
// 调用Core层内存或数据库模式
const user = await this.usersCore.create(userData);
// 业务逻辑:后续处理
await this.sendWelcomeNotification(user);
return user;
}
}
```
## 🔍 检查执行步骤
1. **识别当前模块的层级**
- 确定是Core层还是Business层
- 检查文件夹路径和命名
2. **检查Core层命名规范**
- 业务支撑模块是否使用_core后缀
- 通用工具模块是否不使用后缀
- 根据模块职责判断命名正确性
3. **检查职责分离**
- Core层是否只包含技术实现
- Business层是否只包含业务逻辑
- 是否有跨层职责混乱
4. **检查依赖关系**
- Core层是否导入了Business层模块
- Business层是否直接使用底层技术实现
- 依赖注入是否正确使用
5. **检查架构违规**
- 识别常见的分层违规模式
- 检查技术实现和业务逻辑的边界
- 确保架构清晰度
6. **游戏服务器特殊检查**
- WebSocket Gateway的分层正确性
- 双模式服务的架构设计
- 实时通信组件的职责分离
## 🔥 重要提醒
**如果在本步骤中执行了任何修改操作调整分层结构、修正依赖关系、重构代码等必须立即重新执行步骤4的完整检查**
- ✅ 执行修改 → 🔥 立即重新执行步骤4 → 提供验证报告 → 等待用户确认
- ❌ 执行修改 → 直接进入步骤5错误做法
**不能跳过重新检查环节!**