各次元が設計時に認識される小さなリストである多次元データ構造が必要です。
私のプログラムのさまざまな場所で、厳密に型指定された方法で、さまざまな次元で「スライス」されたデータにアクセスできるようにしたいと考えています。
ネストされたインターフェイスを使用する 2D の例で機能するサンプル コードを以下にいくつか示しましたが、3D または 4D ではかなり恐ろしいものになると思います。@kvb が特定したように、必要なボイラープレート コードは指数関数的に増加します。
誰かがより良い提案をしていますか? つまり、必要なコードをシンプル/短く/理解しやすいものに保ちながら、次の行に沿って物事を行う能力を維持する必要があります。
Data a = new Data(...)
...
SomeMethodThatOnlyCaresAboutRedThings(a.Red) // takes a IBySize<T>
...
SomeMethodThatOnlyCaresAboutBigThings(a.Big) // takes a IByColour<T>
...
これにより、これらのメソッドが関連しないデータ構造の部分について知る必要がなくなり、テストが容易になります。
ここで色/サイズを純粋に例として使用しました。これらの選択が意味のあるものであると誤って誤解させたことをお詫びします. T は、float やその他の単純なデータ構造のような単純なデータ項目である可能性があります。
F# および C# としてタグ付けされているのは、どちらのソリューションでも満足できるからです。
public interface IByColour<T>
{
T Green { get; }
T Red { get; }
T Blue { get; }
}
public interface IBySize<T>
{
T Small { get; }
T Big { get; }
}
internal class ByColour<T> : IByColour<T>
{
public T Green { get; private set; }
public T Red { get; private set; }
public T Blue { get; private set; }
internal ByColour(T green, T red, T blue)
{
Green = green;
Red = red;
Blue = blue;
}
}
internal class BySize<T> : IBySize<T>
{
public T Small { get; private set; }
public T Big { get; private set; }
internal BySize(T small, T big)
{
Small = small;
Big = big;
}
}
public class Data<T> : IByColour<IBySize<T>>, IBySize<IByColour<T>>
{
public IBySize<T> Green { get; private set; }
public IBySize<T> Red { get; private set; }
public IBySize<T> Blue { get; private set; }
public IByColour<T> Small { get; private set; }
public IByColour<T> Big { get; private set; }
public Data(IBySize<T> green, IBySize<T> red, IBySize<T> blue)
{
Green = green;
Red = red;
Blue = blue;
Small = new ByColour<T>(Green.Small, Red.Small, Blue.Small);
Big = new ByColour<T>(Green.Big, Red.Big, Blue.Big);
}
}
編集:「より良い」とはどういう意味か、私のソリューションが持つ望ましい特性を明確にし、それをどのように使用したいかを説明します。