*** का उपयोग *** हेल्पर या *** यूटील वर्गों में केवल स्थैतिक तरीकों से एक एंटीपैटर्न होता है


19

मुझे अक्सर जावा या किसी भी तरह की भाषा में सहायक या उपयोग की कक्षाओं से सामना करना पड़ता है। इसलिए मैं अपने आप से पूछ रहा था कि क्या यह किसी तरह का एंटी पैटर्न है और इस तरह की कक्षाओं का अस्तित्व किसी सॉफ्टवेयर के डिजाइन और वास्तुकला में कमी है।

अक्सर इन वर्गों को केवल स्थिर तरीकों का उपयोग करके सीमित किया जाता है, जो बहुत सारी चीजें करते हैं। लेकिन ज्यादातर यह वास्तव में संदर्भ पर निर्भर और स्टेटफुल है।

मेरा सवाल यह है कि इस तरह के स्टैटिक हेल्पर / यूसेज क्लासेज के बारे में आपकी क्या राय है क्योंकि फायदा सिर्फ क्लास के नाम का इस्तेमाल करके तेजी से मंगलाचरण से है।

और किस तरह के अमूर्त स्तर पर आप इस तरह की कक्षाओं का उपयोग करने से बचेंगे?

मेरी राय में "स्थिर" कीवर्ड को केवल एक वर्ग (जावा) की घोषणा के भीतर अनुमति दी जानी चाहिए, न कि तरीकों के लिए। मेरी राय में, इस तरह से इसका उपयोग करना, यह एक अच्छा विकल्प और मध्य मार्ग हो सकता है जो जावा में प्रोसीड्यूरल- और ओओ-पैराडाइम को संयोजित करने और कीवर्ड के दुरुपयोग से बचने में सक्षम हो।

उत्तर के कारण जोड़:

सबसे पहले मुझे लगता है कि यह पूरी तरह से अलग-अलग प्रतिमानों को संयोजित करने में सक्षम है और यहां तक ​​कि मशीन या वीएम संकलित कोड के भीतर रनटाइम व्याख्या की गई भाषाओं का उपयोग करता है।

मेरा अनुभव है कि एक परियोजना की विकास प्रक्रिया के दौरान इस तरह के सहायक और उपयोग या जो कुछ भी नाम है, बढ़ते हैं और बढ़ते हैं और कोडबेस के हर भूल गए कोने के भीतर उपयोग किए जाते हैं, जो मूल रूप से मॉड्यूलर और फ्लेक्सिबेल के लिए डिज़ाइन किया गया था। और फिर से बनाने के लिए समय की कमी के कारण या फिर से डिजाइन के बारे में सोचने के लिए आप बस इसे समय के साथ बहुत खराब कर देते हैं।

मुझे लगता है कि staticजावा से हटा दिया जाना चाहिए। विशेष रूप से अब जहां अधिक परिष्कृत कार्यात्मक भाषा तत्वों का उपयोग करना संभव है।



मुझे लगता है कि यदि सहायक को एक वर्ग को तत्काल करने की आवश्यकता नहीं है, तो यह ठीक है। समस्या तब होती है जब सहायक किसी वर्ग के ठोस कार्यान्वयन को तत्काल लागू कर देता है और फिर आप उस इंटरफ़ेस का मजाक नहीं उड़ा पाते हैं। यदि हेल्पर एक इंटरफ़ेस या एक अमूर्त वर्ग पास करता है तो मुझे लगता है कि यह ठीक है।
बोबेक

यदि आप प्रक्रियात्मक प्रोग्रामिंग करने का दावा करते हैं तो यह ठीक है। यदि आप ऑब्जेक्ट (-ऑर्डिनेटेड) प्रोग्रामिंग करने का दावा करते हैं तो यह नहीं है।
चित्तीदार

1
@ स्‍पष्‍ट: और जैसा कि आप पूरी तरह से ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग करने का दावा करने में कोई व्‍यापारिक मूल्‍य नहीं है, बस हमेशा मिश्रित प्रतिमानों की प्रोग्रामिंग करें और कार्य करें।
रेमकोगर्लिच

@RemcoGerlich बिल्कुल सही। मेरा ध्यान इस बात पर था कि उत्तर मुख्य रूप से "दार्शनिक" है, जिससे संबंधित प्रोग्रामिंग प्रतिमान आप इसे मानते हैं।
स्पॉट

जवाबों:


20

