नेवर से नेवर"
मुझे नहीं लगता कि यह आवश्यक रूप से बुरा है, यह केवल बुरा है यदि आप इसे बुरी तरह से करते हैं और इसका दुरुपयोग करते हैं।
वी ऑल नीड टूल्स एंड यूटिलिटीज
शुरुआत के लिए, हम सभी कुछ पुस्तकालयों का उपयोग करते हैं जिन्हें कभी-कभी लगभग सर्वव्यापी और मस्तूल के रूप में समझा जाता है। उदाहरण के लिए, जावा दुनिया में, Google Guava या Apache Commons ( Apache Commons Lang , Apache Commons Collections , etc ...)।
अतः स्पष्ट रूप से इनकी आवश्यकता है।
हार्ड-वर्ड, डुप्लीकेशन और इंट्रोड्यूसिंग बग्स से बचें
यदि आप इन के बारे में सोचते हैं तो आप इन Util
वर्गों के बहुत बड़े समूह हैं , सिवाय इसके कि कोई व्यक्ति उन्हें (अपेक्षाकृत) सही पाने के लिए बड़ी लंबाई से गुजरे, और वे समय - समय पर परीक्षण करते रहे हैं और दूसरों द्वारा भारी-भरकम नजरें गड़ाए हुए हैं।
तो मैं कहूंगा कि जब Util
कक्षा लिखने के लिए खुजली महसूस होती है तो अंगूठे का पहला नियम यह जांचना है कि Util
वास्तव में कक्षा पहले से मौजूद नहीं है।
इसके लिए मैंने जो एकमात्र प्रतिवाद देखा है, वह तब है जब आप अपनी निर्भरता को सीमित करना चाहते हैं क्योंकि:
- आप अपने आश्रितों की स्मृति पदचिह्न को सीमित करना चाहते हैं,
- या आप कसकर नियंत्रित करना चाहते हैं कि डेवलपर्स को क्या उपयोग करने की अनुमति है (जुनूनी बड़ी टीमों में होता है, या जब किसी विशेष ढांचे को विषम सुपर-भद्दा वर्ग पूरी तरह से कहीं से बचने के लिए जाना जाता है)।
लेकिन इन दोनों को प्रोगार्ड या समतुल्य का उपयोग करते हुए परिवाद को फिर से पैकेजिंग करके या खुद से अलग करके निपटाया जा सकता है ( मावेन उपयोगकर्ताओं के लिए, मावेन -शेड-प्लगइन आपके निर्माण के हिस्से के रूप में इसे एकीकृत करने के लिए कुछ फ़िल्टरिंग पैटर्न प्रदान करता है )।
इसलिए, यदि यह एक देयता में है और आपके उपयोग के मामले से मेल खाता है, और कोई भी बेंचमार्क आपको अन्यथा नहीं बताता है, तो इसका उपयोग करें। यदि यह आपके द्वारा थोड़े से भिन्न होता है, तो इसे बढ़ाएं (यदि संभव हो) या इसे बढ़ाएं, या अंतिम उपाय में इसे फिर से लिखें।
नामकरण की परंपरा
हालाँकि, अब तक इस उत्तर में मैंने उन्हें अपने Util
जैसा कहा है । उनका नाम मत लो।
उन्हें सार्थक नाम दें। Google अमरूद को एक (बहुत, बहुत) अच्छे उदाहरण के रूप में लें कि क्या करना है, और बस कल्पना करें कि com.google.guava
नाम स्थान वास्तव में आपकी util
जड़ है।
अपने पैकेज को कॉल करें util
, कम से कम, लेकिन कक्षाओं को नहीं। यदि String
स्ट्रिंग निर्माण की वस्तुओं और हेरफेर से संबंधित है, तो इसे कॉल करें Strings
, नहीं StringUtils
(क्षमा करें, अपाचे कॉमन्स लैंग - मैं अभी भी और आपको उपयोग करता हूं!)। यदि यह कुछ विशिष्ट करता है, तो एक विशिष्ट वर्ग नाम (जैसे Splitter
या Joiner
) चुनें।
अध्याय परीक्षा
यदि आपको इन उपयोगिताओं को लिखने का सहारा लेना है, तो उन्हें यूनिट-टेस्ट करना सुनिश्चित करें। उपयोगिताओं के बारे में अच्छी बात यह है कि वे आमतौर पर स्व-निहित घटक होते हैं, जो विशिष्ट इनपुट लेते हैं और विशिष्ट आउटपुट वापस करते हैं। यही अवधारणा है। इसलिए उन्हें यूनिट-परीक्षण नहीं करने का कोई बहाना नहीं है।
इसके अलावा, यूनिट-परीक्षण आपको उनके एपीआई अनुबंध को परिभाषित करने और दस्तावेज करने की अनुमति देगा। यदि परीक्षण टूटते हैं, या तो आपने कुछ गलत तरीका बदल दिया है, या इसका मतलब है कि आप अपने एपीआई के अनुबंध को बदलने की कोशिश कर रहे हैं (या यह कि आपके मूल परीक्षण बकवास थे - इससे सीखें, और फिर से ऐसा न करें) ।
एपीआई डिजाइन
इन APIs के लिए आपके द्वारा लिया गया डिज़ाइन निर्णय, संभवतः लंबे समय तक आपका अनुसरण करेगा। इसलिए, एक Splitter
-क्लोन लिखने पर घंटों खर्च नहीं करते हैं , तो इस बारे में सावधान रहें कि आप इस मुद्दे पर कैसे दृष्टिकोण रखते हैं।
अपने आप से कुछ सवाल पूछें:
- क्या आपकी उपयोगिता विधि अपने आप ही एक वर्ग का वारंट करती है, या एक स्थिर विधि काफी अच्छी है, अगर यह समान उपयोगी तरीकों के समूह का हिस्सा बनने के लिए समझ में आता है?
- क्या आपको ऑब्जेक्ट बनाने और अपने API को अधिक पठनीय बनाने के लिए फ़ैक्टरी विधियों की आवश्यकता है ?
- पठनीयता की बात करें तो क्या आपको धाराप्रवाह एपीआई , बिल्डरों आदि की आवश्यकता है ...?
आप चाहते हैं कि इन बर्तनों का उपयोग, मामलों की एक बड़ी चौड़ाई को कवर करने के लिए, मजबूत, स्थिर, अच्छी तरह से प्रलेखित होना, कम से कम आश्चर्य के सिद्धांत का पालन करना, और आत्म-निहित होना। आदर्श रूप से, आपके बर्तनों के प्रत्येक उप-पैकेज, या आपके पूरे उपयोग पैकेज को कम से कम, आसान पुन: उपयोग के लिए एक बंडल के लिए निर्यात किया जाएगा।
हमेशा की तरह, यहाँ दिग्गजों से सीखें:
- इन के माध्यम से झारना, फिर विश्लेषण करें और तुलना करें, और उन्हें फिर से करने के लिए अक्सर उनके पास जाएं (ध्यान दें कि मैं इस बारे में कोई निर्णय नहीं ले रहा हूं कि ये बिल्कुल या आंशिक रूप से अच्छे हैं या बुरे हैं, जोर विश्लेषण पर है और बिट की तुलना करें ) :
- देखो जोश बलोच कैसे एक अच्छा एपीआई डिजाइन करने के लिए और क्यों यह मामला ( स्लाइड )।
- कुछ अतिरिक्त बलोच सामग्री पढ़ें और देखें:
- API डिज़ाइन मैटर्स पढ़ें ।
हां, इनमें से बहुत से संग्रह और डेटा-संरचनाओं पर जोर देते हैं, लेकिन मुझे यह न बताएं कि आप अपने अधिकांश बर्तनों को प्रत्यक्ष या अप्रत्यक्ष रूप से लागू करने की संभावना नहीं रखते हैं।
Util
अपनी कक्षाओं के नामों का उपयोग करना बंद करें। समस्या सुलझ गयी।