我有一个由数千个中等大小(数百字节)对象组成的数据结构,每个对象代表一个更大数据集的一个子集。这不是最优的,原因有几个(分析大范围时的复杂性、垃圾收集器的压力等)
从概念上讲,您可以想象代表一天的气象数据的对象,而整个数据集是一年的数据(比如说)。简单的例子:
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):段对象非常轻量级且不可变。这是否使它成为结构的良好候选者?结构字段之一是引用是否重要?将结构用于看起来可变但实际上不是的类型是不好的形式吗?