# 开发者代码检查规范

## 📖 概述

本文档为开发者提供全面的代码检查规范，确保代码质量、可维护性和团队协作效率。规范涵盖命名、注释、代码质量、架构分层、测试覆盖和文档生成六个核心方面。

## 🎯 检查流程

代码检查分为6个步骤，建议按顺序执行：

1. **命名规范检查** - 文件、变量、函数、类的命名规范
2. **注释规范检查** - 文件头、类、方法注释的完整性
3. **代码质量检查** - 代码清洁度、性能优化
4. **架构分层检查** - 分层架构的合规性
5. **测试覆盖检查** - 测试文件的完整性和覆盖率
6. **功能文档生成** - README文档的生成和维护

---

## 1️⃣ 命名规范检查

### 📁 文件和文件夹命名

**核心规则：使用下划线分隔（snake_case）**

```typescript
✅ 正确示例：
- user_controller.ts
- player_service.ts  
- create_room_dto.ts
- src/business/auth/
- src/core/db/users/

❌ 错误示例：
- UserController.ts          # 大驼峰命名
- playerService.ts           # 小驼峰命名
- base-users.service.ts      # 短横线分隔（常见错误！）
- src/Business/Auth/         # 大驼峰命名
```

**⚠️ 特别注意：短横线（kebab-case）是最常见的文件命名错误！**

### 🏗️ 文件夹结构优化

**避免过度嵌套，减少单文件文件夹**

```typescript
❌ 错误：过度嵌套
src/
  guards/
    auth.guard.ts           # 只有一个文件，不需要单独文件夹
  interceptors/
    logging.interceptor.ts  # 只有一个文件，不需要单独文件夹

✅ 正确：扁平化结构
src/
  auth.guard.ts
  logging.interceptor.ts
```

**文件夹创建判断标准：**
- 不超过3个文件：移到上级目录（扁平化）
- 4个以上文件：可以保持独立文件夹
- 完整功能模块：即使文件较少也可以保持独立（需特殊说明）

**检查方法（重要）：**
1. **必须使用工具详细检查**：不能凭印象判断文件夹内容
2. **逐个统计文件数量**：使用`listDirectory(path, depth=2)`获取准确数据
3. **识别单文件文件夹**：只有1个文件的文件夹必须扁平化
4. **更新引用路径**：移动文件后必须更新所有import语句

**常见检查错误：**
- ❌ 只看到文件夹存在就认为结构合理
- ❌ 没有统计每个文件夹的文件数量
- ❌ 凭印象判断而不使用工具验证
- ❌ 遗漏单文件文件夹的识别

**正确检查流程：**
1. 使用listDirectory工具查看详细结构
2. 逐个文件夹统计文件数量
3. 识别需要扁平化的文件夹（≤3个文件）
4. 执行文件移动和路径更新操作

### 🔤 变量和函数命名

**规则：小驼峰命名（camelCase）**

```typescript
✅ 正确示例：
const userName = 'Alice';
function getUserInfo() { }
async function validateUser() { }
const isGameStarted = false;

❌ 错误示例：
const UserName = 'Alice';
function GetUserInfo() { }
const is_game_started = false;
```
### 🏷️ 类和接口命名

**规则：大驼峰命名（PascalCase）**

```typescript
✅ 正确示例：
class UserService { }
interface GameConfig { }
class CreateUserDto { }
enum UserStatus { }

❌ 错误示例：
class userService { }
interface gameConfig { }
class createUserDto { }
```

### 📊 常量命名

**规则：全大写 + 下划线分隔（SCREAMING_SNAKE_CASE）**

```typescript
✅ 正确示例：
const PORT = 3000;
const MAX_PLAYERS = 10;
const SALT_ROUNDS = 10;
const DEFAULT_TIMEOUT = 5000;

❌ 错误示例：
const port = 3000;
const maxPlayers = 10;
const saltRounds = 10;
```

### 🛣️ 路由命名

**规则：全小写 + 短横线分隔（kebab-case）**

```typescript
✅ 正确示例：
@Get('user/get-info')
@Post('room/join-room')
@Put('player/update-position')

❌ 错误示例：
@Get('user/getInfo')
@Post('room/joinRoom')
@Put('player/update_position')
```

---

## 2️⃣ 注释规范检查

### 📄 文件头注释

**必须包含的信息：**