खैर, जावा में मुफ्त फ़ंक्शंस का अभाव है, इस प्रकार आपको उन्हें फ़ंक्शनल फ़ंक्शंस के रूप में कुछ प्रो-फ़ॉर्म वर्ग में रखने के लिए मजबूर किया जाता है। एक आवश्यक काम-के आसपास कभी भी एक विरोधी पैटर्न नहीं है, हालांकि इसमें लालित्य की कमी हो सकती है।

अगला, मुफ्त कार्यों में कुछ भी गलत नहीं है। वास्तव में, नि: शुल्क कार्यों का उपयोग युग्मन को कम करता है, क्योंकि उनके पास सभी सार्वजनिक विवरणों के बजाय केवल सार्वजनिक इंटरफ़ेस तक पहुंच है।

बेशक, नि: शुल्क / स्थिर कार्यों का उपयोग करना किसी भी तरह से साझा किए जाने वाले खतरों, विशेष रूप से वैश्विक, राज्य के खतरों को कम नहीं करता है।


2
@ टिमोथी ट्रंकल या तो वे स्थिर हैं, या उनके पास एक शानदार है this, और उन्हें तुरंत उचित रूप से कुछ करने की आवश्यकता है
Caleth

6
@ टिमोथी ट्रंकल क्योंकि यह जावा है। अन्य भाषाओं में बिना किसी कार्य के ओवरहेड के मुक्त कार्य हो सकते हैं ताकि उन्हें एक वर्ग में रखा जा सके, यह घोषित किया जा सके कि यह एक उदाहरण विधि नहीं है। और कुछ बिंदु पर, आपको तंग युग्मन करना होगा। चाहे वह अच्छा हो या नहीं, पूरी तरह से इस बात पर निर्भर करता है कि फ़ंक्शन क्या करता है
nvoigt

5
@TimothyTruckle बिल्कुल, राज्य बनाए रखना "अच्छा नहीं" होने का प्रमुख कारण होगा।
nvoigt

2
@nvoigt, मुझे लगता है कि यह उत्तर उस बिंदु को स्पष्ट रूप से बताते हुए बहुत सुधार होगा। स्टेटफुल स्टेटिक्स खराब हैं; स्टेटलेस अच्छे हैं। वास्तव में काफी सरल है।
डेविड अर्नो

3
@ तीमुथियुसट्रैकल तंग कपलिंग नहीं है। आप ढीली युग्मन का वर्णन कर रहे हैं। इस संदर्भ में तंग युग्मन अंतर-निर्भरता के कुछ प्रकार होगा। एक तरफ़ा निर्भरता उस आवश्यकता को पूरा नहीं करती है।
जिमीजम्स

18

यदि वे कुछ दिशा-निर्देशों का पालन करते हैं, तो स्टैटिक यूटिलिटी या हेल्पर फ़ंक्शंस एक प्रतिमान नहीं हैं:

  1. उन्हें दुष्प्रभावों से मुक्त होना चाहिए

  2. उनका उपयोग अनुप्रयोग विशिष्ट व्यवहार के लिए किया जाता है जो उस वर्ग या कक्षाओं में नहीं होता है जिस पर ये कार्य संचालित होते हैं

  3. उन्हें किसी साझा राज्य की आवश्यकता नहीं है

सामान्य उपयोग के मामले:

  • किसी विशिष्ट तरीके से तिथियों को प्रारूपित करना
  • कार्य जो एक प्रकार को इनपुट के रूप में लेते हैं और एक अलग प्रकार को वापस करते हैं।

उदाहरण के लिए एक एप्लिकेशन में मैंने उपयोगकर्ताओं पर काम किया, उनकी गतिविधियों के लिए जर्नल प्रविष्टियाँ रखीं। वे एक अनुवर्ती तिथि निर्दिष्ट कर सकते हैं और एक घटना अनुस्मारक डाउनलोड कर सकते हैं। हमने एक जर्नल प्रविष्टि लेने और .ics फ़ाइल के लिए कच्चे पाठ को वापस करने के लिए एक स्थिर उपयोगिता वर्ग बनाया।

इसके लिए किसी साझा राज्य की आवश्यकता नहीं थी। यह किसी भी राज्य को उत्परिवर्तित नहीं करता था, और एक iCal इवेंट बनाना निश्चित रूप से विशिष्ट था और जर्नल एंट्री क्लास में नहीं था।

यदि स्थिर कार्यों या उपयोगिता वर्गों के साइड इफेक्ट होते हैं या साझा स्थिति की आवश्यकता होती है, तो मैं इस कोड को पुनर्मूल्यांकन करने की सलाह दूंगा, क्योंकि यह युग्मन को पेश करता है जो इकाई परीक्षण के लिए नकली करना मुश्किल हो सकता है।


