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을 통해 어떤 전략을 선택할지 결정하겠습니다.
이 단계에서는 EnumMap을 사용하여 Factory Pattern을 더욱 깔끔하게 만들고 최적화할 수 있습니다.
public class PaymentFactory { private static final Mapstrategies = 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 블록을 사용하지 마세요! 전략과 팩토리 패턴을 함께 사용
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3