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 문이 모든 경우를 제대로 다루지 않는다고 경고할 수 있습니다.

좋은 웹페이지 즐겨찾기