2010-07-26 11 views
9

मैं कुछ रणनीतियों को लागू कर रहा हूं (Strategy Pattern) जिसमें कुछ सामान्य व्यवहार है और जहां मैं सामान्य परिचालनों को जीना चाहता हूं, वहां अनिश्चित हूं।जावा सार कक्षा या स्टेटिक यूटिलिटी क्लास डिज़ाइन चॉइस

  • मानते हुए कि मैं 1 संदर्भ और 3 रणनीतियों, रणनीतियों में उपयोग किए जाने वाले कुछ संचालन साझा किए जाते हैं, कुछ केवल 2 अन्य लोगों द्वारा ही रणनीतियों में से एक की आवश्यकता होती है।
  • कोई सदस्य स्तर राज्य साझा नहीं किया गया है, इसलिए केवल एक ही ऑपरेशन प्रभावी ढंग से स्टेटलेस हैं।
  • संचालन का उद्देश्य एक फ़ाइल में राज्य के स्वरूपण का समर्थन करना है, जैसे एक दृश्य सहायक।

विकल्प 1: बनाओ एक AbstractStrategy वर्ग

  • मैं जावा का उपयोग कर रहा तो यह तुरंत दूर भविष्य में इस सुविधा का उपयोग कर लेता है।
  • विरासत परिणामस्वरूप आता है। एक रिज संरचना में ।
  • संचालन अंतिम होगा।

विकल्प 2: स्थिर सहायकों

  • लचीला की एक util कक्षा बनाएं, लेकिन किसी कारण के लिए एक कोड गंध की तरह लगता है।
  • छुटकारा नहीं मिला।

कोई सिफारिश या प्राथमिकताएं?

ध्यान दें कि मैं जिस स्तर पर काम कर रहा हूं वह रणनीति स्तर है, संदर्भ स्तर नहीं (विकिपीडिया लिंक देखें)।

+0

उपयोगिता कक्षाएं ओओपी में मौजूद नहीं हैं: http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html – yegor256

+0

जब वहां होता है तो मैं अमूर्तता के साथ जाना पसंद करता हूं ** खुले बंद ** पैटर्न का पालन करने की आवश्यकता यानी, कार्यक्रम विस्तार के लिए खुला होगा लेकिन संशोधन के लिए बंद हो जाएगा ... – Jay

उत्तर

7

वहाँ एक कारण है ... एक विशाल कारण ... एक अमूर्त वर्ग या इंटरफ़ेस पर एक स्थिर util वर्ग का प्रयोग है।

तो आप बाद की तारीख में और विधियां जोड़ सकते हैं।

एक अमूर्त वर्ग या इंटरफ़ेस के साथ, उस वर्ग/इंटरफ़ेस में आपके द्वारा किए गए किसी भी परिवर्तन को उस वर्ग के सभी वर्गों में बदला जाना चाहिए। यदि आप एक सार्वजनिक एपीआई लिख रहे हैं तो यह विशेष रूप से समस्याग्रस्त है।

जावा ढांचे में कक्षाओं का उपयोग पूरे समय बिखरे हुए स्थिर तरीकों के साथ किया जाता है। सबसे प्रसिद्ध लोग java.util पैकेज में हैं: Collections और Arrays

+0

अच्छा बिंदु। मैं व्यक्तिगत रूप से सोचता हूं कि स्थाई जाने का रास्ता है। फ़ंक्शन व्यूहेल्पर पैटर्न में अच्छी तरह से फिट होते हैं, इसलिए जटिल होने पर यह अनावश्यक लगता है। – JamesC

+0

इस विषय पर, मुझे लगता है कि RestAssured लाइब्रेरी और XMLSlurper (ग्रोवी प्रोजेक्ट में) स्थिर उपयोगिता कक्षाओं का उपयोग करने के दोनों महान उदाहरण हैं। – djangofan

1

इसे प्राप्त करने के कई तरीके हैं।

  1. सार तरीकों में एक अमूर्त वर्ग का उपयोग करें और बनाने के निष्पादन की चर भागों => कुछ रणनीतियों सभी कार्यों को क्रियान्वित करेगी (सार तरीकों अधिभावी द्वारा) है, जबकि दूसरों वैकल्पिक लोगों को छोड़ सकता है। ध्यान दें कि इस मामले में वैकल्पिक संचालन अमूर्त तरीकों के बजाय खाली हुक विधियां हो सकती हैं। इस तरह आप उप-वर्ग में खाली विधियों के रूप में इन परिचालनों को लागू करने की परेशानी से बचते हैं।

  2. एक वास्तविक 'रणनीति' इंटरफ़ेस का उपयोग करें (विकिपीडिया आलेख में निष्पादित विधि के साथ) जिसे आपने इंगित किया है)। क्लाइंट क्लास को फिर रणनीति के क्रियान्वयन द्वारा प्रदान किया जाएगा (एक अज्ञात आंतरिक वर्ग या वास्तविक पूर्ण उड़ा रणनीति वर्ग हो सकता है)।

