数千の中規模 (数百バイト) のオブジェクトで構成されるデータ構造があり、それぞれがより大きなデータセットのサブセットを表しています。これはいくつかの理由で最適ではありません (大きなスコープを分析するときの複雑さ、ガベージ コレクターへの負担など)。
概念的には、データセット全体が (たとえば) 1 年間のデータである場合、1 日の気象データなどを表すオブジェクトを想像できます。些細な例:
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);
}
}
このようにして、1 つの巨大で寿命の長いオブジェクトを保持し、データの分析用に寿命の短い小さなオブジェクトを多数保持できます。GC はより快適になり、データセット全体に対して直接分析を行うことがより簡単になりました。
私の質問は、まず、このパターンには名前がありますか? かなり一般的なパターンのようです。
2 つ目 (.NET 固有): セグメント オブジェクトは非常に軽量で不変です。それは構造体になるための良い候補になりますか? 構造体フィールドの 1 つが参照であることは重要ですか? 変更可能に見えるが実際にはそうではない型に構造体を使用するのは悪い形式ですか?