if
さまざまなタイプのクラスを処理するために、いくつかの成長する構造を処理するより良い方法を見つけようとしています。これらのクラスは、最終的には、いくつかの追加の状態情報を持つ、異なる値の型 (int、DateTime など) のラッパーです。したがって、これらのクラスの主な違いは、含まれるデータのタイプです。これらはジェネリック インターフェイスを実装していますが、同種のコレクションに保持する必要があるため、非ジェネリック インターフェイスも実装しています。クラス インスタンスは、それらが表すデータのタイプに従って処理され、その伝播はそれに基づいて継続または継続されません。
これは必ずしも .NET または C# の問題ではありませんが、私のコードは C# です。
クラスの例:
interface ITimedValue {
TimeSpan TimeStamp { get; }
}
interface ITimedValue<T> : ITimedValue {
T Value { get; }
}
class NumericValue : ITimedValue<float> {
public TimeSpan TimeStamp { get; private set; }
public float Value { get; private set; }
}
class DateTimeValue : ITimedValue<DateTime> {
public TimeSpan TimeStamp { get; private set; }
public DateTime Value { get; private set; }
}
class NumericEvaluator {
public void Evaluate(IEnumerable<ITimedValue> values) ...
}
私は2つのオプションを考え出しました:
ダブルディスパッチ
私は最近、訪問者パターンと、そのようなケースを処理するための二重ディスパッチの使用について学びました。望ましくないデータが伝播されないようにするため、これは魅力的です (int のみを処理したい場合は、DateTime とは異なる方法で処理できます)。また、さまざまなタイプの処理方法の動作は、ディスパッチを処理する単一のクラスに限定されます。ただし、新しい値の型をサポートする必要がある場合は、かなりのメンテナンスが必要です。
ユニオンクラス
サポートされている各値型のプロパティを含むクラスは、これらの各クラスが格納するものになる可能性があります。値に対する操作は、適切なコンポーネントに影響します。これは、ダブル ディスパッチ戦略よりも複雑ではなく、メンテナンスも少なくて済みますが、「私はそのデータ型を操作しない」という行に沿って区別できなくなるため、すべてのデータが不必要に伝播することを意味します。 "。ただし、新しい型をサポートする必要がある場合は、このクラスに入れるだけで済みます (さらに、新しいデータ型をサポートするために作成する必要がある追加のクラスはすべて)。
class UnionData {
public int NumericValue;
public DateTime DateTimeValue;
}
より良いオプションはありますか?これら 2 つのオプションのいずれかに、私がすべきだとは考えていなかった何かがありますか?