Files
monkeycode-ai 80b4718568 docs: 生成完整项目文档
创建以下文档:
- INDEX.md - 项目索引和概览
- ARCHITECTURE.md - 系统架构设计文档
- INTERFACES.md - 接口和类型定义文档
- DEVELOPER_GUIDE.md - 开发者指南

文档覆盖内容:
- 项目结构和模块说明
- 技术栈和依赖
- 核心组件设计
- API 接口定义
- 数据模型
- 开发环境配置
- 代码规范
- 测试指南
- 调试技巧
- Git 工作流
Co-authored-by: monkeycode-ai <monkeycode-ai@chaitin.com>
2026-06-03 04:17:14 +00:00

520 lines
9.1 KiB
Markdown
Raw Permalink 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.
# CodePlay 开发者指南
## 开发环境要求
### 必需工具
| 工具 | 版本 | 说明 |
|------|------|------|
| .NET SDK | 8.0+ | 开发和构建工具 |
| IDE | 推荐 Visual Studio 2022 / Rider | C# 开发环境 |
| Git | 任意版本 | 版本控制 |
### 可选工具
| 工具 | 说明 |
|------|------|
| Swagger UI | 访问 `http://localhost:5000/swagger` 查看 API 文档 |
| Postman | API 测试工具 |
## 快速开始
### 1. 克隆仓库
```bash
cd /workspace
```
### 2. 还原依赖
```bash
dotnet restore CodePlay.sln
```
### 3. 构建项目
```bash
dotnet build CodePlay.sln
```
### 4. 运行测试
```bash
dotnet test CodePlay.Tests/CodePlay.Tests.csproj --logger "console;verbosity=normal"
```
### 5. 启动 Web API
```bash
dotnet run --project CodePlay.Web/CodePlay.Web.csproj
```
默认监听地址:
- HTTP: `http://localhost:5000`
- HTTPS: `https://localhost:5001`
### 6. 启动 CLI(开发中)
```bash
dotnet run --project CodePlay.CLI/CodePlay.CLI.csproj -- --help
```
## 项目结构
参见 [ARCHITECTURE.md](./ARCHITECTURE.md) 了解详细架构。
## 代码规范
### 命名约定
#### C# 类和接口
- **类名**: PascalCase
- **接口名**: IPascalCase
- **方法名**: PascalCase
- **属性名**: PascalCase
- **私有字段**: _camelCase
- **局部变量**: camelCase
- **常量**: PASCAL_CASE
#### 文件和目录
- **文件名**: PascalCase.cs
- **目录名**: PascalCase
### 注释规范
#### 文档注释
所有公共成员必须有 XML 文档注释:
```csharp
/// <summary>
/// 方法的功能描述
/// </summary>
/// <param name="param">参数说明</param>
/// <returns>返回值说明</returns>
public string Method(string param)
```
#### 行内注释
```csharp
// 使用单行注释解释复杂的逻辑
var result = CalculateComplexLogic(); // 这里是为什么需要这样计算
/*
多行注释用于说明代码块的整体逻辑
*/
```
### 异常处理
#### 抛出异常
```csharp
if (string.IsNullOrWhiteSpace(sourceCode))
{
throw new ArgumentException("Source code is required", nameof(sourceCode));
}
```
#### 捕获异常
```csharp
try
{
// 可能抛出异常的代码
}
catch (Exception ex) when (!Debugger.IsAttached)
{
// 记录日志
_logger.LogError(ex, "操作失败");
throw;
}
```
### 异步编程
#### 异步方法命名
- 异步方法以 `Async` 结尾
- 返回 `Task``Task<T>`
```csharp
public async Task<ConversionResult> ConvertAsync(
ConversionRequest request,
CancellationToken cancellationToken)
```
#### 取消令牌
所有异步操作都应该支持取消:
```csharp
public async Task<Result> ExecuteAsync(CancellationToken cancellationToken = default)
{
await DoWorkAsync(cancellationToken);
}
```
### 依赖注入
遵循 ASP.NET Core 的依赖注入模式:
```csharp
// 注册服务
builder.Services.AddSingleton<ConversionService>();
builder.Services.AddScoped<IConverter, CSharpToJavaConverter>();
// 注入到类
public class MyService
{
private readonly ConversionService _service;
public MyService(ConversionService service)
{
_service = service;
}
}
```
## 测试指南
### 测试项目结构
```
CodePlay.Tests/
├── Parsers/
│ └── CSharpParserTests.cs
└── Converters/
└── CSharpToJavaConverterTests.cs
```
### 单元测试最佳实践
#### 测试类命名
- `{被测试类}Tests` 格式
#### 测试方法命名
- `{方法名}_{场景}_{期望结果}` 格式
```csharp
[Fact]
public void ParseAsync_SimpleClass_ShouldParseSuccessfully()
```
#### 使用 Arrange-Act-Assert 模式
```csharp
[Fact]
public void Test_Method()
{
// Arrange(准备)
var parser = new CSharpParser();
var code = "public class Test { }";
// Act(执行)
var result = await parser.ParseAsync(code);
// Assert(断言)
Assert.NotNull(result);
Assert.Equal(LanguageType.CSharp, result.Language);
}
```
### 运行测试
#### 运行所有测试
```bash
dotnet test
```
#### 运行特定测试类
```bash
dotnet test --filter "FullyQualifiedName~CSharpParserTests"
```
#### 查看详细信息
```bash
dotnet test --logger "console;verbosity=detailed"
```
## 调试技巧
### 日志调试
使用 `ILogger` 进行调试:
```csharp
_logger.LogDebug("当前状态:{State}", state);
_logger.LogInformation("操作成功完成");
_logger.LogWarning("潜在问题:{Issue}", issue);
_logger.LogError(ex, "操作失败:{Error}", error);
```
### 断点调试
在 IDE 中设置断点:
1. 在代码行号左侧点击设置断点
2. 按 F5 启动调试
3. 使用 F10/F11 单步执行
### 调试输出
使用 `Debug.WriteLine` 输出调试信息:
```csharp
Debug.WriteLine($"当前节点类型:{node.Type}");
```
## 添加新的转换支持
### 1. 添加语言枚举
`Enums.cs` 中添加:
```csharp
public enum LanguageType
{
// ...现有语言
Python = 4 // 新语言
}
```
### 2. 实现解析器
创建 `{Language}Parser.cs`
```csharp
public class PythonParser : BaseParser
{
public override LanguageType SupportedLanguage => LanguageType.Python;
public override Task<SyntaxTree> ParseAsync(string sourceCode, CancellationToken cancellationToken)
{
// 实现解析逻辑
}
}
```
### 3. 实现转换器
创建 `{Source}To{Target}Converter.cs`
```csharp
public class CSharpToPythonConverter : IConverter
{
public async Task<ConversionResult> ConvertAsync(
SyntaxTree syntaxTree,
LanguageType targetLanguage,
ConversionOptions? options = null,
CancellationToken cancellationToken = default)
{
// 实现转换逻辑
}
}
```
### 4. 实现生成器
创建 `{Language}CodeGenerator.cs`
```csharp
public class PythonCodeGenerator : ICodeGenerator
{
public string Generate(SyntaxTree syntaxTree)
{
// 实现代码生成
}
}
```
### 5. 注册服务
`ConversionService` 中注册:
```csharp
public ConversionService()
{
RegisterConverter(LanguageType.CSharp, LanguageType.Python, new CSharpToPythonConverter());
}
```
## 添加新的 API 端点
### 1. 创建控制器
```csharp
[ApiController]
[Route("api/[controller]")]
public class ProjectController : ControllerBase
{
[HttpGet("{id}")]
public async Task<ActionResult<Project>> GetProject(string id)
{
// 实现逻辑
}
}
```
### 2. 配置路由
`Program.cs` 中:
```csharp
app.MapControllers();
```
### 3. 添加 Swagger 文档
```csharp
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "CodePlay API",
Version = "v1"
});
});
```
## 常见问题
### Q: 编译失败
**A**: 检查 .NET SDK 版本:
```bash
dotnet --version
```
应该是 8.0 或更高版本。
### Q: 测试失败
**A**: 查看测试输出,确认是否是因为:
- 依赖未还原
- 代码变更导致测试用例失效
- 环境问题
### Q: Web API 无法启动
**A**: 检查端口占用情况:
```bash
netstat -ano | findstr :5000
```
### Q: 转换器不支持某语言对
**A**: 检查 `ConversionService` 中是否已注册该转换对:
```csharp
var supported = service.GetSupportedConversions();
```
## Git 工作流
### 分支命名
- 功能分支:`{YYMMDD}-feat-{feature-name}`
- 修复分支:`{YYMMDD}-fix-{issue-id}`
### 提交消息
使用以下格式:
```
feat: 添加新功能
fix: 修复问题
docs: 更新文档
test: 添加测试
refactor: 代码重构
chore: 日常维护
```
### 推送代码
```bash
git add .
git commit -m "feat: 描述你的更改"
git push origin {branch-name}
```
## 发布流程
### 1. 更新版本号
在所有 `.csproj` 文件中更新版本号。
### 2. 生成 NuGet 包
```bash
dotnet pack CodePlay.Core/CodePlay.Core.csproj -c Release
```
### 3. 创建 Docker 镜像(Web 服务)
```bash
docker build -t codeplay-web:latest -f CodePlay.Web/Dockerfile .
```
### 4. 生成发布说明
在 GitHub Releases 中创建新版本,包含:
- 版本号
- 更新内容
- 已知问题
- 升级指南
## 性能优化建议
1. **缓存**:缓存已解析的语法树
2. **并行处理**:对多个文件使用并行转换
3. **内存管理**:及时释放大对象
4. **异步 I/O**:使用异步文件读写
## 安全建议
1. **输入验证**:检查所有输入参数
2. **资源限制**:限制单次转换的代码量
3. **超时控制**:设置操作超时时间
4. **错误处理**:不暴露敏感信息
## 资源链接
- [.NET 文档](https://docs.microsoft.com/en-us/dotnet/)
- [ASP.NET Core 文档](https://docs.microsoft.com/en-us/aspnet/core/)
- [xUnit 测试框架](https://xunit.net/)
- [Swagger 文档](https://swagger.io/docs/)
## 贡献指南
### 提交代码前检查清单
- [ ] 代码通过编译
- [ ] 所有测试通过
- [ ] 代码格式符合规范
- [ ] 添加了必要的注释
- [ ] 更新了相关文档
- [ ] 提交了任务列表(如适用)
### 代码审查要点
1. 功能是否正确实现
2. 代码是否可读
3. 是否有足够的测试覆盖
4. 是否遵循了架构设计
5. 是否有性能问题
## 联系方式
- 项目仓库:[GitHub](https://github.com/your-org/codeplay)
- 问题反馈:[Issues](https://github.com/your-org/codeplay/issues)