4

यह आपके दृष्टिकोण पर निर्भर करेगा। कई अनुप्रयोगों को एक अधिक कार्यात्मक के साथ लिखा जाता है, जैसा कि शास्त्रीय मानसिकता के विपरीत है (आप जिन साइटों पर हैं, उनमें से अधिकांश में शामिल हैं)।

इस मानसिकता के साथ, श्रमिक वर्गों पर कई उपयोगिता विधियां होंगी जो स्थिर तरीकों के रूप में एक साथ हो सकती हैं। उन्हें खिलाया जाता है / सादे वस्तुओं के करीब उपयोग किया जाता है जो केवल डेटा पकड़ते हैं और पास हो जाते हैं।

यह एक मान्य दृष्टिकोण है और विशेष रूप से बड़े पैमाने पर बहुत अच्छा काम कर सकता है।


"बहुत अच्छी तरह से काम कर सकते हैं, विशेष रूप से बड़े पैमाने पर" नहीं। स्थैतिक पहुंच से तंग युग्मन कारण जल्द ही आपके रास्ते में खड़ा हो जाएगा क्योंकि परियोजना बढ़ती है।
तीमुथियुस ट्रक

@TimothyTruckle क्या आप बता सकते हैं कि Agent.Save (obj) obj.Save () की तुलना में बहुत अधिक कैसे युग्मित है? एजेंट केवल DI / IoC संदर्भ प्राप्त करने में सक्षम है, यहां तक ​​कि एए क्लास उदाहरण के रूप में स्थिर तरीकों के लिए भी। संदर्भ के लिए स्टैक एक्सचेंज स्वयं को इस प्रकार की मानसिकता में लिखा गया है, और किसी भी अन्य एएसपी.नेट ऐप की तुलना में बेहतर तरीके से स्केल किया गया है, जिनके बारे में मुझे पता नहीं है।
ट्रैकर

"क्या आप बता सकते हैं कि कैसे Agent.Save (obj) obj.Save () की तुलना में बहुत अधिक युग्मित है?" यह गलत उदाहरण है। एक सही उदाहरण Agent.Save(obj)बनाम होगा agentInstance.Save(obj)। उत्तरार्द्ध के साथ आपको उपयोग कोड में इंजेक्ट करने की संभावना है agentInstance। परिणाम में आप किसी भी बच्चे के वर्ग को इंजेक्ट कर सकते Agentहैं जो पुन: उपयोग Agentकिए बिना विभिन्न "प्रकार" के साथ पुन: उपयोग ओग का उपयोग करने की अनुमति देता है । यह कम कपलिंग है
तीमुथियुस ट्रक

मुझे लगता है कि यह वास्तव में कुछ चीजों के लिए नीचे आता है। क्या राज्य की आवश्यकता है, यह कितना लचीला होना चाहिए, और क्या वैश्विक / उदाहरण के लिए राज्य होना ठीक है? यह तय करने के लिए प्रत्येक देव / वास्तुकार पर निर्भर है। मैं परिदृश्यों के लिए जटिलता को जोड़ने के लिए एक सरल कोडबेस को पसंद करूंगा जो एक पूरे के रूप में समझने के लिए सब कुछ अधिक कठिन बनाता है। नोड / जेएस के बारे में मुझे जो चीजें पसंद हैं उनमें से एक यह है कि मैं सरल / स्वच्छ कोड लिख सकता हूं और फिर भी डीआई / आईओसी बारीकियों के लिए लिखे गए कोड के बिना परीक्षण के लिए इंजेक्ट कर सकता हूं।
ट्रैकर 1

2

मुझे व्यक्तिगत रूप से लगता है कि ऐसे सहायक वर्गों के बारे में एकमात्र महत्वपूर्ण हिस्सा यह है कि उन्हें निजी बनाया जाए। इसके अलावा - वे कड़ाई से एक अच्छा विचार है (संयम से लागू)।

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

चाहे इसे 'हेल्पर' लेबल करना व्यक्तिगत स्वाद का एक छोटा सा मामला है, लेकिन यह इस बात को दर्शाता है कि इसे लागू करने में मदद मिलती है और इसका व्यापक दर्शकों के लिए कोई हित / उपयोग नहीं होता है। अगर यह समझ में आता है - इसके लिए जाओ!


1
सार्वजनिक उपयोगिता वर्ग अभी भी सहायक हो सकते हैं। प्रमुख उदाहरण: java.lang.Math
आमोन

1

