문제

내 도메인 개체 중 일부에는 시작 날짜 및 종료 날짜 속성 쌍으로 날짜 범위가 포함되어 있습니다.

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에 있는 것을 알지 못합니다.

내 경험상 개체 계층 구조를 더 깊게 만들면 상황이 복잡해지는 경우가 많습니다.이러한 개체는 ReportViewer 컨트롤에 의해 표시되는 RDLC 보고서로 전송되지만 이는 부차적인 것입니다.그 반대가 아닌 모델에 대한 뷰를 구부리겠습니다.하지만 우리는 속성 이름에 얽매이지 않으며 다음과 같이 기꺼이 타협할 것입니다.

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 유형으로 오염시키는 것은 매우 더러운 느낌입니다.

도움이 되었습니까?

해결책

아니요, 당신은 범용 수업을 놓치지 않았습니다.

나는있다 Range 입력하십시오 오해 당신이 관심을 가질 수있는 것 - 그리고 그것은 확실히 단순하게 만듭니다. DateTime 시장 조작. Marc의 대답을 언급하면, 이것이 구조인지 또는 수업인지 기억할 수 없습니다. 물론 변경할 수 있습니다.

Marc의 제네릭 셰 나니 건 (shenanigans)으로 인해 (적어도 .NET 3.5를 사용하고 있다고 가정 할 때 - 최소한 2.0으로 가능하지만 현재 지원되지는 않음).

Range<DateTime> range = 19.June(1976).To(DateTime.Today);

foreach (DateTime date in range.Step(1.Days())
{
    // I was alive in this day
}

(또한 생산보다 테스트에 더 유용한 확장 방법을 사용하고 있습니다.)

Marc의 답변의 다른 요점을 다루기 위해 노다 시간 .NET API보다 날짜 개념을 더 적절하게 표현할 수 있지만 현재는 범위와 같은 것이 없습니다 ... 좋은 아이디어입니다. 기능 요청.

다른 팁

.NET 4.0 이상에서 튜플 <> 유형이 여러 값을 처리하기 위해 추가되었습니다.

튜플 유형을 사용하면 자신의 값 조합을 즉석에서 정의 할 수 있습니다. 귀하의 문제는 매우 일반적이며 함수가 여러 값을 반환하려는 경우와 유사합니다. 이전에는 변수를 사용하거나 함수의 응답을 위해 새로운 클래스를 만들어야했습니다.

Tuple<DateTime, DateTime> dateRange =
    new Tuple<DateTime, DateTime>(DateTime.Today, DateTime.Now);

어느 경로를 타지 않든, 나는 당신이 확실히 올바른 접근 방식을 취하고 있다고 생각합니다. 당신은 두 날짜가 함께 짝을 이루는 것에 진정한 의미를 부여하고 있습니다. 그것은 자체 문서화 코드이며 코드의 구조에서 가장 큰 방법입니다.

날짜로 많은 작업을 수행하는 경우에는 범위를 사용하는 것이 편리할 수 있습니다.이것은 실제로 매우 드문 경우 중 하나입니다. ~해야 한다 아마 다음과 같이 쓸 것이다. struct (불변).그러나 "노다 타임"은 아마도 이 모든 것 이상을 제공할 것입니다(완성되면).나는 이전에 스케줄링 소프트웨어를 사용해 본 적이 있습니다.나는 (약간 다른 작업을 위해) 그러한 구조체를 두 개 가지고 있었습니다.

이에 대한 편리한 BCL 구성은 없습니다.

또한 범위가 있을 때 중앙 집중화할 수 있는 모든 훌륭한 방법(및 연산자)을 생각해 보십시오."포함"(날짜/시간?다른 범위의?제한 포함/제외?), "교차", 오프셋 기준(시간 범위) 등ㅏ 명확한 그것을 처리할 유형이 있는 경우입니다.ORM 수준에서는 ORM이 복합 값을 지원하는 경우 이것이 더 쉽습니다. NHibernate가 지원하고 EF 4.0도 지원한다고 생각합니다.

나는 Daterange 특성의 기본 .NET 클래스를 모른다. 가장 가까운 것은 아마도 datetime+timespan 또는 dateTime/dateTime 조합 일 것입니다.

나는 당신이 원하는 것이 상당히 건전하다고 생각합니다.

Mark와 Jon이 이미 언급했듯이, 나는 이것을 가치 유형으로 만들 것입니다. 나는 그것을 구조물로 구현하고 iquationable 및 iComparty interfaces를 구현하기로 결정합니다.

nhibernate와 같은 ORM을 사용할 때는 값 유형을 엔티티를 나타내는 테이블 안에 저장할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top