संपादित करें: मुझे लगता है कि लोगों को यह विश्वास नहीं हुआ कि यह संभव था या आसान था, इसलिए मैंने इसे किया - स्क्रैच से लगभग एक घंटे लग गए - अगर मैं एक विधि का उपयोग करता तो 40 मिनट लेता प्रत्येक मेनू आइटम के लिए अलग-अलग विधियों को प्रतिबिंबित करने के बजाय एक लक्ष्य।
यहां Tested source code है। यह काम करता है, लेकिन एक बड़ी विधि और बदसूरत है - अगर आप इसे इस्तेमाल करते हैं तो इसे दोबारा दोहराएं। मैं इसे अगले कुछ दिनों में थोड़ा सा ठीक कर सकता हूं, मैं हमेशा इस पर एक प्रतिलिपि रखना चाहता हूं ताकि पुन: उपयोग किया जा सके।
--- मूल पोस्ट
सबसे पहले, डेटा से अपने कोड को अलग करने याद है। इसका मतलब है कि आपको कभी भी टाइप नहीं करना चाहिए:
new Menu("File...");
स्ट्रिंग "फ़ाइल ..." डेटा है। यदि आप इस तरह से सोचना शुरू करते हैं, तो आप पाएंगे कि आपका प्रश्न स्वयं उत्तर देता है।
सबसे पहले आपको कुछ डेटा बनाने की आवश्यकता है। आपको मेनू में "फ़ाइल ..." और "सहेजें" प्राप्त करने की आवश्यकता है। मैं आम तौर पर एक स्ट्रिंग सरणी (जो आप आसानी से एक फाइल करने के लिए स्थानांतरित कर सकते हैं)
new String[]{"File...","+Save","Load"...}
यह सरल पैटर्न मैं के साथ बाहर शुरू कर दिया है में से एक है के साथ शुरू। फिर आप + चिह्न को पार्स कर सकते हैं और इसका मतलब यह है कि "इसे जोड़ने के दौरान मेनू में एक स्तर ड्रॉप करें"
यह सिर्फ एक मूर्खतापूर्ण सम्मेलन है, अगर आप इसे पसंद नहीं करते हैं तो अपना खुद का आविष्कार करें।
अगला चरण बाध्यकारी है कि कोड चलाने के लिए बाध्यकारी है। आप उन्हें सभी एक ही विधि कह सकते हैं, लेकिन गधे में क्या दर्द (विशाल स्विच स्टेटमेंट)। डेटा में पढ़ने के दौरान एक विधि नाम बांधने के लिए प्रतिबिंब का उपयोग करना एक संभावना है। यहाँ एक समाधान है (फिर से यह अपने स्वाद फिट नहीं हो सकता है)
new String[]{"File...[fileMenu]","+Save[saveMenu]","Load[loadMenu]"...}
तो फिर तुम वर्ग कोष्ठकों में बात पार्स आउट, संजीदगी से अपने वर्तमान कक्षा में एक विधि के लिए इसे हुक और आप सेट कर रहे हैं।
इस समय एक प्रलोभन है जो मैंने हमेशा किया है, और मैंने इसे लड़ना सीखा है क्योंकि यह कभी काम नहीं करता है। प्रलोभन डेटा के पहले सेट ("फ़ाइल ...") का उपयोग करना है और इसे कुछ पैटर्न फिट करने के लिए कुशलतापूर्वक उपयोग करना है और स्वचालित रूप से अपने कोड से बांधना है (इस मामले में, सभी गैर-अल्फा वर्णों को हटाएं, पहला अक्षर कम केस बनाएं और सही विधि नाम प्राप्त करने के लिए "मेनू" संलग्न करें)। इसे आज़माने के लिए स्वतंत्र महसूस करें, यह बहुत आकर्षक है और लगता है कि यह चिकना लगता है, लेकिन इसे छोड़ने के लिए तैयार रहें जब यह कुछ ज़रूरतों को पूरा नहीं करता है (जैसे विभिन्न मेनू में सटीक समान नाम वाले दो मेनू आइटम)।
एक और तरीका है अपनी भाषा बंद का समर्थन करता है, तो आप वास्तव में एक ही स्थान पर फ़ाइल नाम और बंद ..
वैसे भी बना सकते हैं, एक बार आप इस तरह कोडिंग शुरू करते हैं, आपको लगता है कि मिल जाएगा होगा सभी अपने मेनू निर्माण एक एकल 10 लाइन विधि में है और आप इसे अपनी आवश्यकताओं के अनुसार बदल सकते हैं। मेरे पास एक मामला था जहां मुझे मेनू के एक सेट को एक पदानुक्रम में बदलना पड़ा और मैंने इसे 2 मिनट में किया।
अंत में, आप आसानी से क्रिया वस्तुओं को स्थापित करने के लिए इस पैटर्न का उपयोग कर सकते हैं और आसानी से उपयोग कर सकते हैं (एक स्थान पर, कोड की एकल पंक्ति), ताकि आप उनके साथ प्रयोग कर सकें। उनका उपयोग करने के कई तरीके हैं, लेकिन यदि आप यहां जो भी सिफारिश कर रहे हैं, वह नहीं करते हैं, तो आप प्रत्येक बदलाव के लिए प्रत्येक मेनू आइटम में फिर से कार्यान्वित करना समाप्त कर देंगे, जो वास्तव में परेशान है - एक ही बदलाव के बाद यदि आपने पहले स्थान पर संचालित डेटा को अभी लागू किया था, तो उससे अधिक समय बर्बाद हो जाएगा।
यह वास्तव में मुश्किल नहीं है कोड है, एक या दो घंटे की तरह लेना चाहिए तो आप नए मेनू लिखने के लिए की आवश्यकता नहीं है ("... फिर से। मुझ पर विश्वास करो, टूलींग इस तरह की बस के बारे में हमेशा इसके लायक है।
संपादित करें:
मैं बस के बारे में हमेशा कोड डेटा के आधार पर इन दिनों आम तौर पर मैं कुछ चीजें सामान्य तरीके प्रोटोटाइप होगा, पैटर्न और refactor पहचान - डेटा बस के बारे में हमेशा और आप सही तरीके से पुनर्रचना कर रहे हैं,। कारक बाहर और जो आपने छोड़ा है वह सुंदर, तंग और रखरखाव योग्य है।
मैं 1/2 से कम में ऊपर सुझाए गए सुझावों को कर सकता हूं हमारा (शायद प्रतिबिंबित संस्करण करने के लिए एक घंटा)। यह लगभग हमेशा तब तक होता है जब तक कि यह अप्रत्याशित संस्करण का उपयोग करने के लिए करता है, और तब से, आपकी बचत प्रत्येक परिवर्तन के लिए गुणा करती है।
यह रूबी के अलावा लोगों के समान ही है, रूबी के अलावा वे अपने कोड में और भी डेटा डालने लगते हैं (जो कोड से पूरी तरह से डेटा निकालने में बहुत मुश्किल बनाता है, जो हमेशा के लिए एक अच्छा लक्ष्य है अंतर्राष्ट्रीयकरण)।
हम्म, क्या मैंने उल्लेख किया है कि यदि आप इस तरह अपना डेटा निकालने में अच्छे हैं, तो i18n वस्तुतः मुफ़्त है?
मेरा सुझाव है कि आप इसे कभी-कभी कोशिश करें और देखें कि आप क्या सोचते हैं। स्ट्रिंग्स में नियंत्रण एम्बेड करना अनावश्यक है अगर यह आपको असहज बनाता है। मैं स्ट्रिंग/ऑब्जेक्ट एरे का उपयोग केवल इसलिए करता हूं क्योंकि वे वास्तव में प्रवेश करना आसान होते हैं, फिर भी आप कोडिंग करते समय फ़ाइल में हैं और बाद में बाहरी होने के लिए तुच्छ हैं, लेकिन यदि आपको वाईएमएल या एक्सएमएल या प्रॉपर्टी फाइलें पसंद हैं, तो आप जो कुछ भी आरामदायक हैं उसका उपयोग करें साथ - बस अपने कोड से अपने डेटा अमूर्त!
डेव रे द्वारा बताए गए अनुसार http://stackoverflow.com/questions/448179/organizing-actions-in-a-swing-application#448195 का डुप्लिकेट। –