पहले और अधिक कठोर और अधिक सरल लेकिन है: आप आपरेशनों की संख्या (विशेष रूप से अमूर्त वाले) को संशोधित करने के लिए है, तो सभी उपवर्गों अद्यतन किया जाना है।

दूसरा अधिक लचीला है लेकिन आपको स्थिर उपयोगिता विधियों का प्रतिनिधित्व या उपयोग करके विभिन्न रणनीतियों के बीच सामान्य संचालन "साझा" करने का एक तरीका खोजना होगा।

+0

"दूसरा अधिक लचीला है लेकिन आपको आम तौर पर" साझा "करने का तरीका ढूंढना होगा स्थिर उपयोगिता विधियों का प्रतिनिधित्व या उपयोग करके विभिन्न रणनीतियों के बीच संचालन। " - रणनीति वह स्तर है जिस पर मैं काम कर रहा हूं और "सामान्य भाग" जैसा कि आप कहते हैं वह समस्या है जिसे मैं हल करने की कोशिश कर रहा हूं। – JamesC

+0

क्या आम भागों व्यापार की छोटी इकाइयों के लिए उपयुक्त हैं? मेरा मतलब यह है कि: क्या उन्हें कार्यों के रूप में मॉडलिंग किया जा सकता है? यदि ऐसा है, तो मैं सुझाव देता हूं कि इन परिचालनों को छोटे 'ऑपरेशन' वर्गों में शामिल किया जाए और उन सभी रणनीतियों का पुन: उपयोग किया जाए। फायदे उस मामले में टेस्टेबिलिटी और पुन: प्रयोज्यता हैं। – dimdm

+0

छोटी इकाइयां हां, लेकिन व्यवसाय में नहीं। केवल रणनीतियों के लिए लागू - तो मैं स्थिर उपयोग पैकेज प्रतिबंधित, विचार सोच रहा हूँ? – JamesC

1

वहाँ दो कि तुम सूचीबद्ध के अलावा एक और विकल्प है:

यह मेरे लिए लग रहा है कि आप रचना जहां केवल कार्यक्षमता जिनके लिए आपको खींच सकते हैं किसी तरह का चाहते हैं। शायद आप कमांड पैटर्न का उपयोग करके अपने परिचालनों को पैकेज कर सकते हैं और फिर इनसे अपनी रणनीतियों को इकट्ठा कर सकते हैं?

लाभ:

  • रणनीति विरासत नहीं की आवश्यकता है।
  • रणनीतियों में अप्रयुक्त/छिपी हुई 'साझा विधियों' पर दृश्यता नहीं होगी।
  • कोई स्थिर उपयोगिता वर्ग (संभावित रूप से) असंबंधित तरीकों के साथ नहीं है।
  • इकाई परीक्षण के लिए सरल - संचालन अलगाव में परीक्षण किया जा सकता है।
  • सरल साझा रणनीति वर्ग जो संचालन पर पुनरावृत्ति करता है।

नुकसान:

  • अतिरिक्त कक्षाएं।
  • संचालन को एक सामान्य कमांड इंटरफ़ेस के अनुरूप होना होगा जो प्रतिबंधित हो सकता है।
  • बहुत सरल संचालन के लिए अधिक हो सकता है - जो आपके स्वरूपक हो सकते हैं।
+0

रणनीतियां इस उदाहरण में कमांड के समान हैं इसलिए मुझे नहीं पता कि मैं विरासत से कैसे बच सकता हूं क्योंकि यदि मैं आपको सही तरीके से समझता हूं तो कमांड को अभी भी सामान्य कार्यों को साझा करने की आवश्यकता होगी, आप इसे लागू करने का प्रस्ताव कैसे देते हैं? – JamesC

+0

मैं सुझाव दे रहा हूं कि रणनीतियों आदेशों से बना है। प्रत्येक 'फ़ंक्शन' एक कमांड उदाहरण है। आप उचित आदेशों को चुनकर और चुनकर बस अपनी रणनीतियों को लिख सकते हैं। – teabot

1

अगर इसे सार के रूप में घोषित किया गया है, तो लोग अनुमान लगा सकते हैं कि यह विस्तार के लिए डिज़ाइन किया गया है। तो निजी कन्स्ट्रक्टर घोषित करने के लिए एक बेहतर विचार है।

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