```typescript
/**
 * 文件功能描述
 * 
 * 功能描述：
 * - 主要功能点1
 * - 主要功能点2
 * - 主要功能点3
 * 
 * 职责分离：
 * - 职责描述1
 * - 职责描述2
 * 
 * 最近修改：
 * - 2024-01-07: 代码规范优化 - 修复命名规范问题 (修改者: 张三)
 * - 2024-01-06: 功能新增 - 添加用户验证功能 (修改者: 李四)
 * 
 * @author 原始作者名称
 * @version 1.0.1
 * @since 2024-01-01
 * @lastModified 2024-01-07
 */
```

### 🏛️ 类注释

**必须包含的信息：**

```typescript
/**
 * 类功能描述
 * 
 * 职责：
 * - 主要职责1
 * - 主要职责2
 * 
 * 主要方法：
 * - method1() - 方法1功能
 * - method2() - 方法2功能
 * 
 * 使用场景：
 * - 场景描述
 */
@Injectable()
export class ExampleService {
  // 类实现
}
```

### 🔧 方法注释（三级标准）

**必须包含的信息：**

```typescript
/**
 * 用户登录验证
 * 
 * 业务逻辑：
 * 1. 验证用户名或邮箱格式
 * 2. 查找用户记录
 * 3. 验证密码哈希值
 * 4. 检查用户状态是否允许登录
 * 5. 记录登录日志
 * 6. 返回认证结果
 * 
 * @param loginRequest 登录请求数据
 * @returns 认证结果，包含用户信息和认证状态
 * @throws UnauthorizedException 用户名或密码错误时
 * @throws ForbiddenException 用户状态不允许登录时
 * 
 * @example
 * ```typescript
 * const result = await loginService.validateUser({
 *   identifier: 'user@example.com',
 *   password: 'password123'
 * });
 * ```
 */
async validateUser(loginRequest: LoginRequest): Promise<AuthResult> {
  // 实现代码
}
```

### 📝 修改记录规范

**修改类型定义：**
- `代码规范优化` - 命名规范、注释规范、代码清理等
- `功能新增` - 添加新的功能或方法
- `功能修改` - 修改现有功能的实现
- `Bug修复` - 修复代码缺陷
- `性能优化` - 提升代码性能
- `重构` - 代码结构调整但功能不变

**格式要求：**
```typescript
/**
 * 最近修改：
 * - 2024-01-07: 代码规范优化 - 清理未使用的导入 (修改者: 张三)
 * - 2024-01-06: Bug修复 - 修复邮箱验证逻辑错误 (修改者: 李四)
 * - 2024-01-05: 功能新增 - 添加用户验证码登录功能 (修改者: 王五)
 * 
 * @version 1.0.1
 * @lastModified 2024-01-07
 */
```

**作者字段处理规范：**
- **保留原则**：@author字段中的人名必须保留，不得随意修改
- **AI标识替换**：只有当@author字段包含AI标识（如kiro、ChatGPT、Claude、AI等）时，才可以替换为实际的修改者名称
- **判断标准**：
  - ✅ 可以替换：`@author kiro` → `@author 张三`
  - ✅ 可以替换：`@author ChatGPT` → `@author 李四`
  - ❌ 不可替换：`@author 王五` → 必须保留为 `@author 王五`
  - ❌ 不可替换：`@author John Smith` → 必须保留为 `@author John Smith`

**修改记录更新要求：**
- **必须添加**：每次修改文件后，必须在"最近修改"部分添加新的修改记录
- **信息完整**：包含修改日期、修改类型、修改内容、修改者姓名
- **时间更新**：只有真正修改了文件内容时才更新@lastModified字段，仅检查不修改内容时不更新日期
- **版本递增**：根据修改类型适当递增版本号

**版本号递增规则：**
- 代码规范优化、Bug修复 → 修订版本 +1 (1.0.0 → 1.0.1)
- 功能新增、功能修改 → 次版本 +1 (1.0.1 → 1.1.0)
- 重构、架构变更 → 主版本 +1 (1.1.0 → 2.0.0)

---

## 3️⃣ 代码质量检查

### 🧹 导入清理

**清理未使用的导入：**

```typescript
// ✅ 正确：只导入使用的模块
import { Injectable, NotFoundException } from '@nestjs/common';
import { User } from './user.entity';

// ❌ 错误：导入未使用的模块
import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';
import { User, Admin } from './user.entity';
import * as crypto from 'crypto'; // 未使用
```

