Некоторые из моих доменных объектов содержат диапазоны дат в виде пары свойств даты начала и окончания:
public class Period {
public DateTime EffectiveDate { get; set; }
public DateTime ThroughDate { get; set; }
}
public class Timeline {
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
И я обнаружил, что многое из этого:
abstract public int Foo(DateTime startDate, DateTime endDate);
abstract public decimal Bar(DateTime startDate, DateTime endDate);
abstract public ICollection<C5.Rec<DateTime, DateTime>> FooBar(DateTime startDate, DateTime endDate);
Последнее заставило меня задуматься ... Должен ли я реализовать класс DateRange? Я не знаю ни одного в BCL.
По моему опыту, углубление иерархии объектов часто усложняет ситуацию. Эти объекты отправляются в отчеты RDLC, отображаемые элементом управления ReportViewer, но это вторично. Я согну вид модели, а не наоборот. Однако мы не привязаны к именам свойств и готовы пойти на компромисс с чем-то вроде:
public class DateRange {
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
Period p = new Period();
DateTime t = p.EffectiveDateRange.StartDate;
Преимуществом класса DateRange будет централизованная проверка даты окончания, наступающей после даты начала, и это упростит сигнатуры моего метода:
abstract public int Foo(DateRange dateRange);
abstract public decimal Bar(DateRange dateRange);
abstract public ICollection<DateRange> FooBar(DateRange dateRange);
Я просто не уверен, что класс DateRange не доставит мне больше неприятностей, чем стоит. Мнения?
Дополнительный вопрос: я где-то пропустил универсальный класс кортежей общего назначения в BCL? Я знаю, что есть несколько очень специфических, плавающих в разных пространствах имен. Загрязнение моих сигнатур методов общественного достояния типами C5 выглядит очень, очень грязно.