2

我有一个由数千个中等大小(数百字节)对象组成的数据结构,每个对象代表一个更大数据集的一个子集。这不是最优的,原因有几个(分析大范围时的复杂性、垃圾收集器的压力等)

从概念上讲,您可以想象代表一天的气象数据的对象,而整个数据集是一年的数据(比如说)。简单的例子:

class YearData
{
   private readonly DayData[] days = new DayData[365];
   public DayData GetDayData(int dayNumber)
   {
      return days[dayNumber];
   }
}

class DayData
{
   private readonly double[] temperatures = new double[24];
   public double GetTemperature(int hour)
   {
      return temperatures[hour];
   }     
   public void SetTemperature(int hour, double temperature)
   {
      temperatures[hour] = temperature;
   }
}       

在重构工作中,我尝试将数据移动到表示整个数据集的单个对象,但为了保持其余代码不变(并且简单),我需要表示数据子集/段的对象。例子:

class YearData
{
   private readonly double[] temperatures = new double[365*24];   

   public DayData GetDayData(int day)
   {
      return new DayData(this, day);
   } 

   internal double GetTemperature(int day, int hour)
   {
      return temperatures[day*24 + hour];
   }

   internal double SetTemperature(int day, int hour, double temperature)
   {
      temperatures[day*24 + hour] = temperature;
   }
}

class DayData // or struct?
{
    private readonly YearData yearData;
    private readonly int dayNumber;
    public DayData(YearData yearData, int dayNumber)
    {
       this.yearData = yearData;
       this.dayNumber = dayNumber;
    }
    public double GetTemperature(int hour)
    {
       return yearData.GetData(dayNumber, hour);
    }
    public void SetTemperature(int hour, double temperature)
    {
       yearData.SetData(dayNumber, hour, temperature);
    }
}

通过这种方式,我可以拥有一个巨大且长期存在的对象,并且我可以保留许多小的短期对象来分析数据。GC 更快乐,直接对整个数据集进行分析现在不那么复杂了。

我的问题是,首先:这种模式有名字吗?似乎它应该是很常见的模式。

第二(特定于.NET):段对象非常轻量级且不可变。这是否使它成为结构的良好候选者?结构字段之一是引用是否重要?将结构用于看起来可变但实际上不是的类型是不好的形式吗?

4

2 回答 2

2

非常有趣的问题和方法!

我不确定,但我认为这些模式可能被认为是 aFlyweight和 an Adapter

来自sourcemaking.comFlyweight

  • 使用共享有效地支持大量细粒度对象。
  • 用轻量级小工具替换重量级小部件的 Motif GUI 策略。

您所持有的temperatures数组存储在 中YearData,可以看作是一个 DayData Factory。

还有一个适配器

  • 将一个类的接口转换为客户期望的另一个接口。Adapter 让那些因为接口不兼容而无法协同工作的类。
  • 用新接口包装现有类。
  • 阻抗匹配旧组件到新系统

因此,通过公开DayData这种方式,您正在提供客户想要的接口

另外,我不确定 DayDate 是一个结构,您可以在此答案中查看有关何时以及如何使用结构的很好的解释

于 2013-02-28T21:54:55.847 回答
1

蝇量级,绝对。

它允许您以最佳方式打包大数据,但仍然假装您对每个单独的数据都有一个额外的对象。

于 2013-02-28T22:19:58.053 回答