एक विधि से कई वापसी मान वापस करने का एक तरीका: वापसी मूल्य का प्रतिनिधित्व करने वाली कक्षा के अंदर विधि डालें। क्या यह एक अच्छा डिज़ाइन है?


15

मुझे एक विधि से 2 मान वापस करने की आवश्यकता है। मेरा दृष्टिकोण इस प्रकार है:

  1. 2 क्षेत्रों के साथ एक आंतरिक वर्ग बनाएं जो उन 2 मूल्यों को रखने के लिए उपयोग किया जाएगा
  2. विधि को उस वर्ग के अंदर रखें
  3. क्लास को तत्काल करें और विधि को कॉल करें।

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

क्या यह एक अच्छा डिज़ाइन है और क्यों?


एक अन्य विकल्प (शायद एक बुरा एक): देखें BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)। यह 2 पूर्णांक को एक सरणी में इसके रिटर्न मान के रूप में देता है।
ईयरलैमलेस

आप किस प्रकार के दो मान वापस करना चाहते हैं?
तुलसी कोर्डोवा

संभावित डुप्लिकेट - stackoverflow.com/questions/12668186/…
m3th0dman

जवाबों:


15

मैं निम्नलिखित पंक्तियों के साथ इस पर बहस करूंगा:

  • वास्तव में आपकी विधि कई मान क्यों लौटाती है? हम किस तरह के सामंजस्य के बारे में बात कर रहे हैं - क्या उन मूल्यों को वास्तव में एक ही वर्ग पर क्षेत्र होना चाहिए, या क्या वे केवल संयोग से एक ही विधि द्वारा वापस आ गए हैं, लेकिन अन्यथा असंबंधित? यदि यह बाद की बात है, तो आप विधि को दो विधियों में विभाजित करने पर विचार कर सकते हैं, बल्कि। संपादित करें: यहां अपने निर्णय का उपयोग करें; कभी-कभी एक प्रकार का "संयोग" सामंजस्य सबसे अच्छा विकल्प हो सकता है। एक अन्य विकल्प एक जोड़ी या टपल निर्माण का उपयोग करना है, हालांकि ओओपी में, ये आमतौर पर सार्वजनिक एपीआई (कुछ उल्लेखनीय अपवाद मानक संग्रह, आदि) में नहीं देखे जाते हैं।
  • यदि मान वर्ग बनाने के लायक हैं, तो मैं शायद एक आंतरिक वर्ग का उपयोग करने के खिलाफ सलाह दूंगा। आंतरिक कक्षाएं आमतौर पर आंतरिक कार्यान्वयन विवरण के रूप में उपयोग की जाती हैं, जो बाहर से छिपी हुई हैं। क्या कोई कारण है कि यह परिणाम एक "पूर्ण विकसित" वर्ग नहीं होना चाहिए, अपने आप में?
  • डेटा रखने के अलावा, इस नए वर्ग के लिए कौन से ऑपरेशन लागू हैं? ऑब्जेक्ट ओरिएंटेड डिज़ाइन में, आप संबंधित डेटा को संबंधित डेटा (जो आपके इरादे भी लगते हैं) के करीब होना चाहते हैं। क्या जिस विधि का आप उल्लेख कर रहे हैं, वह इस वर्ग पर नहीं रहना चाहिए?

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

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


जबकि मैं इस उत्तर के सामान्य विचार से सहमत हूं, वैध मामले हैं जब डेटा के दो निकटता से संबंधित टुकड़ों की एक साथ गणना की जाती है, लेकिन कार्यक्रम में कहीं और कहीं भी उन्हें एक साथ बाँधने का कोई अर्थ नहीं है। ऐसे मामले में कुछ वापस करने के लिए यह काफी साफ हो सकता है Pair<OneClass, AnotherClass>। कुछ लोग असहमत होंगे । किसी भी मामले में, Pairएक कार्यान्वयन विवरण होना चाहिए और सार्वजनिक एपीआई पद्धति में कभी भी प्रकट नहीं होना चाहिए।
9000

@ 9000 मैं सहमत हूँ; मैं वास्तव में मतलब शब्द पर विचार इस मामले में सचमुच लिया जाना है, यानी बंटवारे विधि हमेशा सबसे अच्छा समाधान नहीं हो सकता है, यह सिर्फ उस दिशा में एक किसी न किसी संकेत है। मैं उन पंक्तियों के साथ एक संपादन करूँगा।
डैनियल बी

1
अच्छा उत्तर। केवल एक चीज जो मैं जोड़ूंगा, वह है सिंगल रिस्पॉन्सिबिलिटी प्रिंसिपल (SRP) ( en.wikipedia.org/wiki/Single_responsibility_principle ) का संदर्भ । यदि जाँच की जाए, तो यह बहुत संभव है कि चर्चा का तरीका एसआरपी का सरल उल्लंघन है और विभाजन एक सरल समाधान है। मेरे अनुभव में, जब भी कोई विधि 2 या अधिक मानों को वापस करना चाहती है, 90% मामलों में वहाँ 2 विधियाँ हैं या किसी अन्य वर्ग को निकाला जाना चाहिए।
पटकोस सेबा

@PatkosCsaba धन्यवाद, इसे शामिल करने के लिए एक संपादन किया। मैं आम तौर पर युग्मन और सामंजस्य के संदर्भ में चीजों को समझाने के लिए छड़ी करता हूं, लेकिन मुझे लगता है कि SOLID सिद्धांतों को इन दिनों तक जीने के बुनियादी नियमों के रूप में देखा जाता है।
डैनियल बी

@ डैनियलबी: मैं एसओएलआईडी को उच्च स्तर के रूप में देखता हूं और शायद अवधारणाओं को समझना आसान है। युग्मन और सामंजस्य अभी भी आधारभूत हैं, लेकिन वे अधिक निचले स्तर के हैं। SOLID कपलिंग और सामंजस्य का बहुत उपयोग करता है ताकि यह सिद्धांतों को समझा सके और उन्हें अधिक सामान्य स्तर पर प्रस्तुत किया जा सके।
पेटकोस सेबा

10

एक टुपल की अवधारणा है जिसे अन्य भाषाओं में चित्रित किया गया है, जैसे कि पायथन।

कोई इस सामान्य वर्ग का एक उदाहरण लौटा सकता है जो आसानी से पुन: उपयोग करने योग्य है:

public class TypedTuple<L, R> implements Serializable {
private static final long serialVersionUID = 1L;

  protected L left;
  protected R right;

  protected TypedTuple() {
    // Default constructor for serialization
  }

  public TypedTuple(L inLeft, R inRight) {
    left = inLeft;
    right = inRight;
  }

  public L getLeft() {
    return left;
  }

  public R getRight() {
    return right;
  }
}

2
कभी-कभी जेनेरिक स्टैटिक तरीका अच्छा होता है create(), जिससे कंस्ट्रक्टर में टाइप पैरामीटर निर्दिष्ट करने से बचें। इसके अलावा, मैं इस वर्ग के नाम हैं Pairबजाय Tupleदिया, तो वह केवल मान के 2-tuples का प्रतिनिधित्व कर सकते हैं।
अगुरार

5

ऐसा लगता है कि यह वर्ग दूसरे वर्ग से जिम्मेदारी ले रहा है, और इससे मुझे लगता है कि यह डिज़ाइन बहुत अच्छा नहीं है।

एक ऐसी विधि के लिए, जो बहुमूल्‍य मान लौटाती है, मैं चाहता हूँ

  • रिटर्न मान रखने वाले एक जेनेरिक कंट्रोलर (जैसे एक सूची या मानचित्र) को लौटाएं

या

  • वापसी मूल्य के लिए एक क्लास बनाएं, जिसमें सिर्फ आवश्यक फ़ील्ड + गेटर्स + सभी फ़ील्ड के साथ एक कंस्ट्रक्टर शामिल है

दूसरे विकल्प के लिए उदाहरण:

public Class FooBarRetval {
   private String foo;
   private int bar;

   public FooBarRetval (String foo, int bar) {
      this.foo = foo;
      this.bar = bar;
   }

   public String getFoo() {
      return foo;
   }

   public int getBar() {
      return bar;
   }
}

खेतों को सार्वजनिक करने से मूल्यों को अलग-अलग बदलने का विकल्प जुड़ जाता है, हालांकि स्पष्ट रूप से मूल्यों का संबंध है (अन्यथा उन्हें उसी विधि से वापस नहीं लौटना होगा)। मैं इस विशेष स्थिति में इस पैटर्न को बहुत हतोत्साहित करूंगा। लेकिन मुख्य बिंदु यह है कि सार्वजनिक बनाम निजी विशेषताओं की चर्चा का ओपी प्रश्न से कोई लेना-देना नहीं है और मुझे अन्यथा अच्छे उत्तर में अंतिम वाक्य के लिए कोई कारण नहीं दिखता है।
स्कारफ्रिज

पहले वाले को प्राथमिकता दी जानी चाहिए।
15

स्कारफ्रिज: पॉइंट लिया गया, अंतिम वाक्य हटा दिया गया।
user281377

2
बस सार्वजनिक अंतिम क्षेत्रों का उपयोग करें, एक्सेसरों के साथ समय बर्बाद करने का कोई कारण नहीं।
augurar

1

एक विधि से कई वापसी मूल्यों को अपनी कक्षा / संरचना में लाना अक्सर संदेश आधारित प्रणालियों में उपयोग किया जाता है जिसमें अनुरोध और प्रतिक्रिया के लिए एक वर्ग होता है । इसका एक उदाहरण सिंपल ऑब्जेक्ट एक्सेस प्रोटोकॉल (SOAP) है

क्या यह एक अच्छा डिज़ाइन है और क्यों?

कम से कम यह काफी सामान्य है। यदि यह अच्छा या बुरा है, तो यह आपके विशेष usecase पर निर्भर करता है।


0

संक्षिप्त उत्तर: आप दो मानों के साथ एक सरणी या सूची लौटा सकते हैं।

मैं व्यक्तिगत रूप से दो अलग-अलग तरीके लिखूंगा, जैसे

int x = obj.getX();
int y = obj.getY();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.