问题描述
market/data.go 的 Format() 函数中存在大量重复代码。5m、15m、1h 三个周期的指标格式化逻辑几乎完全相同。
重复代码位置
market/data.go:737-831(约 95 行重复代码)
重复模式
每个周期都有相同的 7 个字段格式化:
- MidPrices
- EMA20Values
- MACDValues
- RSI7Values
- RSI14Values
- Volume
- ATR14Values
当前代码结构:
```go
if data.IntradaySeries != nil {
sb.WriteString("Intraday series (5‑minute intervals):\n\n")
if len(data.IntradaySeries.MidPrices) > 0 { ... }
if len(data.IntradaySeries.EMA20Values) > 0 { ... }
// ... 7个字段
}
if data.MidTermSeries15m != nil {
sb.WriteString("Mid‑term series (15‑minute intervals):\n\n")
if len(data.MidTermSeries15m.MidPrices) > 0 { ... } // 重复!
// ... 完全相同的 7 个字段
}
if data.MidTermSeries1h != nil {
// ... 再次重复
}
```
建议方案
方案 1:定义通用接口
```go
type TimeframeData interface {
GetMidPrices() []float64
GetEMA20Values() []float64
GetMACDValues() []float64
GetRSI7Values() []float64
GetRSI14Values() []float64
GetVolume() []float64
GetATR14Values() []float64
}
func formatTimeframeSeries(sb *strings.Builder, title string, data TimeframeData) {
if data == nil { return }
sb.WriteString(title)
writeSliceIfNotEmpty(sb, "Mid prices", data.GetMidPrices())
writeSliceIfNotEmpty(sb, "EMA indicators (20‑period)", data.GetEMA20Values())
// ...
}
```
方案 2:使用反射(不推荐,性能损耗)
方案 3:统一数据结构
将 IntradayData、MidTermData15m、MidTermData1h 合并为单一结构体,通过 Timeframe 字段区分。
影响范围
market/types.go - 可能需要添加接口方法
market/data.go - Format() 函数重构
- 无 API 变更
优先级
低 - 代码能工作,但维护成本高(改一处需改三处)
Labels
- refactor
- tech-debt
- good first issue
问题描述
market/data.go的Format()函数中存在大量重复代码。5m、15m、1h 三个周期的指标格式化逻辑几乎完全相同。重复代码位置
market/data.go:737-831(约 95 行重复代码)重复模式
每个周期都有相同的 7 个字段格式化:
当前代码结构:
```go
if data.IntradaySeries != nil {
sb.WriteString("Intraday series (5‑minute intervals):\n\n")
if len(data.IntradaySeries.MidPrices) > 0 { ... }
if len(data.IntradaySeries.EMA20Values) > 0 { ... }
// ... 7个字段
}
if data.MidTermSeries15m != nil {
sb.WriteString("Mid‑term series (15‑minute intervals):\n\n")
if len(data.MidTermSeries15m.MidPrices) > 0 { ... } // 重复!
// ... 完全相同的 7 个字段
}
if data.MidTermSeries1h != nil {
// ... 再次重复
}
```
建议方案
方案 1:定义通用接口
```go
type TimeframeData interface {
GetMidPrices() []float64
GetEMA20Values() []float64
GetMACDValues() []float64
GetRSI7Values() []float64
GetRSI14Values() []float64
GetVolume() []float64
GetATR14Values() []float64
}
func formatTimeframeSeries(sb *strings.Builder, title string, data TimeframeData) {
if data == nil { return }
sb.WriteString(title)
writeSliceIfNotEmpty(sb, "Mid prices", data.GetMidPrices())
writeSliceIfNotEmpty(sb, "EMA indicators (20‑period)", data.GetEMA20Values())
// ...
}
```
方案 2:使用反射(不推荐,性能损耗)
方案 3:统一数据结构
将
IntradayData、MidTermData15m、MidTermData1h合并为单一结构体,通过Timeframe字段区分。影响范围
market/types.go- 可能需要添加接口方法market/data.go- Format() 函数重构优先级
低 - 代码能工作,但维护成本高(改一处需改三处)
Labels