Müşteri ödemelerini işleme koymak için kullanılan bir sınıfım var. Bu sınıfın yöntemlerinden biri hariç tümü, her müşterinin kullanıcı için ne kadar borçlu olduğunu hesaplayan (örneğin) her müşteri için aynıdır. Bu, müşteriden müşteriye büyük ölçüde değişebilir ve herhangi bir sayıda özel faktör olabileceğinden, özellikler dosyası gibi bir şeydeki hesaplamaların mantığını yakalamanın kolay bir yolu yoktur.
CustomerID dayalı anahtarları çirkin kod yazabilirim:
switch(customerID) {
case 101:
.. do calculations for customer 101
case 102:
.. do calculations for customer 102
case 103:
.. do calculations for customer 103
etc
}
ancak bu, her yeni müşteri aldığımızda sınıfın yeniden oluşturulmasını gerektirir. Daha iyi yol nedir?
[Düzenle] "Yinelenen" makale tamamen farklı. Bir anahtar ifadesinden nasıl kaçınacağımı sormuyorum , bu durum için en iyi olan modern tasarımı istiyorum - dinozor kodunu yazmak istersem bir anahtar ifadesiyle çözebilirim. Burada verilen örnekler geneldir ve yardımcı değildir, çünkü aslında "Hey, anahtar bazı durumlarda oldukça iyi çalışır, bazılarında değil."
[Düzenle] Aşağıdaki nedenlerle en üst sıradaki cevaba (standart bir arayüz uygulayan her müşteri için ayrı bir "Müşteri" sınıfı oluşturmaya) karar verdim:
Tutarlılık: Başka bir geliştirici tarafından oluşturulmuş olsa bile, tüm Müşteri sınıflarının aynı çıktıyı almasını ve döndürmesini sağlayan bir arabirim oluşturabilirim
Sürdürülebilirlik: Tüm kodlar aynı dilde (Java) yazılmıştır, bu nedenle son derece basit bir özellik olması için kimsenin ayrı bir kodlama dili öğrenmesine gerek yoktur.
Yeniden kullanım: Kodda benzer bir sorunun ortaya çıkması durumunda, "özel" mantığı uygulamak için herhangi bir sayıda yöntemi tutmak için Müşteri sınıfını yeniden kullanabilirim.
Tanıdıklık: Bunu nasıl yapacağımı zaten biliyorum, bu yüzden çabucak halledebilir ve diğer daha acil konulara geçebilirim.
Dezavantajları:
Her yeni müşteri, değişiklikleri derleme ve uygulama şeklimize biraz karmaşıklık kazandırabilecek yeni Müşteri sınıfının derlenmesini gerektirir.
Her yeni müşterinin bir geliştirici tarafından eklenmesi gerekir - bir destek personeli mantığı sadece özellikler dosyası gibi bir şeye ekleyemez. Bu ideal değil ... ama sonra da bir Destek görevlisinin gerekli iş mantığını nasıl yazabileceğinden emin değildim, özellikle de birçok istisna dışında karmaşıksa (muhtemelen).
Birçok yeni müşteri eklersek iyi ölçeklenmez. Bu beklenmiyor, ancak eğer gerçekleşirse, kodun birçok parçasını ve bunun yanı sıra yeniden düşünmek zorundayız.
İlgilenenler için, bir sınıfı ada göre çağırmak için Java Reflection uygulamasını kullanabilirsiniz:
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);