もう if-else ブロックを使用しないでください。ストラテジとファクトリ パターンを併用する

Mary-Kate Olsen
リリース: 2024-10-19 06:08:31
オリジナル
718 人が閲覧しました

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

プロジェクトを進めるとき、if-else ブロックに迷い込み、複雑な条件や反復的なコードに苦戦しながら、解決策を探します。しかし、なぜ if-else ブロックに囚われる必要があるのでしょうか?この記事では、Strategy パターンと Factory パターンとともに、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 も複雑になります。新しい支払い方法とは、新しい条件を追加することを意味します。その結果、管理が困難なコードの山ができてしまいます。そして、この方法はオープンクローズの原則に反します。

しかし、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 を使用して、どの戦略を選択するかを決定します。

ステップ 2: ファクトリ パターンを使用した戦略の選択

このステップでは、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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート