2013-03-26 1 views
-1

나는 C#으로 통합/시스템 테스트를 작성을위한 작은 도서관을 구현하면서 와서 문제에 대한 당신의 의견에 관심이 있어요. 라이브러리는 2 부분으로 구성됩니다. 테스트 제작 API 및 테스트 런타임 API입니다. 테스트 작성자는 제작 API를 사용하여 테스트 계획 프로토 타입을 작성합니다. 런타임은 프로토 타입을 가져 와서 프로토 타입의 런타임 표현을 으로 만들고 실행할 수 있습니다.일부 클래스의 인스턴스를 사전 키로 사용하지 않도록 지정하는 방법은 무엇입니까?

라는 이름의 클래스를 테스트 할 수 RuntimeTestPlanBuilder 나는 전체 런타임 객체 모델 클래스의 Equals 메서드를 재정의했다. 이로 인해 GetHashCode 메서드도 재정의해야하는 상황이 발생했습니다. 일부 런타임 개체 모델 클래스에 대해 GetHashCode를 구현하는 것은 쉽습니다. 런타임 모델의 일부 클래스는 GetHashCode를 구현하는 컨테이너이기 때문에 런타임이 컨테이너에 항목을 추가 할 수 있으므로 (예 : O (1)에서 해시 코드를 계산할 수 없기 때문에) 힘들고 심지어 불가능했습니다.

은 결과적으로 나 자신이 키와 사전에 그들을 넣어 컨테이너의 사용자를 방지하는 방법을 생각해 냈다. 내가 선택한 솔루션은 GetHashCode 메서드를 재정의하고 예외를 throw하는 것입니다. 이 솔루션은 런타임에만 실패하므로 만족스럽지 않습니다. 게다가 .Net Framework 디자이너가 GetHashCode 메서드를 Object 클래스에두기로 결정한 이유가 궁금합니다. 나는 용기를 합법적 인 사전 키가 아닌 것으로 표시 할 수 없기 때문에 이러한 결정이 내 상황을 초래했다고 생각합니다.

닷넷 프레임 워크 설계자에게 더 나은 결정은 Ihashable이라는 인터페이스를 Equals 및 GetHashCode의 두 가지 방법으로 정의하고 일반 사전 항목 유형에 대한 제약 조건을 사용하여 인터페이스를 적용하는 것일 수 있습니다. 이 방법으로 컴파일 타임에 키가 Equals와 GetHashCode를 구현할 수 있습니다. 또한이 인터페이스를 구현하지 않는 클래스는 사전 키로 사용되지 않아야한다는 것을 쉽게 이해할 수 있습니다.

내 질문은 : GetHashCode의 예외를 throw하지 않는 더 나은 솔루션을 제안하여 일부 클래스의 인스턴스를 사전 키로 사용해서는 안된다는 사실을 제안 할 수 있습니까?

감사

+0

문제 클래스에 Equals() 메서드를 어떻게 구현하고 있습니까? GetHashCode()를 구현하는 것은 Equals()를 구현하는 것보다 어렵지 않아야합니다. –

+0

기본적으로 2 개의 컨테이너는 항목 수가 동일하고 같은 위치의 모든 항목이 같으면 동일합니다. – Ikaso

+0

@PieterGeerkens - 내 문항을 특정 컨텍스트가 아닌 좀 더 폭 넓은 맥락에서 생각해보십시오. 일부 클래스를 합법적 인 사전 키가 아닌 것으로 표시하는 방법은 무엇입니까? – Ikaso

답변

0

object를이 다섯 개 가지 방법을 구현하기 위해 가정 및 GetHashCode 그들 중 하나입니다.
GetHashCode의 현재 또는 향후의 사용이 사전 키에만 해당되는지 확신 할 수 없습니다.

유일한 규칙은 동일한 두 개의 오브젝트가 동일한 GetHashCode 있어야한다.
그러나 동일한 GetHashCode는 두 개체가 동일하다는 것을 의미하지 않습니다.

GetHashCode에 상수 (1)를 사용하거나 컨테이너에있는 항목 수만 사용할 수 있습니다.
또는 일반적으로, 두 개체는 그들이 항상 해당 될 경우 동등한 자신을보고해야 스키트

is-it-possible-to-combine-hash-codes-for-private-members-to-generate-a-new-hash

0

에서이 대답을 참조; mutable collection을 포함한 변경 가능한 객체는 일반적으로 서로 동등한 것으로 간주되어야합니다. 변경할 수없는 컬렉션은 GetHashCode() 멤버의 값을 캐싱하여 효율적으로 GetHashCode을 구현할 수 있습니다. 생성은 O (N)이고 해시 코드가 객체 생성시 계산되는지 또는 객체 생성시 처음 요구 될 때 계산할 총 수명 비용은 최대 O (N)입니다.

모든 클래스가 해시 코드를 구현하는 데 어려움을 겪을 이유는 없습니다. 클래스가 참조 동등성을 사용하는 경우 기본값 GetHashCode이 완벽합니다.가변성의 동등한 정의를 사용하는 경우, 단순한 정수를 돌려줌으로써 GetHashCode() 계약을 준수 할 수 있습니다. 예를 들어 몇 가지 인스턴스 이상을 사전에 넣으려고하면 성능이 떨어질 수 있지만 예를 들어 사전을 사용하는 사람이있을 수 있습니다. 그 안에 12 개의 항목이 있고 그 크기의 사전으로 성능이 좋을 것입니다.