2011-01-07 28 views
5

से इंटरफेस निकालने का स्वचालित तरीका मुझे कंक्रीट क्लासेस का संग्रह मिला है जो एक एपीआई परिभाषित करता है, और मैं इन वर्गों (यानी: अनिवार्य रूप से प्रकार पदानुक्रम और सार्वजनिक विधियों) के इंटरफ़ेस को निकालना चाहता हूं। एपीआई के वास्तविक कार्यान्वयन।जावा क्लास

तो उदाहरण के लिए अगर एपीआई में सार्वजनिक वर्गों में से एक है

public class Foo extends Bar { 
    /* some fields which I don't care about */ 

    public void method() { 
    /* implementation here */ 
    } 

    public void otherMethod() { 
    /* implementation goes here */ 
    } 

    /* some non public methods which I don't care about */ 

} 

मैं एक अंतरफलक और एक कार्यान्वयन में तोड़ चाहते हैं

यानी

public interface FooInterface extends BarInterface { 
    public void method(); 
    public void otherMethod() 
} 

public class Foo implements FooInterface { 
    /* etc etc */ 
} 

और

क्या कोई उपकरण है जिसका उपयोग मैं इस अलगाव को स्वचालित तरीके से करने के लिए कर सकता हूं, या मैं हूं नौकरी करने के लिए अपना खुद का कार्यक्रम रोल करना होगा? इसे एक ऐसा उपकरण होना जरूरी है जिसके लिए न्यूनतम बातचीत की आवश्यकता हो।

उत्तर

5

मुझे समाधान मिला!

ग्रहण, स्क्रिप्ट को रीफैक्टर करने के लिए समर्थन है, स्क्रिप्ट्स अभी भी बहुत ही मानवीय अनुकूल नहीं हैं, लेकिन मैंने स्क्रिप्ट जेनरेट की हैं जो ग्रहण को सभी रिफैक्टरिंग करने में सक्षम बनाती हैं।

ग्रहण स्क्रिप्ट रिफैक्टरिंग, look here की जानकारी के लिए और ग्रहण उपयोग करती हैं इसलिए आप जानते हैं कि स्क्रिप्ट की तरह

+0

यह वही है जो मैं ढूंढ रहा था (मेरे पास सटीक परिदृश्य है जिसका आप उल्लेख करते हैं)! आपके द्वारा उपयोग की जाने वाली रीफैक्टरिंग स्क्रिप्ट साझा करने का कोई मौका? मैं इसे ग्रहण करने के लिए एक्लिप्स में स्पेलंक करने जा रहा हूं, लेकिन मैं किसी भी मदद का उपयोग कर सकता हूं। अग्रिम में धन्यवाद! – scorpiodawg

+0

वाह, "स्क्रिप्ट" में उत्पन्न एक्सएमएल सुंदर नहीं है (एक्लिप्स इंडिगो के रूप में)। यदि मुझे इससे कुछ उपयोगी मिल जाए तो वापस रिपोर्ट करेंगे। – scorpiodawg

3

कई IDEs, IntelliJ की तरह, एक "निकालें इंटरफ़ेस" कमांड जो आप के लिए एक पुनर्रचना करता है: http://www.jetbrains.com/idea/features/refactoring.html#Extract_Interface

+1

क्या यह एक साथ कई फाइलों पर काम कर सकता है? आइए कहें कि पैकेज में सभी वर्गों का चयन करें और इंटरफेस एक्सट्रैक्शन करें? – hhafez

+1

यदि आप "शुद्धता" के लिए सभी फाइलों में ऐसा कर रहे हैं तो मेरा सुझाव है कि आप पुनर्विचार करेंगे कि आप वास्तव में क्या लाभ प्राप्त कर रहे हैं। व्यक्तिगत रूप से, मैं इंटरफ़ेस निकाल दूंगा जहां और जब यह समझ में आया और बाकी सब कुछ छोड़ दें। लेकिन फिर, मुझे आपकी तर्क पता नहीं है। – Synesso

+0

यह "शुद्धता" के लिए नहीं है और यह प्रत्येक वर्ग के लिए नहीं होगा, लेकिन एक-एक करके ऐसा करना कठिन होगा। – hhafez

1

मैं यकीन है कि आप इस काम करने के लिए अपने स्वयं के उपकरण रोल करना होगा हूँ, यह ऐसा कुछ नहीं है जो कई डेवलपर उपयोग करेंगे, और जिन्होंने इसका उपयोग किया है, वे अक्सर इसका उपयोग नहीं करेंगे। इंटरफ़ेस निकालें, सही करने के लिए, वास्तव में इसे बुद्धिमानी (वास्तविक प्रकार) की आवश्यकता है। एक उपकरण जिसने सभी सार्वजनिक & संरक्षित तत्वों को अंधाधुंध निकाला, और कार्यान्वयन पदानुक्रम को दर्पण करने के लिए अंधेरे से एक इंटरफेस पदानुक्रम बनाया, स्मार्ट से बहुत दूर है, और अंतिम उत्पाद सुंदर नहीं होगा। क्या शामिल करना है और क्या आगे बढ़ना है इसके बारे में अच्छे निर्णय लेने के लिए (कृत्रिम) बुद्धि विकसित करना - यह एक उपयोगी उपकरण होगा, लेकिन मैं अपने लिए अकल्पनीय रूप से मुश्किल मानता हूं। वर्तमान आईडीई क्या पेशकश करते हैं - निर्देशित सहायता - शायद सबसे अच्छा समझौता है। खुश हो जाओ; हाथ से हर कदम करने से यह काफी कम कठिन है!

+0

मैं सामान्य रूप से सहमत हूं कि आउटपुट सुंदर नहीं होगा, लेकिन यह एक शुरुआती बिंदु है और यह वही होता है जो मुझे इस विशेष परिस्थिति में चाहिए (एपीआई जिसे मैं अपवर्तक करना चाहता हूं वास्तव में किसी अन्य उपकरण से स्वत: उत्पन्न होता है, इसलिए संरचना वास्तव में है अच्छी तरह से परिभाषित और इसलिए इस मामले में रिफैक्टरिंग उपकरण काफी स्मार्ट हो सकता है) – hhafez

3

javap, JDK में एक उपकरण दिखना चाहिए आप के लिए कुछ उदाहरण उत्पन्न करने के लिए, आप क्या का सबसे मिल जाएगा चाहते हैं। हालांकि, इसके लिए कुछ चीजों को सही तरीके से संभालने के लिए तैयार रहें - क्षमा करें, मैं भूल जाता हूं, शायद एनोटेशन, आंतरिक कक्षाएं, ऐसा कुछ।

यदि आप में javap embedding जावा अनुप्रयोग ही मदद मिलेगी, तो आप कुछ इस तरह कर सकते हैं:

import sun.tools.javap.Main; 
... 
    void javap(String className) throws IOException 
    { 
     bos = new ByteArrayOutputStream(); 
     ourOut = new PrintStream(bos); 

     PrintStream oldOut = System.out; 
     System.setOut(ourOut); 

     String[] params = new String[] {"-public", className}; 
     Main.main(params); 

     System.setOut(oldOut); 

     String str = bos.toString(); 
    } 

यह classpath में सूर्य JDK tools.jar की आवश्यकता है।

संबंधित मुद्दे