staticएक गलत धारणा के आधार पर सहायक वर्गों की व्यापकता । सिर्फ इसलिए कि हम केवल staticविधियों "उपयोगिता वर्ग" के साथ कक्षाओं को बुलाते हैं इसका मतलब यह नहीं है कि पीओजेओ में सामान्य व्यवहार लिखने की अनुमति नहीं है।

static सहायक कक्षाएं तीन कारणों से विरोधी पैटर्न हैं:

  1. इस सहायक विधियों की स्थिर पहुंच निर्भरता को छुपाती है । यदि ये "उपयोगिता वर्ग" POJOs थे, तो आप उन्हें कंस्ट्रक्टर मापदंडों के रूप में एक आश्रित वर्ग में इंजेक्ट कर सकते हैं, जो किसी आश्रित वर्ग के किसी भी उपयोगकर्ता के लिए निर्भरता को स्पष्ट कर देगा।

  2. इस सहायक विधियों की स्थिर पहुंच से युग्मन तंग होता है । इसका अर्थ है कि सहायक विधियों का उपयोग करने वाले कोड का पुन: उपयोग करना कठिन है और (साइड इफेक्ट के रूप में) परीक्षण करने के लिए हार्ट।

  3. खासकर अगर वे राज्य बनाए रखते हैं तो ये केवल वैश्विक चर हैं । और उम्मीद है कि कोई भी तर्क है कि वैश्विक चर किसी भी अच्छे हैं ...

स्टेटिक हेल्पर क्लासेस STUPID कोड एंटी पैटर्न का हिस्सा हैं ।


वैश्विक राज्य प्रश्न से असंबंधित है, - अधिकतम 630

ओपी ने लिखा:

लेकिन ज्यादातर यह वास्तव में संदर्भ पर निर्भर और स्टेटफुल है।

स्टेटिक statefull निर्माणों हैं वैश्विक राज्यों।

किसी भी तरह का कोड इसका इस्तेमाल कर सकता है। - अधिकतम 630

हाँ कारण है कि। और लगभग सभी अनुप्रयोगों को किसी न किसी प्रकार की वैश्विक स्थिति की आवश्यकता होती है ।

लेकिन वैश्विक स्थिति ! = वैश्विक चर

आप निर्भरता इंजेक्शन के माध्यम से ओओ तकनीकों के साथ वैश्विक राज्य बना सकते हैं, लेकिन आप स्टेटफुल स्थिर संरचनाओं के साथ वैश्विक स्थिति से बच नहीं सकते हैं जो नीचे स्थित वैश्विक चर हैं ।


2
वैश्विक राज्य प्रश्न से असंबंधित है, किसी भी प्रकार का कोड इसका उपयोग कर सकता है।
अधिकतम ६३०

@ max630 कृपया मेरा अपडेट देखें
टिमोथी

1
आप युग्मन के बिना स्थिर मुक्त कार्यों का उपयोग कर सकते हैं। आप Func<Result, Args>वस्तुओं के चारों ओर से गुजरते हैं, जो अन्यत्र तात्कालिक हैं।
कैलथ

1
1) मैं आमतौर पर सोचता हूं कि कार्यान्वयन छिपाना एक अच्छी बात है, जहां यह उपयुक्त है। 2) तर्क / निर्भरता-इंजेक्शन के रूप में सब कुछ होने के नाते भी एक प्रकार का डिज़ाइन-टाइम कपलिंग बनाता है, आप इसे तब महसूस कर सकते हैं जब आप खुद को लंबी निर्भरता श्रृंखला में हस्ताक्षर बदलने पर बहुत समय बिताने के लिए पाते हैं। और अपने तर्क, या तर्क के रूप में अन्य क्रॉस-कटिंग चिंताओं की आवश्यकता वाले हर एक फ़ंक्शन होने की तरह, उरग ... (लेकिन हाँ, यह निम्न-स्तरीय परीक्षण को कठिन बना सकता है) 3) बेशक स्थिर कार्यों को स्टेटलेस होना चाहिए।
एलेक्स

1
@Alex फिर मुझे इसके बारे में दूसरा तरीका बताने दें: एक इकाई कोड का कोई गुच्छा है (स्थैतिक संदर्भित "उपयोगिता" विधियों सहित) जिसे बदलने का एक ही कारण है । इस इकाई के अंदर कुछ भी कार्यान्वयन विस्तार है । और कुछ भी एक निर्भरता है , और इकाई को इसके लिए स्थिर पहुंच नहीं होनी चाहिए।
तीमुथियुस ट्रक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.