Files
whale-town-end/开发者代码检查规范.md
moyin dd5cc48b49 docs:更新代码检查规范和API文档
- 更新AI代码检查规范简洁版
- 完善开发者代码检查规范
- 扩展OpenAPI文档,添加新的接口定义
2026-01-08 23:03:40 +08:00

1012 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
# 开发者代码检查规范
## 📖 概述
本文档为开发者提供全面的代码检查规范,确保代码质量、可维护性和团队协作效率。规范涵盖命名、注释、代码质量、架构分层、测试覆盖和文档生成六个核心方面。
## 🎯 检查流程
代码检查分为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. 提交改进建议,持续优化规范
**记住:代码规范不是束缚,而是提高代码质量和团队协作效率的有力工具!** 🚀