### 📊 常量定义检查

```typescript
// ✅ 正确：使用全大写+下划线
const SALT_ROUNDS = 10;
const MAX_LOGIN_ATTEMPTS = 5;
const DEFAULT_PAGE_SIZE = 20;

// ❌ 错误：使用小驼峰
const saltRounds = 10;
const maxLoginAttempts = 5;
```

### 🗑️ 未使用代码清理

```typescript
// ❌ 需要删除：未使用的私有方法
private generateVerificationCode(): string {
  // 如果这个方法没有被调用，应该删除
}

// ❌ 需要删除：未使用的变量
const unusedVariable = 'test';
```

### 📏 方法长度检查

```typescript
// ✅ 正确：方法长度合理（建议不超过50行）
async createUser(userData: CreateUserDto): Promise<User> {
  // 简洁的实现
}

// ❌ 错误：方法过长，需要拆分
async complexMethod() {
  // 超过50行的复杂逻辑，应该拆分成多个小方法
}
```
---

## 4️⃣ 架构分层检查

### 🏗️ 架构层级识别

**项目采用分层架构：**

```
src/
├── core/           # Core层：技术实现层
│   ├── db/         # 数据访问
│   ├── redis/      # 缓存服务
│   └── utils/      # 工具服务
├── business/       # Business层：业务逻辑层
│   ├── auth/       # 认证业务
│   ├── users/      # 用户业务
│   └── admin/      # 管理业务
└── common/         # 公共层：通用组件
```

### 🔧 Core层规范

**职责：专注技术实现，不包含业务逻辑**

#### 命名规范
- **检查范围**：仅检查当前执行检查的文件夹，不考虑其他同层功能模块
- **业务支撑模块**：专门为特定业务功能提供技术支撑，使用`_core`后缀（如`location_broadcast_core`、`user_auth_core`）
- **通用工具模块**：提供可复用的数据访问或基础技术服务，不使用`_core`后缀（如`user_profiles`、`redis_cache`、`logger`）

**判断标准：**
- **业务支撑模块**：模块名称体现特定业务领域，为该业务提供技术实现 → 使用`_core`后缀
- **通用工具模块**：模块提供通用的数据访问或技术服务，可被多个业务复用 → 不使用后缀

**判断流程：**
```
1. 模块是否专门为某个特定业务功能服务？
   ├─ 是 → 检查模块名称是否体现业务领域
   │   ├─ 是 → 使用 _core 后缀 (如: location_broadcast_core)
   │   └─ 否 → 重新设计模块职责
   └─ 否 → 模块是否提供通用的技术服务？
       ├─ 是 → 不使用 _core 后缀 (如: user_profiles, redis)
       └─ 否 → 重新评估模块定位

2. 实际案例判断：
   - user_profiles: 通用的用户档案数据访问 → 不使用后缀 ✓
   - location_broadcast_core: 专门为位置广播业务服务 → 使用_core后缀 ✓
   - redis: 通用的缓存技术服务 → 不使用后缀 ✓
   - user_auth_core: 专门为用户认证业务服务 → 使用_core后缀 ✓
```

```typescript
✅ 正确示例：
src/core/location_broadcast_core/     # 专门为位置广播业务提供技术支撑
src/core/user_auth_core/              # 专门为用户认证业务提供技术支撑
src/core/db/user_profiles/            # 通用的用户档案数据访问服务
src/core/redis/                       # 通用的Redis技术封装
src/core/utils/logger/                # 通用的日志工具服务

❌ 错误示例：
src/core/location_broadcast/          # 应该是location_broadcast_core
src/core/db/user_profiles_core/       # 应该是user_profiles（通用工具）
src/core/redis_core/                  # 应该是redis（通用工具）
```

#### 技术实现示例
```typescript
// ✅ 正确：Core层专注技术实现
@Injectable()
export class RedisService {
  /**
   * 设置缓存数据
   * 
   * 技术实现：
   * 1. 验证key格式
   * 2. 序列化数据
   * 3. 设置过期时间
   * 4. 处理连接异常
   */
  async set(key: string, value: any, ttl?: number): Promise<void> {
    // 专注Redis技术实现细节
  }
}

// ❌ 错误：Core层包含业务逻辑
@Injectable()
export class RedisService {
  async setUserSession(userId: string, sessionData: any): Promise<void> {
    // 错误：包含了用户会话的业务概念
  }
}
```

