Я пытаюсь найти лучший способ обработки некоторых растущих 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) ...
}
Я предложил два варианта:
Двойная отправка
Я недавно узнал ошаблон Visitor и его использование двойной отправки для обработки именно такого случая.Это привлекательно, потому что это позволило бы нежелательным данным не распространяться (если мы хотим обрабатывать только int, мы можем обрабатывать это иначе, чем DateTime).Кроме того, поведение того, как обрабатываются различные типы, будет ограничено одним классом, который обрабатывает диспетчеризацию.Но есть большая поддержка, если / когда должен поддерживаться новый тип значения.
Класс объединения
Класс, который содержит свойство для каждого типа значенияПоддерживается то, что хранит каждый из этих классов.Любая операция со значением будет влиять на соответствующий компонент.Это менее сложно и требует меньшего обслуживания, чем стратегия двойной диспетчеризации, но это будет означать, что каждый фрагмент данных будет распространяться без необходимости, так как вы больше не сможете различать по типу «Я не оперирую этим типом данных».».Однако, если / когда необходимо поддерживать новые типы, они должны входить только в этот класс (плюс любые дополнительные классы, которые необходимо создать для поддержки нового типа данных).
class UnionData {
public int NumericValue;
public DateTime DateTimeValue;
}
Есть ли лучшеопции?Есть ли что-то в этих двух вариантах, которые я не учел?