Rumah  >  Artikel  >  Java  >  Jangan gunakan blok if-else lagi! Gunakan Strategi dan Corak Kilang Bersama

Jangan gunakan blok if-else lagi! Gunakan Strategi dan Corak Kilang Bersama

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-19 06:08:31721semak imbas

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

Ketika kami bergerak ke hadapan dalam projek, tersesat dalam blok if-else, bergelut dengan keadaan yang rumit dan kod berulang, kami mencari penyelesaian. Tetapi mengapa kita harus terperangkap dalam blok if-else? Dalam artikel ini, mari temui cara untuk menghilangkan kekeliruan jika-lain bersama-sama dengan corak Strategi dan Kilang.

Masalah: Jika-Lain Kekeliruan

Katakanlah anda sedang membangunkan aplikasi e-dagang dan anda perlu menyokong kaedah pembayaran yang berbeza seperti kad kredit, kad debit dan mata wang kripto. Anda bermula dengan blok if-else untuk memproses pembayaran:

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");
        }
    }
}

Walaupun ia kelihatan mudah pada mulanya, apabila kaedah pembayaran meningkat, begitu juga dengan kerumitan if-else. Kaedah pembayaran baharu bermakna menambah syarat baharu. Hasilnya ialah timbunan kod yang sukar diurus. Dan kaedah ini bertentangan dengan Prinsip Terbuka-Tutup.

Tetapi, kita boleh menggunakan kedua-dua corak Strategi dan Kilang untuk menyelesaikan masalah ini.

Mula-mula, mari buat enum:

public enum PaymentType {
    CREDIT_CARD,
    DEBIT_CARD,
    CRYPTO
}

Penyelesaian: Pembersihan dengan Corak Strategi

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())));
    }
}

Pada peringkat ini, strategi berasingan untuk setiap kaedah pembayaran dilaksanakan daripada antara muka biasa. Kini, dengan Factory Pattern, kami akan memutuskan strategi mana yang hendak dipilih.

Langkah 2: Memilih Strategi dengan Corak Kilang

Dalam langkah ini, kita boleh menjadikan Corak Kilang lebih bersih dan dioptimumkan dengan 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;
    }
}

Langkah Terakhir: Penyusunan Semula Kelas Perkhidmatan

Sekarang, mari gunakan apa yang telah kita lakukan.

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);
    }
}

Sebenarnya, kami tidak memerlukan sebarang blok if-else untuk pemprosesan pembayaran. Terima kasih kepada Strategi dan Corak Kilang, kod kami lebih bersih, modular dan boleh dikembangkan.

Mengapa Kita Perlu Menggunakan Corak Ini?

1. Kebolehlanjutan: Menambah kaedah pembayaran baharu hanya memerlukan kelas baharu dan beberapa baris kod.
2. Kebolehbacaan: Dengan menggunakan strategi dan kilang dan bukannya blok if-else, anda menjadikan kod anda lebih mudah difahami dan terurus.
3. Kebolehselenggaraan: Dengan strategi dan corak kilang, perubahan pada kod boleh dibuat tanpa menjejaskan bahagian kod lain.

Kesimpulan: Daripada Kekeliruan kepada Kejelasan

Jika anda sedang mengusahakan projek yang sedang berkembang, anda tidak seharusnya menggunakan blok if-else. Corak Strategi dan Kilang ialah penyelesaian yang sempurna untuk menjadikan kod anda lebih bersih, modular dan boleh diselenggara.

Seperti yang anda boleh lihat dalam artikel ini, menggunakan corak reka bentuk dan bukannya blok if-else untuk mengurus transaksi pembayaran menjadikan projek lebih boleh dibangunkan dan meningkatkan kebolehbacaan kod. Cuba corak ini dalam projek anda yang seterusnya dan bukannya menggunakan blok if-else.

...

Terima kasih kerana membaca artikel saya! Jika anda mempunyai sebarang soalan, maklum balas atau pendapat yang ingin anda kongsikan, saya ingin mendengarnya dalam ulasan.

Anda boleh mengikuti saya di dev.to untuk mendapatkan maklumat lanjut tentang topik ini dan siaran saya yang lain.

Terima kasih!?‍??

Untuk mengikuti saya di LinkedIn: https://www.linkedin.com/in/tamerardal/
Sederhana: Jangan gunakan blok if-else lagi! Gunakan Strategi dan Corak Kilang Bersama

Atas ialah kandungan terperinci Jangan gunakan blok if-else lagi! Gunakan Strategi dan Corak Kilang Bersama. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn