2010-07-29 11 views
9

क्या आप एक अच्छा जावा ऑब्जेक्ट ग्राफ़ विज़िटर लाइब्रेरी जानते हैं?जावा ऑब्जेक्ट ग्राफ विज़िटर लाइब्रेरी

मैं एक वस्तु और उसके उप घटकों पर जाएँ और जब कुछ शर्तें मिलान किया जाता है कुछ कार्रवाई करने के लिए चाहते हैं।

उदाहरण उपयोग:

    एक विशाल डोमेन वस्तु ग्राफ पर
  • , एक विशाल डोमेन वस्तु ग्राफ पर null
  • करने के लिए प्रत्येक आईडी रीसेट, एक TreeSet उदाहरण ही युक्त के साथ प्रत्येक Set की जगह तत्वों।

मुझे लाइब्रेरी चाहिए, कस्टम कोड नहीं क्योंकि ऑब्जेक्ट ग्राफ़ को घुमाने में मुश्किल हो सकती है। आप संग्रह, सरणियों, प्रॉक्सी को संभालने के लिए है, और इतने पर ... मैं Xstream के पुन: उपयोग हिस्सा इस लक्ष्य को हासिल करने के लिए के बारे में सोचना है, लेकिन यह इतना आसान नहीं दिखता है: Xstream आगंतुक से अधिक वस्तु स्वयं संशोधन वस्तु परिवर्तन पर उन्मुख है ।

+0

+1, दिलचस्प सवाल! –

उत्तर

1

ऐसा करने के लिए आपको पुस्तकालय की आवश्यकता क्यों है?

को देखते हुए आप इस फिर एक डोमेन वस्तु ग्राफ है निर्दिष्ट करें कि क्यों नहीं परिभाषित करने और अपने डोमेन वस्तुओं विभिन्न आगंतुक कार्यान्वयन द्वारा दौरा करने की अनुमति के लिए प्रासंगिक इंटरफेस को लागू? कार्यान्वयन में से एक (जैसा कि आप निर्दिष्ट करते हैं) प्रत्येक आईडी को null पर रीसेट कर सकता है।

उदाहरण

पहले इंटरफेस वस्तुओं है कि आगंतुकों के रूप में दौरा किया जा सकता है या अधिनियम द्वारा लागू किया जाना परिभाषित करते हैं।

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

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

अब दो डोमेन ऑब्जेक्ट क्लास को परिभाषित करें, जिनमें से दोनों का दौरा किया जा सकता है।

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

अब एक ठोस आगंतुक कार्यान्वयन कि कुछ उपयोगी करता परिभाषित:

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

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

मैंने आपके प्रश्न को आपके प्रासंगिक उत्तर के बारे में परिष्कृत किया है। मेरा डोमेन बहुत बड़ा है और मेरे ग्राफ जटिल हैं। तो मुझे कुछ मजबूत और पहले ही डीबग और उपयोग करने के लिए तैयार होना चाहिए। – Guillaume

+0

आईएमओ आपने उबेर-जेनेरिक होने की कोशिश करके समस्या को मुश्किल बना दिया है। लाइब्रेरी में बिंदु क्या है जो किसी भी * ऑब्जेक्ट ग्राफ़ (संभवतः प्रतिबिंब द्वारा) को पार कर सकता है और फिर दिए गए ऑब्जेक्ट्स पर * कोई विधि * कॉल कर सकता है? आप प्रभावी रूप से किसी भी संकलन-समय प्रकार की सुरक्षा को फेंक देते हैं। आखिरकार यह तर्क दिया जा सकता है कि कोई भी ओओ एप्लीकेशन वस्तुओं के सबसेट पर ऑब्जेक्ट ग्राफ़ और कॉलिंग विधियों को आसानी से चला रहा है। – Adamski

+0

मैं उबेर-जेनेरिक नहीं बनना चाहता हूं। मेरा डोमेन उबर-जटिल है;) और वैसे, यह है कि XStream जैसे serialization उपकरण कैसे काम कर रहे हैं। और वे ठीक काम करते हैं। – Guillaume

1

कैसे एक्सएमएल में अपने वस्तु ग्राफ वास्ते और कुछ मानक XML हैंडलिंग/हेरफेर लाइब्रेरी का उपयोग कर के बारे में?

+0

यह एक अच्छा सुझाव है, लेकिन यदि संभव हो तो मैं इससे बचना चाहता हूं। यह कुछ और कदम जोड़ता है जो मैं चाहता हूं कि मैं – Guillaume

+0

से बच सकूं, ये कदम क्या होंगे? – Jatin

+0

'ऑब्जेक्ट सेल्फ संशोधन' भाग को शायद बहुत से कस्टम कोड की आवश्यकता होगी ... – Guillaume

1

यह Neo4j या TitanDB की तरह एक ग्राफ डेटाबेस कोशिश कर रहा लायक हो सकता है। इससे आपको अपने डेटा सेट को पार करने और रिश्तों का पता लगाने के लिए प्रश्नों का उपयोग करके विज़िट को प्रभावित करने दिया जाएगा।

इनमें से दोनों डेटा लोडिंग और पूछताछ को सुविधाजनक बनाने के लिए व्यापक जावा एपीआई हैं।

2

ऐसा होता है, मैं ऐसी बात कर चुके हैं। वास्तव में एक पुस्तकालय नहीं है, लेकिन यह आसानी से एक में बढ़ सकता है।

लेकिन मैं इस पर ठोकर खाई के बाद से मैं कुछ बेहतर करने के लिए देख रहा था। मैं इसे बाहर नहीं दे सकता, और यह निश्चित रूप से अभी तक एक ऐसे राज्य में नहीं है जहां मैं ऐसा करूँगा, लेकिन हो सकता है कि ऐसी चीज ओएस के रूप में रहें?

जो मैंने मुझे ऑब्जेक्ट ग्राफ़ प्रकार-सुरक्षित, उदाहरण-दर-उदाहरण को पार करने और संशोधित करने की अनुमति दी है, वैकल्पिक रूप से इसे डुप्लिकेट करने जैसे मूल अवशेष छूटे हैं। जावा बीटीडब्ल्यू।कुछ भी काम करता है जो ग्राफ में किनारों को पकड़ रहा है (किनारों, यदि आप चाहते हैं)।

जो मैं कल्पना कर सकता हूं वह संचालन की स्पष्ट परिभाषा है (जैसे संशोधित, विस्तार, डुप्लिकेट, पतन, ट्रैवर्स) और संबंधित अपूर्णताएं। Orthigonal पहलुओं जैसे पहचान subgraphs ठीक से फैक्टर किया जाएगा।

ऐसी परियोजना में रुचि रखने वाले किसी भी व्यक्ति को कृपया उत्तर दें, शायद हम कुछ शुरू कर सकते हैं।