C# - 열거형 및 버그 복원력
4289 단어 csharp
int
) 또는 모든 부울( bool
)과 같이 사소하지만 종종 주문의 가능한 상태( Incomplete
, Unpaid
, Paid
, Shipped
등).데이터베이스에서 가능한 각 값을 나타내는 숫자 또는 문자열을 할당하고 코드에서 이에 대해
Enum
를 사용합니다. 이것은 좋지만 주의하지 않으면 미래의 어느 시점에서 집합의 구성을 변경할 때(예: 다른 상태 추가Received
) 프로그램에서 디버그하기 어려운 오류를 생성할 수 있습니다.이러한 집합을 처리할 때 항상
switch
를 사용하여 집합이 변경될 때 컴파일러가 코드를 변경해야 할 수 있는 모든 위치에 대해 자동으로 경고하도록 합니다.그러나 이것이 까다로운 경우가 한 가지 있습니다. 데이터베이스를 다룰 때입니다. 예를 들어, 지불된 모든 주문을 가져오는 쿼리가 코드에 있으므로 LINQ 조건은 다음과 같을 수 있습니다.
where order.status == OrderStatus.Paid ||
order.status == OrderStatus.Shipped
그러나 이제 새로운
Received
상태를 추가하면 어떻게 될까요? 이 쿼리는 수신된 주문도 지불되기 때문에 이제 깨졌지만 컴파일러는 이를 알 방법이 없습니다!이 작업을 안전하게 하려면 어떻게든
switch
를 추가해야 합니다. 우리가 해야 할 일은 열거형의 모든 요소를 조건에 따라 필터링하는 것입니다.IEnumerable<OrderStatus> GetOrderStatusValuesWhichArePaid() {
static bool IsPaid(OrderStatus orderStatus) => orderStatus switch {
OrderkStatus.Incomplete => false,
OrderkStatus.Unpaid => false,
OrderkStatus.Paid => true,
OrderkStatus.Shipped => true,
_ => throw new ArgumentOutOfRangeException(nameof(orderStatus))
};
return Enum.GetValues<OrderStatus>().Where(IsPaid);
}
LINQ 쿼리에서 사용할 수 있습니다.
var paidStatusValues = GetOrderStatusValuesWhichArePaid();
var query = from order in Orders
where paidStatusValues.Contains(order.status)
select order;
이제 새로운
Received
상태를 추가하면 컴파일러에서 함수IsPaid
의 switch 문이 모든 경우를 제대로 다루지 않는다고 경고할 수 있습니다.
Reference
이 문제에 관하여(C# - 열거형 및 버그 복원력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/paviad/c-enums-and-bug-resilience-2mb7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)