flag값 bool값이나 String일수 있고 플래그 성 매개변수는 조건문에 쓰입니다.

플래그를 쓰는건 별로 좋지 않다.

플래그를 사용하는것이면 메서드가 많은 일을 하고있다.

public LocalDate deliveryDate(Order order, boolean isRush) {
        if (isRush) {
            int deliveryTime = switch (order.getDeliveryState()) {
                case "WA", "CA", "OR" -> 1;
                case "TX", "NY", "FL" -> 2;
                default -> 3;
            };
            return order.getPlacedOn().plusDays(deliveryTime);
        } else {
            int deliveryTime = switch (order.getDeliveryState()) {
                case "WA", "CA" -> 2;
                case "OR", "TX", "NY" -> 3;
                default -> 4;
            };
            return order.getPlacedOn().plusDays(deliveryTime);
        }
    }

해당 코드에서 플래그 값으로 넘겨서 분기처리를 진행했다. 그러면 이제 테스트를 진행하거나 값을 사용할 때

@Test
    void deliveryDate() {
        LocalDate placedOn = LocalDate.of(2021, 12, 15);
        Order orderFromWA = new Order(placedOn, "WA");

        Shipment shipment = new Shipment();
        assertEquals(placedOn.plusDays(1), shipment.deliveryDate(orderFromWA, true));
        assertEquals(placedOn.plusDays(2), shipment.deliveryDate(orderFromWA, false));
    }

으로 인자값을 넘기는데 사실 저렇게 보면 뭐가 true고 뭐가 false인지 직관적으로 보기가 너무너무 불편하다. 이를 해결하기위해 메서드를 찢어서 매개변수에 플래그값을 넣지않는 습관을 길러야한다.

public LocalDate regularDeliveryDate(Order order) {
        int deliveryTime = switch (order.getDeliveryState()) {
            case "WA", "CA" -> 2;
            case "OR", "TX", "NY" -> 3;
            default -> 4;
        };
        return order.getPlacedOn().plusDays(deliveryTime);
    }

    public LocalDate rushDeliveryDate(Order order) {
        int deliveryTime = switch (order.getDeliveryState()) {
            case "WA", "CA", "OR" -> 1;
            case "TX", "NY", "FL" -> 2;
            default -> 3;
        };
        return order.getPlacedOn().plusDays(deliveryTime);
    }

위에 코드에서 기능이 두개가 보이는데 분기별로 그것을 메서드로 짜르고

@Test
    void deliveryDate() {
        LocalDate placedOn = LocalDate.of(2021, 12, 15);
        Order orderFromWA = new Order(placedOn, "WA");

        Shipment shipment = new Shipment();
        assertEquals(placedOn.plusDays(1), shipment.rushDeliveryDate(orderFromWA));
        assertEquals(placedOn.plusDays(2), shipment.regularDeliveryDate(orderFromWA));
    }

메서드를 저런식으로 작성하였다. 이를통해 어떤 일을 하는지 직관적으로 확인할 수 있게 되었다.

플래그값은 최대한 사용하지않으며 항상 다른방법으로 접근하는것이 중요하다.