Saya memiliki kelas yang digunakan untuk memproses pembayaran pelanggan. Semua kecuali satu dari metode kelas ini adalah sama untuk setiap pelanggan, kecuali satu yang menghitung (misalnya) berapa banyak pengguna berutang kepada pelanggan. Ini dapat sangat bervariasi dari pelanggan ke pelanggan dan tidak ada cara mudah untuk menangkap logika perhitungan dalam sesuatu seperti file properti, karena bisa ada sejumlah faktor khusus.
Saya bisa menulis kode jelek yang beralih berdasarkan pada customerID:
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
tetapi ini membutuhkan pembangunan kembali kelas setiap kali kita mendapatkan pelanggan baru. Apa cara yang lebih baik?
[Sunting] Artikel "duplikat" sama sekali berbeda. Saya tidak bertanya bagaimana cara menghindari pernyataan switch, saya meminta desain modern yang paling cocok untuk kasus ini - yang bisa saya pecahkan dengan pernyataan switch jika saya ingin menulis kode dinosaurus. Contoh-contoh yang diberikan ada generik, dan tidak membantu, karena pada dasarnya mereka mengatakan "Hei, saklar berfungsi cukup baik dalam beberapa kasus, tidak dalam beberapa kasus lain."
[Sunting] Saya memutuskan untuk memilih jawaban berperingkat teratas (buat kelas "Pelanggan" terpisah untuk setiap pelanggan yang mengimplementasikan antarmuka standar) karena alasan berikut:
Konsistensi: Saya dapat membuat antarmuka yang memastikan semua kelas Pelanggan menerima dan mengembalikan output yang sama, bahkan jika dibuat oleh pengembang lain
Maintainability: Semua kode ditulis dalam bahasa yang sama (Java) sehingga tidak perlu orang lain untuk belajar bahasa pengkodean yang terpisah untuk mempertahankan apa yang seharusnya menjadi fitur mati-sederhana.
Penggunaan Kembali: Jika masalah serupa muncul dalam kode, saya dapat menggunakan kembali kelas Pelanggan untuk menampung sejumlah metode untuk menerapkan logika "khusus".
Keakraban: Saya sudah tahu bagaimana melakukan ini, jadi saya bisa menyelesaikannya dengan cepat dan beralih ke masalah lain yang lebih mendesak.
Kekurangan:
Setiap pelanggan baru membutuhkan kompilasi kelas Pelanggan baru, yang dapat menambah kompleksitas pada bagaimana kami menyusun dan menggunakan perubahan.
Setiap pelanggan baru harus ditambahkan oleh pengembang - orang yang mendukung tidak bisa hanya menambahkan logika ke sesuatu seperti file properti. Ini tidak ideal ... tapi kemudian saya juga tidak yakin bagaimana orang yang mendukung dapat menulis logika bisnis yang diperlukan, terutama jika kompleks dengan banyak pengecualian (seperti yang mungkin terjadi).
Ini tidak akan skala dengan baik jika kami menambahkan banyak, banyak pelanggan baru. Ini tidak diharapkan, tetapi jika itu terjadi kita harus memikirkan kembali banyak bagian lain dari kode serta yang ini.
Bagi Anda yang tertarik, Anda dapat menggunakan Java Reflection untuk memanggil kelas dengan nama:
Payment payment = getPaymentFromSomewhere();
try {
String nameOfCustomClass = propertiesFile.get("customClassName");
Class<?> cpp = Class.forName(nameOfCustomClass);
CustomPaymentProcess pp = (CustomPaymentProcess) cpp.newInstance();
payment = pp.processPayment(payment);
} catch (Exception e) {
//handle the various exceptions
}
doSomethingElseWithThePayment(payment);