2010-07-29 28 views
9

Güzel bir java nesnesi grafik ziyaretçi kütüphanesi biliyor musunuz?Java object graph ziyaretçi kütüphanesi

bir nesne ve alt bileşenlerini ziyaret etmek ve bazı koşullar eşleştiğinde bazı eylemleri gerçekleştirmek istiyoruz.

Örnek kullanım: büyük bir alan nesne grafikte

  • , bir TreeSet örneği aynı ihtiva eden her Set yerine, çok büyük bir alan nesne grafikte null
  • her id sıfırlama elementler.

Nesne grafiğini çizmek zor olabileceğinden, özel bir kitaplık değil, kitaplık istiyorum. Koleksiyonları, dizileri, proxy'leri, vb. Işlemek zorundasınız ... Bunu başarmak için XStream'in yeniden kullanımı hakkında bir düşüncem var ama çok da kolay gözükmüyor: Xstream ziyaretçisi, nesne kendini değiştirmeye, nesnenin kendi kendini değiştirmesinden daha .

+0

+1, ilginç soru! –

cevap

1

Bunu yapmak için neden kütüphaneye ihtiyacınız var?

bu ardından bir alan nesne grafiği belirtmek göz önüne alındığında neden tanımlamak ve etki alanı nesneleri farklı ziyaretçi uygulamaları tarafından ziyaret edilmesi için izin alakalı arayüzleri uygulamak? Uygulamalardan biri (belirttiğiniz gibi) her kimliği null'a sıfırlayabilir.

Örnek

ilk ziyaretçi olarak ziyaret veya hareket edilebilir nesneler tarafından uygulanacak arabirimleri tanımlar.

public interface Visitable { 
    void visit(Visitor visitor); 
} 

public interface Visitor { 
    void visitDomainObjectA(DomainObjectA obj); 
    void visitDomainObjectB(DomainObjectB obj); 
} 

Şimdi her ikisi de ziyaret edilebilecek iki etki alanı nesne sınıfı tanımlayın.

public abstract class DomainObject implements Visitable { 
    private Object id; 

    public Object getId() { return this.id; } 
    public void setId(Object id) { this.id = id; } 
} 

public class DomainObjectA extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectA(this); 
    } 
} 

public class DomainObjectB extends DomainObject { 
    public void visit(Visitor visitor) { 
    visitor.visitDomainObjectB(this); 
    } 
} 

Şimdi yararlı bir şeyler yapan bir beton Ziyaretçi uygulama tanımlayın:

public class MyVisitor implements Visitor { 
    public void visitDomainObjectA(DomainObjectA doa) { 
    doa.setId(null); 
    } 

    public void visitDomainObjectB(DomainObjectB dob) { 
    doa.setId(UUID.randomUUID()); 
    } 
} 
+0

İlgili cevabınızla ilgili sorumu düzeltdim. Alanım çok büyük ve grafiklerim karmaşık. Bu yüzden sağlam, zaten ayıklanmış ve kullanıma hazır bir şeye ihtiyacım var. – Guillaume

+0

IMO, uber-jenerik olmaya çalışarak sorunu zorlaştırdınız. Bir kütüphanede * herhangi bir * nesne grafiğini (muhtemelen yansıma ile) hareket ettirebilen ve sonra verilen nesneler üzerinde * herhangi bir yöntemi * arayabilecek nokta nedir? Herhangi bir derleme zamanı tipi güvenliğini etkin bir şekilde atabilirsiniz. Sonuçta, herhangi bir OO uygulamasının sadece bir nesne grafiğini geçtiği ve nesnelerin bir alt kümesindeki yöntemleri çağırdığı iddia edilebilir. – Adamski

+0

Uber-jenerik olmak istemiyorum. Alanım uber-komplike;) Bu arada, XStream gibi serileştirme araçlarının nasıl çalıştığı da bu. Ve iyi çalışıyorlar. – Guillaume

1

Nasıl XML içine nesne grafiği sıralanırken ve bazı standart XML kullanımı/manipülasyon kütüphane kullanımı hakkında?

+0

Bu iyi bir öneri, ancak mümkünse kaçınmak istiyorum. Bu, – Guillaume

+0

'dan kaçınabilmem için daha fazla adımı ekler. Bu adımlar ne olabilir? – Jatin

+0

'nesne kendini değiştirme' bölümü muhtemelen çok sayıda özel kod gereksinimi duyacaktır ... – Guillaume

1

O Neo4j veya TitanDB gibi bir grafik veritabanı denemeye değer olabilir. Veri kümenizi kesiştirmek ve ilişkileri keşfetmek için sorguları kullanarak ziyareti etkilemenize izin verir.

Bunların her ikisi de veri yükleme ve sorgulama kolaylaştırmak için kapsamlı Java API'leri var.

2

Olduğu gibi, böyle bir şey yaptım. Gerçekten bir kütüphane değil, ama kolayca bir tane haline gelebilir.

Ama ben daha iyi bir şey arıyordum beri bu tökezledi. Bunu veremem, ve kesinlikle bunu yapacağım bir eyalette değil, ama belki de böyle bir şey OS olarak yaşamaya gelmeli mi?

Ne var beni çapraz ve türü açısından güvenli, örneğin bazında, örneğin, isteğe bağlı olarak, orijinal dokunulmaz bu şekilde çoğaltarak bir amacı, grafik değiştirme sağlar. Java BTW.Aynı zamanda biraz işe yarayan şey, grafikteki ilişkileri kavramaktır (eğer isterseniz, kenarlar).

Öngörülebildiğim şey, açık ve net bir işlem tanımıdır (örneğin, değiştirme, genişletme, çoğaltma, daraltma, çaprazlama) ve ilgili uygulamalardır. Determig alt grafikleri gibi ortogonal yönler uygun şekilde dışa vurulacaktır.

Böyle bir projeyle ilgilenen herkes cevap verebilir, belki bir şeyler başlayabiliriz.