#### 依赖关系
- ✅ 允许：导入其他Core层模块
- ✅ 允许：导入第三方技术库
- ✅ 允许：导入Node.js内置模块
- ❌ 禁止：导入Business层模块
- ❌ 禁止：包含具体业务概念的命名

### 💼 Business层规范

**职责：专注业务逻辑实现，不关心底层技术细节**

#### 业务逻辑完备性
```typescript
// ✅ 正确：完整的业务逻辑
@Injectable()
export class UserBusinessService {
  /**
   * 用户注册业务流程
   * 
   * 业务逻辑：
   * 1. 验证用户信息完整性
   * 2. 检查用户名/邮箱是否已存在
   * 3. 验证邮箱格式和域名白名单
   * 4. 生成用户唯一标识
   * 5. 设置默认用户权限
   * 6. 发送欢迎邮件
   * 7. 记录注册日志
   * 8. 返回注册结果
   */
  async registerUser(registerData: RegisterUserDto): Promise<UserResult> {
    // 完整的业务逻辑实现
  }
}

// ❌ 错误：业务逻辑不完整
@Injectable()
export class UserBusinessService {
  async registerUser(registerData: RegisterUserDto): Promise<User> {
    // 只是简单调用数据库保存，缺少业务验证和流程
    return this.userRepository.save(registerData);
  }
}
```

#### 依赖关系
- ✅ 允许：导入对应的Core层业务支撑模块
- ✅ 允许：导入Core层通用工具模块
- ✅ 允许：导入其他Business层模块（谨慎使用）
- ✅ 允许：导入第三方业务库
- ❌ 禁止：直接导入底层技术实现（如数据库连接、Redis客户端等）
- ❌ 禁止：包含技术实现细节

#### 正确的分层实现
```typescript
// ✅ 正确：Business层调用Core层服务
@Injectable()
export class UserBusinessService {
  constructor(
    private readonly userCoreService: UserCoreService,
    private readonly cacheService: CacheService,
    private readonly emailService: EmailService,
  ) {}

  async createUser(userData: CreateUserDto): Promise<User> {
    // 业务验证
    await this.validateUserBusinessRules(userData);
    
    // 调用Core层服务
    const user = await this.userCoreService.create(userData);
    await this.cacheService.set(`user:${user.id}`, user);
    await this.emailService.sendWelcomeEmail(user.email);
    
    return user;
  }
}
```

### 🔍 常见架构违规

#### 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('不允许竞争对手注册');
    }
  }
}
```

---

## 5️⃣ 测试覆盖检查

### 📋 测试文件存在性

**规则：每个Service都必须有对应的.spec.ts测试文件**

**⚠️ Service定义（重要）：**
只有以下类型需要测试文件：
- ✅ **Service类**：文件名包含`.service.ts`的业务逻辑类
- ✅ **Controller类**：文件名包含`.controller.ts`的控制器类  
- ✅ **Gateway类**：文件名包含`.gateway.ts`的WebSocket网关类

**❌ 以下类型不需要测试文件：**
- ❌ **Middleware类**：中间件（`.middleware.ts`）不需要测试文件
- ❌ **Guard类**：守卫（`.guard.ts`）不需要测试文件
- ❌ **DTO类**：数据传输对象（`.dto.ts`）不需要测试文件
- ❌ **Interface文件**：接口定义（`.interface.ts`）不需要测试文件
- ❌ **Utils工具类**：工具函数（`.utils.ts`）不需要测试文件
- ❌ **Config文件**：配置文件（`.config.ts`）不需要测试文件

**测试文件位置规范（重要）：**
- ✅ **正确位置**：测试文件必须与对应源文件放在同一目录
- ❌ **错误位置**：测试文件放在单独的tests/、test/、spec/、__tests__/等文件夹中

```typescript
// ✅ 正确：测试文件与源文件同目录
src/core/db/users/users.service.ts
src/core/db/users/users.service.spec.ts

src/business/admin/admin.service.ts  
src/business/admin/admin.service.spec.ts

// ❌ 错误：测试文件在单独文件夹
src/business/admin/admin.service.ts
src/business/admin/tests/admin.service.spec.ts        # 错误位置
src/business/admin/__tests__/admin.service.spec.ts    # 错误位置

