मुझे लगता है कि मैं यहाँ उल्लेख नहीं देखा है refactoring के बारे में कुछ विश्वास करने के लिए आया हूँ, मुझे पता है कि यहाँ पहले से ही बहुत सारे उत्तर हैं, लेकिन मुझे लगता है कि यह नया है।
मैं एक निर्मम प्रतिशोधक और DRY में एक मजबूत विश्वासी रहा हूँ जब से कि शर्तें उठीं। ज्यादातर ऐसा इसलिए है क्योंकि मुझे अपने सिर में एक बड़ा कोडबेस रखने में परेशानी होती है और आंशिक रूप से क्योंकि मुझे DRY कोडिंग में मजा आता है और मुझे C & P कोडिंग के बारे में कुछ भी पसंद नहीं है, वास्तव में यह मेरे लिए दर्दनाक और बहुत धीमा है।
बात यह है, डीआरवाई पर जोर देते हुए मुझे कुछ तकनीकों में बहुत अभ्यास किया है जो कि मैं शायद ही कभी दूसरों का उपयोग करता हूं। बहुत सारे लोग जोर देते हैं कि जावा को DRY बनाना मुश्किल या असंभव है, लेकिन वास्तव में वे सिर्फ कोशिश नहीं करते हैं।
एक उदाहरण बहुत पहले से जो आपके उदाहरण से मिलता-जुलता है। लोगों को लगता है कि जावा जीयूआई निर्माण कठिन है। बेशक यह है अगर आप इस तरह से कोड:
Menu m=new Menu("File");
MenuItem save=new MenuItem("Save")
save.addAction(saveAction); // I forget the syntax, but you get the idea
m.add(save);
MenuItem load=new MenuItem("Load")
load.addAction(loadAction)
जो कोई भी सोचता है कि यह सिर्फ पागल है वह बिल्कुल सही है, लेकिन यह जावा की गलती नहीं है - कोड को कभी भी इस तरह से नहीं लिखा जाना चाहिए। ये विधि कॉल अन्य प्रणालियों में लिपटे जाने के उद्देश्य से किए गए कार्य हैं। यदि आपको ऐसी कोई प्रणाली नहीं मिल रही है, तो इसका निर्माण करें!
आप स्पष्ट रूप से इस तरह कोड नहीं कर सकते हैं ताकि आपको वापस कदम रखने और समस्या को देखने की जरूरत है, वह दोहराया गया कोड वास्तव में क्या कर रहा है? यह कुछ तार और उनके रिश्ते (एक पेड़) को निर्दिष्ट कर रहा है और उस पेड़ की पत्तियों को क्रियाओं में शामिल कर रहा है। तो आप वास्तव में क्या कहना चाहते हैं:
class Menu {
@MenuItem("File|Load")
public void fileLoad(){...}
@MenuItem("File|Save")
public void fileSave(){...}
@MenuItem("Edit|Copy")
public void editCopy(){...}...
एक बार जब आप अपने रिश्ते को किसी तरह से परिभाषित कर लेते हैं, जो सफल और वर्णनात्मक होता है, तो आप इससे निपटने के लिए एक तरीका लिखते हैं - इस मामले में आप पास किए गए वर्ग के तरीकों पर पुनरावृति करते हैं और एक पेड़ का निर्माण करते हैं, फिर अपने मेनू का निर्माण करने के लिए उपयोग करें और क्रियाओं के साथ-साथ (स्पष्ट रूप से) एक मेनू प्रदर्शित करते हैं। आपके पास कोई दोहराव नहीं होगा, और आपकी विधि पुन: प्रयोज्य है ... और शायद बड़ी संख्या में मेनू से लिखना आसान होगा, और यदि आप वास्तव में प्रोग्रामिंग का आनंद लेते हैं, तो आपको बहुत मज़ा आया था। यह कठिन नहीं है - आपको जिस विधि को लिखने की आवश्यकता है वह संभवतः आपके मेनू को बनाने की तुलना में कम रेखाएं हैं!
बात यह है कि इस कुएं को करने के लिए आपको अभ्यास करने की जरूरत है। बार-बार भागों में क्या अनोखी जानकारी है, इसका विश्लेषण करने के लिए आपको अच्छा प्राप्त करने की आवश्यकता है, उस जानकारी को निकालें और यह पता लगाएं कि इसे अच्छी तरह से कैसे व्यक्त किया जाए। स्ट्रिंग पार्सिंग और एनोटेशन जैसे उपकरणों का उपयोग करना सीखना बहुत मदद करता है। त्रुटि रिपोर्टिंग और प्रलेखन के बारे में वास्तव में स्पष्ट होना सीखना बहुत महत्वपूर्ण है।
आपको केवल अच्छी तरह से कोडिंग करके "नि: शुल्क" अभ्यास मिलता है - हेक संभावनाएं हैं कि एक बार जब आप इसमें अच्छे हो जाते हैं, तो आप पाएंगे कि कुछ DRY (पुन: प्रयोज्य उपकरण लिखने सहित) कोडिंग और पेस्टिंग से तेज है और सभी त्रुटियों, डुप्लिकेट त्रुटियों और उस प्रकार के कोडिंग के कारण कठिन परिवर्तन।
मुझे नहीं लगता कि मैं अपनी नौकरी का आनंद ले पाऊंगा अगर मैं डीआरवाई तकनीक और उपकरण बनाने का अभ्यास नहीं कर पाऊंगा। अगर मुझे भुगतान में कटौती करनी थी और कॉपी प्रोग्रामिंग नहीं करनी थी, तो मैं इसे ले लूंगा।
तो मेरे अंक हैं:
- कॉपी और पेस्ट में अधिक समय लगता है जब तक आप यह नहीं जानते कि अच्छी तरह से रिफैक्टर कैसे करें।
- आप इसे अच्छी तरह से करना सीखते हैं - DRY पर जोर देते हुए यहां तक कि सबसे कठिन और तुच्छ मामलों में भी।
- आप एक प्रोग्रामर हैं, अगर आपको अपने कोड DRY को बनाने के लिए एक छोटे से टूल की जरूरत है, तो इसका निर्माण करें।
always
औरnever
लाल झंडे के रूप में। "संदर्भ" नाम की एक चीज है, जहां नियमalways
औरnever
नियम, भले ही सामान्य रूप से अच्छे हों, यह उचित नहीं हो सकता है। सॉफ्टवेयर डेवलपर्स से सावधान रहें जो निरपेक्षता में सौदा करते हैं। ;)