2

数千の中規模 (数百バイト) のオブジェクトで構成されるデータ構造があり、それぞれがより大きなデータセットのサブセットを表しています。これはいくつかの理由で最適ではありません (大きなスコープを分析するときの複雑さ、ガベージ コレクターへの負担など)。

概念的には、データセット全体が (たとえば) 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 つが参照であることは重要ですか? 変更可能に見えるが実際にはそうではない型に構造体を使用するのは悪い形式ですか?

4

2 に答える 2

2

非常に興味深い問題とアプローチ!

よくわかりませんが、これらのパターンはとと見なされる可能性があると思いFlyweightますAdapter

sourcemaking.comからのフライ級

  • 共有を使用して、多数のきめの細かいオブジェクトを効率的にサポートします。
  • 重量のあるウィジェットを軽量のガジェットに置き換えるMotifGUI戦略。

temperatures配列がに格納されていることを保持していYearDataます。これは、DayDataファクトリと見なすことができます。

また、アダプター

  • クラスのインターフェースを、クライアントが期待する別のインターフェースに変換します。アダプタを使用すると、インターフェイスに互換性がないために他の方法では機能しなかったクラスを連携させることができます。
  • 既存のクラスを新しいインターフェースでラップします。
  • インピーダンスは古いコンポーネントを新しいシステムに一致させます

したがって、DayDataそのように公開することで、クライアントが必要とするインターフェイスを提供することになります

また、DayDateが構造体であるかどうかはわかりません。この回答で、構造体をいつどのように使用するかについての適切な説明を確認できます。

于 2013-02-28T21:54:55.847 に答える
1

フライ級、恐るべし。

これにより、大きなデータを最適な方法でパックできますが、単一のデータごとに余分なオブジェクトがあるかのように装うことができます。

于 2013-02-28T22:19:58.053 に答える