プロジェクトを進めるとき、if-else ブロックに迷い込み、複雑な条件や反復的なコードに苦戦しながら、解決策を探します。しかし、なぜ if-else ブロックに囚われる必要があるのでしょうか?この記事では、Strategy パターンと Factory パターンとともに、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 も複雑になります。新しい支払い方法とは、新しい条件を追加することを意味します。その結果、管理が困難なコードの山ができてしまいます。そして、この方法はオープンクローズの原則に反します。
しかし、Strategy パターンと Factory パターンの両方を使用して、この問題を解決できます。
まず、列挙型を作成しましょう:
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 を使用してファクトリー パターンをクリーンにし、最適化することができます。
public class PaymentFactory { private static final Map<PaymentType, PaymentStrategy> 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 ブロックは必要ありません。 Strategy と Factory Patterns のおかげで、私たちのコードはよりクリーンで、モジュール化され、拡張可能になりました。
1.拡張性: 新しい支払い方法を追加するには、新しいクラスと数行のコードのみが必要です。
2.可読性: if-else ブロックの代わりにストラテジとファクトリーを使用すると、コードがより理解しやすく、管理しやすくなります。
3.保守性: ストラテジとファクトリー パターンを使用すると、他のコード部分に影響を与えることなくコードを変更できます。
成長中のプロジェクトに取り組んでいる場合は、if-else ブロックを使用しないでください。ストラテジー パターンとファクトリー パターンは、コードをよりクリーンでモジュール化し、保守しやすくするための完璧なソリューションです。
この記事でわかるように、if-else ブロックの代わりにデザイン パターンを使用して支払いトランザクションを管理すると、プロジェクトの開発が容易になり、コードの可読性が向上します。次のプロジェクトでは、if-else ブロックを使用する代わりに、これらのパターンを試してください。
...
私の記事を読んでいただきありがとうございます!ご質問、フィードバック、共有したい考えがございましたら、ぜひコメント欄でお聞かせください。
このトピックや私の他の投稿の詳細については、dev.to で私をフォローしてください。
ありがとうございます!???
LinkedIn で私をフォローするには: https://www.linkedin.com/in/tamerardal/
中: if-else ブロックはもう使用しないでください。ストラテジーとファクトリーパターンを併用する
以上がもう if-else ブロックを使用しないでください。ストラテジとファクトリ パターンを併用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。