Skip to content

refactor(market): 消除 Format() 函数中的重复代码 #104

Description

@xqliu

问题描述

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions