"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용

더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용

2024-11-09에 게시됨
검색:583

Don’t use if-else blocks anymore! Use Strategy and Factory Pattern Together

if-else 블록에 빠져 복잡한 조건과 반복적인 코드로 어려움을 겪는 프로젝트를 진행하면서 우리는 해결책을 찾습니다. 그런데 왜 우리는 if-else 블록에 갇혀 있어야 할까요? 이번 글에서는 전략 패턴과 팩토리 패턴을 함께 사용하여 if-else 혼동을 없애는 방법을 알아보겠습니다.

문제: If-Else 혼동

전자 상거래 애플리케이션을 개발 중이고 신용 카드, 직불 카드, 암호화폐 등 다양한 결제 방법을 지원해야 한다고 가정해 보겠습니다. 결제를 처리하려면 if-else 블록으로 시작하세요.

public class PaymentService {

    public void processPayment(String paymentType) {
        if (paymentType.equals("CREDIT_CARD")) {
            System.out.println("Processing credit card payment...");
        } else if (paymentType.equals("DEBIT_CARD")) {
            System.out.println("Processing debit card payment...");
        } else if (paymentType.equals("CRYPTO")) {
            System.out.println("Processing crypto payment...");
        } else {
            throw new IllegalArgumentException("Invalid payment type");
        }
    }
}

처음에는 간단해 보일 수 있지만 결제 방법이 증가함에 따라 if-else도 복잡해집니다. 새로운 결제 방법은 새로운 조건을 추가하는 것을 의미합니다. 그 결과 관리하기 어려운 코드 더미가 탄생했습니다. 그리고 이 방법은 개방-폐쇄 원칙에 위배됩니다.

하지만 전략 패턴과 팩토리 패턴을 모두 사용하여 이 문제를 해결할 수 있습니다.

먼저 열거형을 만들어 보겠습니다.

public enum PaymentType {
    CREDIT_CARD,
    DEBIT_CARD,
    CRYPTO
}

해결책: 전략 패턴으로 정리

public interface PaymentStrategy {
    void pay(PaymentRequest request);
}

public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}

public class DebitCardPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}

public class CryptoPayment implements PaymentStrategy {
    @Override
    public void pay(PaymentRequest request) {
        System.out.println("Processing $type payment".replace("$type", String.valueOf(request.getPaymentType())));
    }
}

이 단계에서는 각 결제 방법에 대한 별도의 전략이 공통 인터페이스에서 구현됩니다. 이제 Factory Pattern을 통해 어떤 전략을 선택할지 결정하겠습니다.

2단계: 팩토리 패턴을 사용한 전략 선택

이 단계에서는 EnumMap을 사용하여 Factory Pattern을 더욱 깔끔하게 만들고 최적화할 수 있습니다.

public class PaymentFactory {
    private static final Map strategies = new EnumMap(PaymentType.class);

    static {
        strategies.put(PaymentType.CREDIT_CARD, new CreditCardPayment());
        strategies.put(PaymentType.DEBIT_CARD, new DebitCardPayment());
        strategies.put(PaymentType.CRYPTO, new CryptoPayment());
    }

    public static PaymentStrategy getPaymentStrategy(PaymentType paymentType) {
        PaymentStrategy strategy = strategies.get(paymentType);

        if (Objects.isNull(strategy))
            throw new IllegalArgumentException("Strategy not found");

        return strategy;
    }
}

마지막 단계: 서비스 클래스 재구성

이제 우리가 수행한 작업을 사용해 보겠습니다.

public class PaymentService {

    public void processPayment(PaymentRequest request) {
        // Don't forget to check objects if null!
        if (Objects.isNull(request) || Objects.isNull(request.getPaymentType())
            throw new IllegalArgumentException("Request can not be null!");
        PaymentStrategy strategy = PaymentFactory.getPaymentStrategy(request.getPaymentType());

        strategy.pay(request);
    }
}

현재로서는 결제 처리를 위해 if-else 블록이 필요하지 않습니다. 전략 및 팩토리 패턴 덕분에 우리 코드는 더욱 깔끔하고 모듈화되었으며 확장 가능합니다.

왜 이 패턴을 사용해야 할까요?

1. 확장성: 새 결제 방법을 추가하려면 새 클래스와 몇 줄의 코드만 필요합니다.
2. 가독성: if-else 블록 대신 전략과 팩토리를 사용하면 코드를 더 이해하기 쉽고 관리하기 쉽게 만들 수 있습니다.
3. 유지 관리성: 전략과 팩토리 패턴을 사용하면 다른 코드 부분에 영향을 주지 않고 코드를 변경할 수 있습니다.

결론: 혼란에서 명확함으로

성장하는 프로젝트를 진행 중인 경우 if-else 블록을 사용하면 안 됩니다. 전략 및 팩토리 패턴은 코드를 더 깔끔하고, 모듈식이며, 유지 관리 가능하게 만드는 완벽한 솔루션입니다.

이 기사에서 볼 수 있듯이 if-else 블록 대신 디자인 패턴을 사용하여 결제 거래를 관리하면 프로젝트 개발이 더 쉬워지고 코드 가독성이 향상됩니다. if-else 블록을 사용하는 대신 다음 프로젝트에서 이러한 패턴을 사용해 보세요.

...

제 글을 읽어주셔서 감사합니다! 질문이나 피드백, 공유하고 싶은 생각이 있으시면 댓글로 듣고 싶습니다.

이 주제와 내 다른 게시물에 대한 자세한 내용을 보려면 dev.to에서 나를 팔로우하세요.

감사합니다??

LinkedIn에서 나를 팔로우하려면: https://www.linkedin.com/in/tamerardal/
중간: 더 이상 if-else 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용

릴리스 선언문 이 기사는 https://dev.to/tamerardal/dont-use-if-else-blocks-anymore-use-strategy-and-factory-pattern-together-4i77?1에서 복제됩니다. 침해가 있는 경우, 문의: Study_golang@163 .comdelete
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3