// ❌ 错误：缺少测试文件
src/core/login_core/login_core.service.ts
# 缺少：src/core/login_core/login_core.service.spec.ts
```

**扁平化要求：**
- **强制扁平化**：所有tests/、test/、spec/、__tests__/等测试专用文件夹必须扁平化
- **移动规则**：将测试文件移动到对应源文件的同一目录
- **更新引用**：移动后必须更新所有import路径引用
- **删除空文件夹**：移动完成后删除空的测试文件夹

### 🎯 测试用例覆盖完整性

**要求：测试文件必须覆盖Service中的所有公共方法**

```typescript
// 示例Service
@Injectable()
export class UserService {
  async createUser(userData: CreateUserDto): Promise<User> { }
  async findUserById(id: string): Promise<User> { }
  async updateUser(id: string, updateData: UpdateUserDto): Promise<User> { }
  async deleteUser(id: string): Promise<void> { }
  async findUsersByStatus(status: UserStatus): Promise<User[]> { }
}

// ✅ 正确：完整的测试覆盖
describe('UserService', () => {
  // 每个公共方法都有对应的测试
  describe('createUser', () => {
    it('should create user successfully', () => { });
    it('should throw error when email already exists', () => { });
    it('should throw error when required fields missing', () => { });
  });

  describe('findUserById', () => {
    it('should return user when found', () => { });
    it('should throw NotFoundException when user not found', () => { });
    it('should throw error when id is invalid', () => { });
  });

  // ... 其他方法的测试
});
```

### 🧪 测试场景真实性

**要求：每个方法必须测试正常情况、异常情况和边界情况**

```typescript
// ✅ 正确：完整的测试场景
describe('createUser', () => {
  // 正常情况
  it('should create user with valid data', async () => {
    const userData = { name: 'John', email: 'john@example.com' };
    const result = await service.createUser(userData);
    expect(result).toBeDefined();
    expect(result.name).toBe('John');
  });

  // 异常情况
  it('should throw ConflictException when email already exists', async () => {
    const userData = { name: 'John', email: 'existing@example.com' };
    await expect(service.createUser(userData)).rejects.toThrow(ConflictException);
  });

  // 边界情况
  it('should handle empty name gracefully', async () => {
    const userData = { name: '', email: 'test@example.com' };
    await expect(service.createUser(userData)).rejects.toThrow(BadRequestException);
  });
});
```

### 🏗️ 测试代码质量

**要求：测试代码必须清晰、可维护、真实有效**

```typescript
// ✅ 正确：高质量的测试代码
describe('UserService', () => {
  let service: UserService;
  let mockRepository: jest.Mocked<Repository<User>>;

  beforeEach(async () => {
    const mockRepo = {
      save: jest.fn(),
      findOne: jest.fn(),
      find: jest.fn(),
      delete: jest.fn(),
    };

    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UserService,
        { provide: getRepositoryToken(User), useValue: mockRepo },
      ],
    }).compile();

    service = module.get<UserService>(UserService);
    mockRepository = module.get(getRepositoryToken(User));
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  describe('findUserById', () => {
    it('should return user when found', async () => {
      // Arrange
      const userId = '123';
      const expectedUser = { id: userId, name: 'John', email: 'john@example.com' };
      mockRepository.findOne.mockResolvedValue(expectedUser);

      // Act
      const result = await service.findUserById(userId);

      // Assert
      expect(result).toEqual(expectedUser);
      expect(mockRepository.findOne).toHaveBeenCalledWith({ where: { id: userId } });
    });
  });
});
```

### 🔗 集成测试

**要求：复杂Service需要集成测试文件(.integration.spec.ts)**

```typescript
// ✅ 正确：提供集成测试
src/core/db/users/users.service.ts
src/core/db/users/users.service.spec.ts          # 单元测试
src/core/db/users/users.integration.spec.ts     # 集成测试
```

### ⚡ 测试执行

**推荐的测试命令：**

```bash
# 针对特定文件夹的测试（推荐）- 排除集成测试
npx jest src/core/db/users --testPathIgnorePatterns="integration.spec.ts"

# 针对特定文件的测试
npx jest src/core/db/users/users.service.spec.ts

# 带覆盖率的测试执行
npx jest src/core/db/users --coverage --testPathIgnorePatterns="integration.spec.ts"
```
---

## 6️⃣ 功能文档生成

### 📚 README文档结构

**要求：每个功能模块文件夹都必须有README.md文档**

#### 1. 模块概述
```markdown
# [模块名称] [中文描述]

