Files
waveform-analysis/DIRECTORY_STRUCTURE_REFACTORING.md
李启源 ea832229da
Some checks failed
CI / verify (push) Has been cancelled
first commit
2026-07-20 10:21:30 +08:00

553 lines
14 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.

# 完整目录结构拆分报告
## 🎉 拆分完成
按照 **doc/03-开发计划.md** 中 1.4 节的规划,已成功完成完整的目录结构拆分。
---
## 📁 新的目录结构
```
src/
├── components/ # Vue 组件
│ ├── WaveformChart.vue # 主图表组件 (1913 行)
│ ├── waveform.ts # 向后兼容导出 (27 行) ✨ 重构
│ ├── waveform-markup.ts # 标注工具 (154 行)
│ ├── index.ts # 组件导出
│ └── WaveformChart.test.ts # 单元测试
├── core/ # 核心引擎(框架无关)✨ 新增
│ ├── data.ts # 数据规范化 (63 行)
│ └── index.ts # 核心模块导出
├── types/ # 类型定义 ✨ 新增
│ ├── chart.ts # 图表类型 (98 行)
│ ├── data.ts # 数据类型 (45 行)
│ └── index.ts # 类型统一导出
├── utils/ # 工具函数 ✨ 新增(阶段 1
│ ├── domain.ts # 域计算 (29 行)
│ ├── formatters.ts # 格式化 (64 行)
│ ├── geometry.ts # 几何计算 (50 行)
│ └── index.ts # 工具统一导出
├── interactions/ # 交互层 ✨ 预留(待阶段 3
│ └── (待添加: zoom.ts, hover.ts, annotation.ts)
├── hooks/ # Vue Composables ✨ 预留(待阶段 3
│ └── (待添加: useChart.ts, useZoom.ts, useAnnotation.ts)
├── data/ # 示例数据
│ └── wData.json
├── test/ # 测试配置
│ └── setup.ts
├── App.vue # Demo 应用
├── main.ts # 应用入口
├── index.ts # 库主入口 ✨ 新增
├── styles.css # 全局样式
└── env.d.ts # TypeScript 声明
```
---
## 📊 模块划分详解
### 1. **types/** - 类型定义层
**职责**:集中管理所有 TypeScript 类型定义
#### `types/chart.ts` (98 行)
- `WaveformPoint` - 波形数据点
- `WaveformDisplayMode` - 显示模式independent/separated/compact
- `WaveformInteractionMode` - 交互模式zoom/select/annotation/vertical-line/range
- `WaveformAnnotation` - 标注数据结构
- `WaveformShape` - 图形数据结构(垂直线/区间)
- `WaveformMarkupSelection` - 标注选择状态
#### `types/data.ts` (45 行)
- `SingleWaveformData` - 单波形数据格式
- `WaveformSeries` - 波形系列
- `WaveformData` - 完整波形数据
- `NormalizedWaveformSeries` - 规范化后的系列
**优势**
- ✅ 类型定义集中管理
- ✅ 易于维护和扩展
- ✅ 避免循环依赖
---
### 2. **core/** - 核心引擎层(框架无关)
**职责**:提供与框架无关的核心数据处理逻辑
#### `core/data.ts` (63 行)
- `normalizeWaveformData()` - 规范化单波形数据
- `normalizeWaveformSeries()` - 规范化波形系列
- ID 唯一性验证
- 数据过滤和排序
- 格式统一化
**特点**
- ✅ 纯 TypeScript无 Vue 依赖
- ✅ 可在任何框架中使用React/Svelte/Angular
- ✅ 易于单独测试
**后续扩展方向**(阶段 2
```
core/
├── data.ts # ✅ 已完成
├── scales.ts # 📝 待添加:比例尺管理
├── axis.ts # 📝 待添加:坐标轴渲染
├── path.ts # 📝 待添加:路径生成
├── layout.ts # 📝 待添加:布局计算
└── downsample.ts # 📝 待添加:降采样算法
```
---
### 3. **utils/** - 工具函数层
**职责**:提供纯函数工具集
#### `utils/domain.ts` (29 行)
- `paddedDomain()` - 计算带边距的数据域
- `buildMinorTicks()` - 生成次要刻度
#### `utils/formatters.ts` (64 行)
- `displayTime()` - 时间单位转换
- `formatEndpointTime()` - 端点时间格式化
- `formatAxisTime()` - 坐标轴时间格式化
- `formatTooltipTime()` - 悬浮提示时间格式化
#### `utils/geometry.ts` (50 行)
- `resolveTrackGeometry()` - 轨道几何布局
- `clamp()` - 数值范围限制
**特点**
- ✅ 所有函数都是纯函数
- ✅ 完整的 JSDoc 注释
- ✅ 易于单独测试和复用
---
### 4. **components/** - Vue 组件层
**职责**Vue 组件和标注工具
#### `components/WaveformChart.vue` (1913 行)
- 主波形图组件
- 保持不变(已在阶段 1 简化)
#### `components/waveform.ts` (27 行) - ✨ 重构为重新导出
```typescript
// 向后兼容层
export type { ... } from '../types'
export { ... } from '../core'
```
**优势**
- ✅ 保持向后兼容
- ✅ 旧代码无需修改导入路径
- ✅ 内部使用新的模块结构
#### `components/waveform-markup.ts` (154 行)
- 标注和图形工具函数
- 已更新为使用 `../types` 导入
---
### 5. **interactions/** - 交互层(预留)
**规划**:抽取交互逻辑(阶段 3
```
interactions/
├── zoom.ts # 缩放平移逻辑
├── hover.ts # 悬浮交互逻辑
└── annotation.ts # 标注交互逻辑
```
**预期收益**
- 交互逻辑模块化
- 可独立测试
- 可复用到其他图表组件
---
### 6. **hooks/** - Vue Composables预留
**规划**:抽取可复用的 Vue 组合式函数(阶段 3
```
hooks/
├── useChart.ts # 图表状态管理
├── useZoom.ts # 缩放行为 Hook
├── useAnnotation.ts # 标注管理 Hook
└── useHover.ts # 悬浮状态 Hook
```
**预期收益**
- 逻辑复用性提升
- 组件代码减少 ~500 行
- 易于在其他组件中使用
---
### 7. **src/index.ts** - 库主入口 ✨ 新增
**职责**:提供统一的公共 API
```typescript
// 导出组件
export { default as WaveformChart } from './components/WaveformChart.vue'
// 导出类型
export type { WaveformPoint, WaveformData, ... } from './types'
// 导出核心功能
export { normalizeWaveformSeries, ... } from './core'
// 导出工具函数
export { paddedDomain, formatAxisTime, ... } from './utils'
// 导出标注工具
export { isFiniteAnnotation, ... } from './components/waveform-markup'
```
**优势**
- ✅ 统一的入口点
- ✅ 清晰的 API 导出
- ✅ 便于发布为 npm 包
---
## ✅ 验证结果
### 所有检查通过 ✅
| 检查项 | 状态 | 结果 |
|--------|------|------|
| 单元测试 | ✅ | 24/24 通过 |
| TypeScript 类型检查 | ✅ | 无错误 |
| ESLint 代码规范 | ✅ | 0 错误 0 警告 |
| 向后兼容性 | ✅ | 旧导入路径正常工作 |
---
## 📈 收益分析
### 1. 代码组织
**重构前**
```
src/components/
├── WaveformChart.vue (1975 行 - 巨型文件)
├── waveform.ts (149 行 - 类型+逻辑混杂)
└── waveform-markup.ts (162 行)
```
**重构后**
```
src/
├── types/ (143 行 - 类型定义)
├── core/ (63 行 - 数据处理)
├── utils/ (162 行 - 工具函数)
└── components/ (1913 行 - Vue 组件)
```
**改进**
- ✅ 模块职责清晰
- ✅ 类型、逻辑、工具分离
- ✅ 易于定位和修改
---
### 2. 可维护性
| 维度 | 重构前 | 重构后 | 提升 |
|------|--------|--------|------|
| 单文件平均行数 | 762 | 219 | ✅ 71% ↓ |
| 模块内聚性 | 低 | 高 | ✅ 显著提升 |
| 依赖关系 | 混乱 | 清晰 | ✅ 单向依赖 |
| 新人理解成本 | 高 | 低 | ✅ 目录即文档 |
---
### 3. 可扩展性
**新增功能时的改动范围**
| 场景 | 重构前 | 重构后 |
|------|--------|--------|
| 添加新的数据格式 | 修改 waveform.ts | 只修改 core/data.ts |
| 添加新的图表类型 | 修改 waveform.ts | 只修改 types/chart.ts |
| 添加新的工具函数 | 混在组件中 | 添加到对应 utils 模块 |
| 添加新的交互模式 | 修改巨型组件 | 添加到 interactions/ |
**改进**
- ✅ 修改范围最小化
- ✅ 降低回归风险
- ✅ 支持并行开发
---
### 4. 可测试性
**测试覆盖率提升路径**
```
当前测试WaveformChart.test.ts (24 个测试)
扩展测试:
├── types/ (类型定义 - 无需测试)
├── core/data.test.ts (10+ 测试)
├── utils/domain.test.ts (5+ 测试)
├── utils/formatters.test.ts (8+ 测试)
├── utils/geometry.test.ts (5+ 测试)
└── components/ (保留 24 个集成测试)
```
**预期收益**
- ✅ 测试粒度更细
- ✅ 单元测试运行更快
- ✅ 易于定位失败原因
---
### 5. 跨框架复用
**核心模块现在可以在任何框架中使用**
```typescript
// React 项目中使用
import { normalizeWaveformSeries } from '@/waveform-analysis/core'
import { paddedDomain } from '@/waveform-analysis/utils'
// Svelte 项目中使用
import type { WaveformData } from '@/waveform-analysis/types'
import { formatAxisTime } from '@/waveform-analysis/utils'
// Node.js 服务端使用
const { normalizeWaveformData } = require('@/waveform-analysis/core')
```
**优势**
- ✅ 核心逻辑可复用
- ✅ 降低迁移成本
- ✅ 支持多端共享
---
## 🎯 依赖关系图
```
┌─────────────────────────────────────────────────┐
│ App.vue (Demo 应用) │
└────────────────┬────────────────────────────────┘
┌────────────────▼────────────────────────────────┐
│ components/WaveformChart.vue (Vue 组件) │
│ - 导入 types/* │
│ - 导入 utils/* │
│ - 导入 core/* │
└────────┬────────┬────────┬───────────────────────┘
│ │ │
┌────▼───┐ ┌─▼────┐ ┌─▼────┐
│ types/ │ │utils/│ │core/ │
│ │ │ │ │ │
└────────┘ └──────┘ └──┬───┘
┌───▼────┐
│ types/ │
└────────┘
```
**依赖规则**
- ✅ 单向依赖(从上到下)
- ✅ 无循环依赖
- ✅ 底层模块无 Vue 依赖
---
## 🚀 后续扩展路线
### 短期1-2 周)
**阶段 2抽取核心引擎**
```
core/
├── data.ts # ✅ 已完成
├── scales.ts # 📝 比例尺管理
├── axis.ts # 📝 坐标轴渲染
├── path.ts # 📝 路径生成
└── layout.ts # 📝 布局计算
```
**预期收益**:主组件减少 ~400 行
---
### 中期3-4 周)
**阶段 3抽取 Composables**
```
hooks/
├── useZoom.ts # 📝 缩放逻辑
├── useHover.ts # 📝 悬浮逻辑
├── useAnnotations.ts # 📝 标注管理
└── useSelection.ts # 📝 选择状态
```
**预期收益**:主组件减少 ~500 行
---
### 长期1-2 月)
**阶段 4组件拆分**
```
components/
├── WaveformChart.vue # 主容器 (~400 行)
├── WaveformTrack.vue # 单轨道
├── WaveformAnnotation.vue # 标注渲染
├── WaveformTooltip.vue # 悬浮提示
└── WaveformToolbar.vue # 工具栏
```
**最终目标**
- 主组件 ~400 行(减少 80%
- 单文件平均 ~150 行
- 完整的模块化架构
---
## 📚 向后兼容性
### 旧代码无需修改 ✅
```typescript
// 旧的导入方式仍然可用
import {
WaveformChart,
type WaveformData,
type WaveformAnnotation,
} from './components'
// 或者
import { WaveformData } from './components/waveform'
// 新的推荐方式
import { WaveformChart, type WaveformData } from './index'
```
**保证**
- ✅ 所有旧导入路径正常工作
- ✅ API 完全兼容
- ✅ 无破坏性变更
---
## 📖 开发指南
### 添加新类型
```typescript
// 1. 在 types/ 中定义
// src/types/chart.ts
export interface WaveformNewFeature {
// ...
}
// 2. 在 types/index.ts 导出
export type { WaveformNewFeature } from './chart'
// 3. 在 src/index.ts 导出
export type { WaveformNewFeature } from './types'
```
---
### 添加新工具函数
```typescript
// 1. 在 utils/ 对应模块中实现
// src/utils/formatters.ts
export function formatNewValue(value: number): string {
// ...
}
// 2. 在 utils/index.ts 导出
export { formatNewValue } from './formatters'
// 3. 在 src/index.ts 导出
export { formatNewValue } from './utils'
```
---
### 添加核心功能
```typescript
// 1. 在 core/ 中实现
// src/core/downsample.ts
export function downsampleData(points: WaveformPoint[]): WaveformPoint[] {
// ...
}
// 2. 在 core/index.ts 导出
export { downsampleData } from './downsample'
// 3. 在 src/index.ts 导出
export { downsampleData } from './core'
```
---
## ✨ 总结
### 完成情况 ✅
-**目录结构完全按规划实施**
-**所有测试通过24/24**
-**类型检查通过**
-**代码规范检查通过**
-**向后兼容性保证**
### 核心收益
| 维度 | 改善 |
|------|------|
| 代码组织 | ✅ 清晰的分层架构 |
| 可维护性 | ✅ 单文件平均减少 71% |
| 可扩展性 | ✅ 模块化添加功能 |
| 可测试性 | ✅ 支持细粒度测试 |
| 可复用性 | ✅ 核心逻辑跨框架 |
### 模块统计
| 模块 | 文件数 | 代码行数 |
|------|--------|----------|
| types/ | 3 | 143 |
| core/ | 2 | 63 |
| utils/ | 4 | 162 |
| components/ | 4 | 2094 |
| **总计** | **13** | **2462** |
### 下一步
项目现在具备了**清晰的模块化架构**,可以支持:
- ✅ 快速添加新功能
- ✅ 多人并行开发
- ✅ 独立测试和优化
- ✅ 跨框架复用核心逻辑
---
**拆分完成时间**: 2026-07-18
**验证状态**: ✅ 所有检查通过
**向后兼容**: ✅ 完全兼容