Files
AIEC_Skills/codebase_architecture_analyzer_v1/reference/knowledge.md
2025-11-12 10:27:56 +08:00

512 lines
12 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.

# 架构分析方法论
本文档提供代码库架构分析的核心方法论和最佳实践。
## 目录
- [1. 子系统边界识别](#1-子系统边界识别)
- [2. 工作流模式识别](#2-工作流模式识别)
- [3. 通信机制识别](#3-通信机制识别)
- [4. Mermaid 图表选择策略](#4-mermaid-图表选择策略)
- [5. 业务函数识别规则](#5-业务函数识别规则)
---
## 1. 子系统边界识别
### 规则 1: 目录命名模式
通过目录名称识别子系统:
| 目录模式 | 子系统类型 | 常见技术栈 |
|---------|-----------|-----------|
| `frontend/`, `ui/`, `web/`, `client/` | 前端子系统 | React, Vue, Angular |
| `backend/`, `api/`, `server/` | 后端子系统 | FastAPI, Express, Django |
| `agent/`, `agents/`, `workers/` | Agent 系统 | LangGraph, CrewAI, Celery |
| `services/` + 多个子目录 | 微服务集群 | Spring Boot, Go microservices |
| `database/`, `models/`, `schema/` | 数据层 | SQLAlchemy, Prisma |
| `shared/`, `common/`, `lib/` | 共享库 | 工具函数、类型定义 |
### 规则 2: 独立配置文件识别
每个子系统通常有独立的配置文件:
```
frontend/
├── package.json → 独立的 Node.js 项目
├── tsconfig.json
└── vite.config.js
backend/
├── requirements.txt → 独立的 Python 项目
├── pyproject.toml
└── Dockerfile
```
**识别方法**
```bash
# 查找独立的依赖文件
find . -name "package.json" -o -name "requirements.txt" -o -name "go.mod"
```
### 规则 3: Docker Compose 服务划分
分析 `docker-compose.yml` 识别服务边界:
```yaml
services:
frontend: # 前端服务
build: ./frontend
api: # API 服务
build: ./backend
worker: # 后台任务
build: ./worker
db: # 数据库
image: postgres:15
```
每个 service 通常对应一个独立的子系统。
---
## 2. 工作流模式识别
### 模式 1: Multi-Agent 编排
**特征**
- 导入 `langgraph`, `crewai`, `autogen`
- 存在 `StateGraph()`, `Crew()`, `Sequential()` 调用
- 使用 `add_node()`, `add_edge()` 方法
**提取方法**
1. **定位编排定义**
```bash
grep -r "StateGraph\|Crew\|AutoGen" --include="*.py"
```
2. **提取 Agent 节点**
```python
# 示例代码
graph = StateGraph(AgentState)
graph.add_node("researcher", research_agent) # Agent 1
graph.add_node("writer", writing_agent) # Agent 2
graph.add_node("reviewer", review_agent) # Agent 3
```
3. **分析状态流转**
```python
graph.add_edge("researcher", "writer") # 顺序流转
graph.add_conditional_edges("writer", should_revise, {
"revise": "researcher", # 条件分支
"finish": END
})
```
**生成图表类型**: `stateDiagram-v2`
---
### 模式 2: 数据管道ETL/Pipeline
**特征**
- 目录名包含 `pipeline`, `etl`, `workflow`
- 函数名包含 `extract`, `transform`, `load`
- 使用 Airflow, Prefect, Dagster 框架
**提取方法**
1. **识别管道阶段**
```python
# 示例代码
def run_pipeline(source):
raw = extract(source) # 阶段 1
clean = transform(raw) # 阶段 2
load(clean) # 阶段 3
```
2. **追踪数据转换**
- 输入CSV 文件
- → DataFrame (pandas)
- → 清洗后 DataFrame
- → PostgreSQL 表
**生成图表类型**: `flowchart LR` (从左到右)
---
### 模式 3: 事件驱动架构
**特征**
- 使用 `EventEmitter`, `event_bus`, `@subscribe`
- 发布订阅模式:`emit()`, `on()`, `subscribe()`
- 消息队列RabbitMQ, Kafka, Redis Pub/Sub
**提取方法**
1. **识别事件定义**
```python
# 发布事件
event_bus.emit("order_created", order)
```
2. **识别订阅者**
```python
@event_bus.on("order_created")
def handle_order(order):
send_confirmation(order)
@event_bus.on("order_created")
def update_inventory(order):
inventory.decrease(order.items)
```
**生成图表类型**: `graph TB` (显示发布-订阅关系)
---
### 模式 4: 微服务调用链
**特征**
- `docker-compose.yml` 中有多个 services
- 使用 `requests.get()`, `httpx.get()` 调用其他服务
- gRPC 调用:`stub.MethodCall()`
**提取方法**
1. **识别服务间调用**
```python
# api-gateway 调用其他服务
user = requests.get("http://user-service/users/{id}")
order = requests.post("http://order-service/orders", ...)
```
2. **绘制调用拓扑**
- api-gateway → user-service
- api-gateway → order-service
- order-service → payment-service
**生成图表类型**: `graph TB` (服务拓扑)
---
### 模式 5: 传统分层架构MVC
**特征**
- 目录结构:`controllers/`, `services/`, `models/`
- 装饰器:`@app.route`, `@Controller`
- ORM 使用SQLAlchemy, Sequelize
**提取方法**
1. **识别三层结构**
- Controller: 处理 HTTP 请求
- Service: 业务逻辑
- Model: 数据模型
2. **追踪调用链**
```
routes.py (@app.route)
→ UserService.create()
→ User model
→ Database
```
**生成图表类型**: `graph TD` (分层图)
---
## 3. 通信机制识别
### HTTP/REST API
**搜索关键词**
```bash
# 服务端
grep -r "@app\.(get|post|put|delete)" --include="*.py"
grep -r "router\.(get|post)" --include="*.js"
grep -r "@RestController" --include="*.java"
# 客户端
grep -r "axios\.(get|post)" --include="*.js"
grep -r "requests\.(get|post)" --include="*.py"
grep -r "fetch(" --include="*.ts"
```
### WebSocket
**搜索关键词**
```bash
grep -r "WebSocket\|socket.io\|ws://" --include="*.{py,js,ts}"
```
### 消息队列
**搜索关键词**
```bash
# RabbitMQ
grep -r "pika\|RabbitMQ" --include="*.py"
# Kafka
grep -r "kafka\|KafkaProducer" --include="*.{py,java}"
# Redis Pub/Sub
grep -r "redis.*publish\|redis.*subscribe" --include="*.py"
```
### gRPC
**搜索关键词**
```bash
grep -r "grpc\|\.proto" --include="*.{py,go,java}"
```
---
## 4. Mermaid 图表选择策略
根据识别到的模式选择合适的图表类型:
| 场景 | 图表类型 | 适用情况 |
|------|---------|---------|
| 状态转换明显Multi-Agent | `stateDiagram-v2` | 有明确的状态节点和转换条件 |
| 顺序+条件流程(业务流程) | `flowchart TD` | 顺序执行 + if/else 分支 |
| 数据管道ETL | `flowchart LR` | 线性的数据转换流程 |
| 系统拓扑(微服务) | `graph TB` | 多个系统/服务的交互关系 |
| 时序交互API 调用) | `sequenceDiagram` | 多个参与者的时序消息传递 |
| 并发任务 | `graph TB` + subgraph | 多个并行任务分组 |
### 语法注意事项
**⚠️ Mermaid 语法约束(基于版本 11.x**
- **stateDiagram-v2**: 禁用 `--` 分隔符(会报错 "No such shape: divider"
- **stateDiagram-v2**: 不支持 `<br/>` 标签
- **sequenceDiagram**: `alt/loop/par` 块必须正确配对 `end`
- **所有类型**: 避免过深嵌套的控制结构
**stateDiagram-v2 限制**
- ❌ 不支持 `<br/>` 标签,使用 `note` 块代替
- ❌ 不支持 `--` 分隔符
- ❌ 标签文本避免 `!=`, `==` 等比较运算符
- ✅ 复杂信息放在 `note right/left of NodeName` 块中
**flowchart/graph**
- ✅ 可使用 `<br/>` 换行
- ✅ 支持富文本标签
- ✅ 使用 `style` 设置节点颜色
### 示例:选择决策树
```
检测到的特征:
├─ 有状态变量 + 转换逻辑?
│ → 是:使用 stateDiagram-v2
│ → 否:继续判断
├─ 有多个参与者 + 时序消息?
│ → 是:使用 sequenceDiagram
│ → 否:继续判断
├─ 线性数据转换?
│ → 是:使用 flowchart LR
│ → 否:继续判断
└─ 默认:使用 graph TB 或 flowchart TD
```
---
## 5. 业务函数识别规则
### 排除辅助函数
**规则**:以下函数不算业务逻辑
```python
# 1. 私有函数(下划线开头)
def _internal_helper():
pass
# 2. 工具函数
def format_date(date):
pass
def validate_email(email):
pass
# 3. Getter/Setter
def get_user():
pass
def set_config():
pass
# 4. 过短的函数(< 5 行)
def simple_wrapper():
return another_function()
```
### 识别业务函数
**特征 1函数名包含业务关键词**
```python
业务动词:
- process_*, handle_*, execute_*, run_*
- create_*, update_*, delete_*
- generate_*, analyze_*, calculate_*
- search_*, fetch_*, query_*
- build_*, transform_*, convert_*
```
**特征 2处理核心数据模型**
```python
# 函数参数或返回值包含核心数据类
def process_order(order: Order) -> OrderResult: # ✓ 业务函数
...
def format_string(s: str) -> str: # ✗ 工具函数
...
```
**特征 3函数体较长> 10 行)**
通常业务逻辑较复杂,函数体较长。
**特征 4调用外部服务或数据库**
```python
def create_user(data):
user = User(**data)
db.session.add(user) # ✓ 数据库操作
db.session.commit()
send_email(user.email) # ✓ 外部服务
return user
```
---
## 6. 调用链追踪深度控制
### 最大深度策略
**问题**:递归追踪可能陷入无限循环
**解决方案**:限制最大深度
```python
MAX_DEPTH = 5 # 最多追踪 5 层
def trace_calls(func_name, current_depth=0):
if current_depth >= MAX_DEPTH:
return
calls = extract_function_calls(func_name)
for call in calls:
trace_calls(call, current_depth + 1)
```
### 广度优先 vs 深度优先
**广度优先BFS**
- 优先展示同一层级的所有函数
- 适合识别并发任务
**深度优先DFS**
- 优先追踪单一调用链
- 适合追踪数据转换流程
**推荐**:对于流程分析,使用 **广度优先**。
---
## 7. 最佳实践
### ✅ 应该做的
1. **先宽后深** - 先了解整体结构,再深入细节
2. **只读分析** - 不修改任何代码
3. **标注位置** - 所有结论都附带文件:行号
4. **可视化优先** - 用图表表达复杂关系
5. **分阶段输出** - 边分析边展示进度
### ❌ 不应该做的
1. **不要臆测** - 所有结论必须基于代码事实
2. **不要分析 node_modules/** - 跳过第三方依赖
3. **不要暴露敏感信息** - 不读取 `.env`, `secrets.yaml`
4. **不要过度深入** - 不需要分析每一个辅助函数
5. **不要修改代码** - 纯只读分析
---
## 8. 故障排除
### 问题 1: 找不到入口点
**症状**:无法识别主函数
**解决方案**
```bash
# 多种方式查找
grep -r "if __name__ == '__main__'" --include="*.py"
grep -r "@app.route\|@app.post" --include="*.py"
grep -r "func main()" --include="*.go"
ls -la | grep -i "main\|index\|app"
```
### 问题 2: 调用链太复杂
**症状**:函数调用超过 100 层
**解决方案**
- 只追踪业务函数,忽略工具函数
- 限制最大深度为 5
- 聚焦核心路径(最常用的调用链)
### 问题 3: 动态导入无法追踪
**症状**Python 的 `importlib`, JavaScript 的 `require(variable)`
**解决方案**
- 结合运行时日志分析
- 搜索字符串模式猜测可能的模块名
- 在报告中标注"动态导入,无法静态分析"
---
## 9. 工具推荐
### Python 项目
- `ast` 模块 - 解析 Python AST
- `radon` - 复杂度分析
- `pydeps` - 依赖可视化
### JavaScript/TypeScript 项目
- `@typescript-eslint/parser` - 解析 TS AST
- `madge` - 依赖关系图
- `dependency-cruiser` - 依赖验证
### Go 项目
- `go-callvis` - 调用图可视化
- `gocyclo` - 圈复杂度
### 通用工具
- `tree` - 目录结构可视化
- `tokei` - 代码统计
- `cloc` - 代码行数统计
---
## 10. 参考资源
- **C4 模型**: 系统架构可视化的四层模型
- **UML 类图**: 面向对象系统的标准表示
- **事件风暴**: 领域驱动设计的建模方法
- **架构决策记录 (ADR)**: 记录架构决策的最佳实践