[模块名称] 是 [一段话总结文件夹的整体功能和作用，说明其在项目中的定位和价值]。
```

#### 2. 对外提供的接口
```markdown
## 用户数据操作

### create()
创建新用户记录，支持数据验证和唯一性检查。

### findByEmail()
根据邮箱地址查询用户，用于登录验证和账户找回。

### updateUserStatus()
更新用户状态，支持激活、禁用、待验证等状态切换。
```

#### 3. 使用的项目内部依赖
```markdown
## 使用的项目内部依赖

### UserStatus (来自 business/user-mgmt/enums/user-status.enum)
用户状态枚举，定义用户的激活、禁用、待验证等状态值。

### CreateUserDto (本模块)
用户创建数据传输对象，提供完整的数据验证规则和类型定义。

### LoggerService (来自 core/utils/logger)
日志服务，用于记录用户操作和系统事件。
```

#### 4. 核心特性
```markdown
## 核心特性

### 双存储模式支持
- 数据库模式：使用TypeORM连接MySQL，适用于生产环境
- 内存模式：使用Map存储，适用于开发测试和故障降级
- 动态模块配置：通过UsersModule.forDatabase()和forMemory()灵活切换

### 数据完整性保障
- 唯一性约束检查：用户名、邮箱、手机号、GitHub ID
- 数据验证：使用class-validator进行输入验证
- 事务支持：批量操作支持回滚机制

### 性能优化
- 查询优化：使用索引和查询缓存
- 批量操作：支持批量创建和更新
- 内存缓存：热点数据缓存机制
```

#### 5. 潜在风险
```markdown
## 潜在风险

### 内存模式数据丢失
- 内存存储在应用重启后数据会丢失
- 不适用于生产环境的持久化需求
- 建议仅在开发测试环境使用

### 并发操作风险
- 内存模式的ID生成锁机制相对简单
- 高并发场景可能存在性能瓶颈
- 建议在生产环境使用数据库模式

### 数据一致性风险
- 跨模块操作时可能存在数据不一致
- 需要注意事务边界的设计
- 建议使用分布式事务或补偿机制
```

### 📝 文档质量要求

#### 内容质量标准
- **准确性**：所有信息必须与代码实现一致
- **完整性**：覆盖所有公共接口和重要功能
- **简洁性**：每个说明控制在一句话内，突出核心要点
- **实用性**：提供对开发者有价值的信息和建议

#### 语言表达规范
- 使用中文进行描述，专业术语可保留英文
- 语言简洁明了，避免冗长的句子
- 统一术语使用，保持前后一致
- 避免主观评价，客观描述功能和特性

---

## 🛠️ 实用工具和技巧

### 📋 检查清单

#### 命名规范检查清单
- [ ] 文件名使用snake_case（下划线分隔）
- [ ] 变量和函数使用camelCase（小驼峰）
- [ ] 类和接口使用PascalCase（大驼峰）
- [ ] 常量使用SCREAMING_SNAKE_CASE（全大写+下划线）
- [ ] 路由使用kebab-case（短横线分隔）
- [ ] 避免过度嵌套的文件夹结构
- [ ] Core层业务支撑模块使用_core后缀，通用工具模块不使用后缀

#### 注释规范检查清单
- [ ] 文件头注释包含功能描述、职责分离、修改记录
- [ ] 类注释包含职责、主要方法、使用场景
- [ ] 方法注释包含业务逻辑、参数说明、返回值、异常、示例
- [ ] 修改记录使用正确的日期和修改者信息
- [ ] 版本号按规则递增
- [ ] @author字段正确处理（AI标识替换为实际作者）

#### 代码质量检查清单
- [ ] 清理所有未使用的导入
- [ ] 清理所有未使用的变量和方法
- [ ] 常量使用正确的命名规范
- [ ] 方法长度控制在合理范围内（建议不超过50行）
- [ ] 避免代码重复

#### 架构分层检查清单
- [ ] Core层专注技术实现，不包含业务逻辑
- [ ] Business层专注业务逻辑，不包含技术实现细节
- [ ] 依赖关系符合分层架构要求
- [ ] 模块职责清晰，边界明确

#### 测试覆盖检查清单
- [ ] 每个Service都有对应的.spec.ts测试文件
- [ ] 所有公共方法都有测试覆盖
- [ ] 测试覆盖正常情况、异常情况、边界情况
- [ ] 测试代码质量高，真实有效
- [ ] 复杂Service提供集成测试
- [ ] 测试能够成功执行

#### 功能文档检查清单
- [ ] 每个功能模块都有README.md文档
- [ ] 文档包含模块概述、对外接口、内部依赖、核心特性、潜在风险
- [ ] 所有公共接口都有准确的功能描述
- [ ] 文档内容与代码实现一致
- [ ] 语言表达简洁明了

### 🔧 常用命令

#### 测试相关命令
```bash
# 运行特定文件夹的单元测试
npx jest src/core/db/users --testPathIgnorePatterns="integration.spec.ts"

