내 시스템에서 나는 자주 공항 코드 (작동 "YYZ"
, "LAX"
, "SFO"
, 등), 그들은 (대문자로 표시 3 문자) 정확한 항상 동일한 형식. 이 시스템은 일반적으로 API 요청 당 25-50 개의 이러한 (다른) 코드를 처리하며 총 1,000 개가 넘는 할당을 처리하며 응용 프로그램의 여러 계층을 통해 전달되며 평등을 위해 자주 비교됩니다.
우리는 문자열을 전달하는 것으로 시작했습니다. 약간 잘 작동했지만 3 자리 코드가 예상되는 어딘가에 잘못된 코드를 전달하여 많은 프로그래밍 실수를 신속하게 발견했습니다. 또한 대소 문자를 구분하지 않고 비교 해야하는 문제가 발생하여 버그가 발생하지 않았습니다.
이로부터 문자열 전달을 중단 Airport
하고 공항 코드를 가져와 유효성을 검사하는 단일 생성자가있는 클래스를 만들기로 결정했습니다 .
public sealed class Airport
{
public Airport(string code)
{
if (code == null)
{
throw new ArgumentNullException(nameof(code));
}
if (code.Length != 3 || !char.IsLetter(code[0])
|| !char.IsLetter(code[1]) || !char.IsLetter(code[2]))
{
throw new ArgumentException(
"Must be a 3 letter airport code.",
nameof(code));
}
Code = code.ToUpperInvariant();
}
public string Code { get; }
public override string ToString()
{
return Code;
}
private bool Equals(Airport other)
{
return string.Equals(Code, other.Code);
}
public override bool Equals(object obj)
{
return obj is Airport airport && Equals(airport);
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
public static bool operator ==(Airport left, Airport right)
{
return Equals(left, right);
}
public static bool operator !=(Airport left, Airport right)
{
return !Equals(left, right);
}
}
이를 통해 코드를 이해하기 쉽게 만들었고 평등 검사, 사전 / 집합 사용법을 단순화했습니다. 이제 메소드 Airport
가 예상 한대로 작동 하는 인스턴스를 허용하면 메소드 검사를 널 참조 검사로 단순화했습니다.
그러나 내가 알아 차린 것은 가비지 수집이 훨씬 더 자주 실행되어 수집되는 많은 인스턴스를 추적했습니다 Airport
.
이것에 대한 나의 해결책은를로 변환하는 것이 었 class
습니다 struct
. 대부분 그냥 키워드 변경은 제외했다 GetHashCode
및 ToString
:
public override string ToString()
{
return Code ?? string.Empty;
}
public override int GetHashCode()
{
return Code?.GetHashCode() ?? 0;
}
default(Airport)
사용 된 경우를 처리합니다 .
내 질문 :
Airport
클래스를 만들 거나 일반적인 솔루션을 만들었습니까? 아니면 유형을 만들어서 잘못된 문제를 해결하거나 잘못된 방법으로 문제를 해결하고 있습니까? 좋은 해결책이 아니라면 더 좋은 해결책은 무엇입니까?응용 프로그램
default(Airport)
이 사용되는 인스턴스를 어떻게 처리해야 합니까? 유형은default(Airport)
내 응용 프로그램에 무의미하므로if (airport == default(Airport) { throw ... }
인스턴스Airport
(및 그Code
속성)를 얻는 것이 작업 에 중요한 곳에서하고 있습니다.
참고 : C # / VB struct – 주어진 구조에 유효하지 않은 기본값이 0 인 사례를 피하는 방법을 검토했습니다. 내 질문을하기 전에 struct 를 사용하거나 사용하지 않지만 , 내 질문은 자체 게시물을 보증하기에 충분히 다르다고 생각합니다.
default(Airport)
문제를 해결할 수있는 한 가지 방법 은 단순히 기본 인스턴스를 허용하지 않는 것입니다. 매개 변수가없는 생성자를 작성하고 던지 InvalidOperationException
거나 던져서 그렇게 할 수 있습니다 NotImplementedException
.