문제

TimesheetActivity 클래스에는 할당 수집이 있습니다. 할당은 도메인의 다른 개체에서도 사용되는 값 객체입니다.

public class Allocation : ValueObject
{
    public virtual StaffMember StaffMember { get; private set; }
    public virtual TimeSheetActivity Activity { get; private set; }
    public virtual DateTime EventDate { get ... }
    public virtual TimeQuantity TimeSpent { get ... }
}

동일한 할당에 대한 중복 할당이 허용되지 않습니다. 따라서 클라이언트가 활동에 할당하려고 시도하면 동일한 할당에 대한 컬렉션에 이미 할당이 있는지 확인하기 위해 확인합니다. 그렇지 않다면, 새 할당이 컬렉션에 추가되지만, 그렇다면 기존 할당은 새 할당으로 대체됩니다.

나는 현재 컬렉션을 유지하기 위해 사전을 사용하고 있으며 할당 .eventDate를 키로 사용하고 있습니다. 도메인에는 잘 작동하지만 키가 이미 가치의 일부라는 사실이 그 자체가 '나쁜 냄새'가 아니라는 사실이 궁금합니다.

또한 사전 값 외에는 아무것도 지속 할 이유가 없습니다. NHibernate를 사용하고 있기 때문에 사용자 정의 유형을 작성해야 할 수도 있습니다. 다른 유형의 컬렉션을 사용해야한다는 단서인지 궁금합니다. (이것은 또한 할당 클래스의 가상 속성의 이유이기도합니다).

내가 생각하는 주요 대안은 전용 평등을 가진 해시 세트 일 것입니다.

어떻게 생각해?

건배, 베리

도움이 되었습니까?

해결책

외부 비교를 사용하여 수행하는 경우 HashSet<Allocation>, 당신은 사전에서 값을 키우지 않고 날짜를 변경하지 않도록 매우 조심해야합니다. 당신은 어느 쪽이든이 문제가 있지만 돌연변이에 의해 악화됩니다 (적어도 Dictionary<,> 여전히 자체 키와 값을 추적 할 수 있습니다). 키의 일부로 변이 가능한 값을 사용하면 다시는 가치를 보지 못할 위험이 있습니다 ...

과거에 일정 시스템에서 작업했을 때 실제로 사용했습니다. SortedList<,> 이를 위해 - 유사하지만 일반적으로 데이터를 순서대로 원하는 경우 유용하며 데이터가 상당히 균일 한 경우 이진 검색을 허용합니다.

다른 팁

키가 가치의 일부라는 사실이 반드시 문제라고 생각하지는 않습니다. 내 경험상 그것은 종종 사전의 경우입니다. ㅏ HashSet 적절한 평등 비교를 사용하면 현재 객체를 특정 물체에 얻을 필요가없는 한 확실히 작동합니다. EventDate. 그것은 잠재적으로 할 수있는 유용한 일처럼 보입니다 ...

당신은 현재 다소 모호한 방식으로 걱정하고 있습니까, 아니면 이것이 당신을 어떻게 물릴지에 대한 구체적인 의심을 가지고 있습니까?

표준 라이브러리를 사용하면 내가 아는 더 나은 솔루션은 없습니다. 그러나 나는 또한 이런 종류의 코드가 "나쁜 냄새"라고 생각했지만, 코드가 아닌 BCL의 컬렉션 클래스 때문입니다.

MS가 왜 일반 세트를 만들지 않았는지 모르겠습니다<TKey, TData> where TData: IKeyed<TKey> 또는 사전 대신 키가 데이터의 일부인 그러한 데이터 구조를 구현할 수 있기 때문입니다. 그만큼 KeyValuePair<TKey, TValue>: IKeyed<TKey> 이 인터페이스를 구현하는 도우미 구조 일 뿐이므로 현재 가지고있는 것과 동일한 사전 기능을 생성 할 수 있습니다.

또한 (작은 rant를 계속하기 위해) 나는 그들이 선언적 불변 유형의 개념을 추가하지 않았고 가능한 일반적인 유형 제약 조건으로 만드는 이유가 궁금합니다. 런타임 중에 키가 해시 코드를 변경하지 않도록 할 수 있기 때문입니다. 하나가 구현되면 현재 발생합니다 GetHashCode() 그리고 Equals() 약간의 돌연변이 대상에서).

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