SORU
7 Mayıs 2010, Cuma


Kaçınarak Java örneğin

Bir zincir olan "" bir operasyon olarak kabul edilir "code smell". örneğin Standart cevap"". polimorfizmi Nasıl bu durumda bunu yapar mıydım?

Bir temel sınıf alt sınıfları vardır; bunların hiçbiri benim kontrolüm altında. Benzer bir durum sınıfları Tamsayı Java, Çift, BigDecimal gibi olurdu.

if (obj instanceof Integer) {NumberStuff.handle((Integer)obj);}
else if (obj instanceof BigDecimal) {BigDecimalStuff.handle((BigDecimal)obj);}
else if (obj instanceof Double) {DoubleStuff.handle((Double)obj);}

NumberStuff üzerinde kontrolü var.

Birkaç satır yapacağını kod satırı kullanmak istemiyorum. (Bazen ben HashMap bir eşleme İntegerStuff bir örneği, BigDecimal.class BigDecimalStuff vb bir örnek için Integer.class olun. Ama bugün daha basit bir şey istiyorum.)

Bir şey bu kadar basit istiyorum:

public static handle(Integer num) { ... }
public static handle(BigDecimal num) { ... }

Ama Java sadece bu şekilde çalışmıyor.

Biçimlendirirken statik yöntemleri kullanmak istiyorum. Biçimlendirme olduğum şeylerden bir Thing1 Thing2s ve bir Thing2 Thing1s bir dizi içerebilir bir dizi içeren bileşik. Bu benim gibi bir hale getirilmesini hayata bir sorunum vardı:

class Thing1Formatter {
  private static Thing2Formatter thing2Formatter = new Thing2Formatter();
  public format(Thing thing) {
      thing2Formatter.format(thing.innerThing2);
  }
}
class Thing2Formatter {
  private static Thing1Formatter thing1Formatter = new Thing1Formatter();
  public format(Thing2 thing) {
      thing1Formatter.format(thing.innerThing1);
  }
}

Evet, HashMap ve biraz daha fazla kod bunu da düzeltebilirim. Ama "örneğin" kıyasla çok okunabilir ve sürdürülebilir gibi görünüyor. Basit bir şey ama kokmuyor var mı?

Not ekledi 5/10/2010:

Yeni alt sınıflar muhtemelen gelecekte eklenecektir çıkıyor, ve benim mevcut kod onları düzgün bir şekilde işlemek gerekir. Sınıf HashMap Sınıfı bulunmaz çünkü bu durumda işe yaramaz. İf zinciri, en özel ve en genel olan biten, muhtemelen tüm bunlardan sonra en iyisidir:

if (obj instanceof SubClass1) {
    // Handle all the methods and properties of SubClass1
} else if (obj instanceof SubClass2) {
    // Handle all the methods and properties of SubClass2
} else if (obj instanceof Interface3) {
    // Unknown class but it implements Interface3
    // so handle those methods and properties
} else if (obj instanceof Interface4) {
    // likewise.  May want to also handle case of
    // object that implements both interfaces.
} else {
    // New (unknown) subclass; do what I can with the base class
}

CEVAP
7 Mayıs 2010, Cuma


Steve Yegge Amazon blogdan bu girdi ilginizi çekebilir: "when polymorphism fails". Aslında polimorfizmi çözer daha fazla sorun neden olduğunda, bu gibi durumlarda hitap ediyor.

Konu polimorfizmi kullanma mantığı yapmak zorunda "" her bir parçası '' sınıf - yani tam sayı vb. anahtarlama kolu bu durumda. Açıkça bu pratik değil. Hatta bazen mantıksal olarak kod koymak için doğru yer değil. 'Örneğin' olarak en az birkaç kötülüklerin yaklaşım. o önerir

Kokan kod yazmak zorunda olduğu tüm durumlarda olduğu gibi, kokusu dışarı sızıntı yok ki bir yöntem olarak düğmeli (ya da en fazla bir sınıf).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Google Россия

    Google Ро

    9 Temmuz 2007
  • Apple&Tech Reviews & Giveaways

    Apple&Tech R

    12 Temmuz 2008
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009