# 运行特定文件的测试
npx jest src/core/db/users/users.service.spec.ts

# 运行测试并生成覆盖率报告
npx jest src/core/db/users --coverage

# 静默模式运行测试
npx jest src/core/db/users --silent
```

#### 代码检查命令
```bash
# TypeScript类型检查
npx tsc --noEmit

# ESLint代码检查
npx eslint src/**/*.ts

# Prettier代码格式化
npx prettier --write src/**/*.ts
```

### 🚨 常见错误和解决方案

#### 命名规范常见错误
1. **短横线命名错误**
   - 错误：`base-users.service.ts`
   - 正确：`base_users.service.ts`
   - 解决：统一使用下划线分隔

2. **常量命名错误**
   - 错误：`const saltRounds = 10;`
   - 正确：`const SALT_ROUNDS = 10;`
   - 解决：常量使用全大写+下划线

#### 架构分层常见错误
1. **Business层包含技术实现**
   - 错误：直接操作数据库连接
   - 正确：调用Core层服务
   - 解决：通过依赖注入使用Core层服务

2. **Core层包含业务逻辑**
   - 错误：在数据层进行业务验证
   - 正确：只处理技术实现
   - 解决：将业务逻辑移到Business层

#### 测试覆盖常见错误
1. **测试文件缺失**
   - 错误：Service没有对应的.spec.ts文件
   - 解决：为每个Service创建测试文件

2. **测试场景不完整**
   - 错误：只测试正常情况
   - 正确：测试正常、异常、边界情况
   - 解决：补充异常和边界情况的测试用例

---

## 📈 最佳实践建议

### 🎯 开发流程建议

1. **编码前**：明确模块职责和架构定位
2. **编码中**：遵循命名规范和注释规范
3. **编码后**：进行代码质量检查和测试覆盖
4. **提交前**：生成或更新功能文档

### 🔄 持续改进

1. **定期检查**：建议每周进行一次全面的代码规范检查
2. **团队协作**：通过Code Review确保规范执行
3. **工具辅助**：使用ESLint、Prettier等工具自动化检查
4. **文档维护**：及时更新文档，保持与代码同步

### 📊 质量指标

1. **命名规范达标率**：目标100%
2. **注释覆盖率**：文件头、类、公共方法100%覆盖
3. **测试覆盖率**：单元测试覆盖率>90%
4. **文档完整性**：每个功能模块都有README文档

---

## 🤝 团队协作

### 👥 角色职责

- **开发者**：遵循规范进行开发，自检代码质量
- **Code Reviewer**：检查代码是否符合规范要求
- **架构师**：制定和维护架构分层规范
- **测试工程师**：确保测试覆盖率和测试质量

### 📋 Review检查点

1. **命名规范**：文件、变量、函数、类的命名是否符合规范
2. **注释完整性**：文件头、类、方法注释是否完整准确
3. **代码质量**：是否有未使用的代码，常量定义是否规范
4. **架构合规性**：是否符合分层架构要求
5. **测试覆盖**：是否有对应的测试文件和完整的测试用例
6. **文档同步**：README文档是否与代码实现一致

### 🛡️ 质量保障

1. **自动化检查**：集成ESLint、Prettier、Jest等工具
2. **CI/CD集成**：在构建流程中加入代码规范检查
3. **定期审计**：定期进行代码规范审计和改进
4. **培训推广**：定期组织团队培训，提高规范意识

---

## 📞 支持和反馈

如果在使用过程中遇到问题或有改进建议，请：

1. 查阅本文档的相关章节
2. 参考常见错误和解决方案
3. 向团队架构师或技术负责人咨询
4. 提交改进建议，持续优化规范

**记住：代码规范不是束缚，而是提高代码质量和团队协作效率的有力工具！** 🚀