java नेस्टेड कॉलबैक के लिए जावा पैटर्न?





2 Answers

मेरी राय में, इस तरह की समस्या का मॉडल करने का सबसे स्वाभाविक तरीका Future<V>

तो कॉलबैक का उपयोग करने के बजाय, बस "थंक" लौटाएं: एक Future<Response> जो उस प्रतिक्रिया का प्रतिनिधित्व करता है जो भविष्य में किसी बिंदु पर उपलब्ध होगा।

फिर आप Future<ResponseB> step2(Future<ResponseA>) जैसी चीजों के रूप में बाद के चरणों को मॉडल कर सकते हैं, या ListenableFuture<V> उपयोग Guava से कर सकते हैं। फिर आप अपने कार्यों को प्राकृतिक तरीके से चेन करने के लिए Futures.transform() या इसके Futures.transform() एक का उपयोग कर सकते हैं, लेकिन अभी भी एसिंक्रोनस प्रकृति को संरक्षित करते समय।

यदि इस तरह से उपयोग किया जाता है, तो Future<V> एक मोनड की तरह व्यवहार करता है (वास्तव में, मुझे लगता है कि यह एक के रूप में योग्य हो सकता है, हालांकि मुझे अपने सिर के ऊपर से यकीन नहीं है), और इसलिए पूरी प्रक्रिया आईओ की तरह महसूस करती है IOS monad के माध्यम से प्रदर्शन के रूप में Haskell में।

java design-patterns asynchronous callback nested

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

public interface Request {} 

public interface Response {} 

public interface Callback<R extends Response> {
    void onSuccess(R response);
    void onError(Exception e);
}

Request और Response इंटरफेस के विभिन्न जोड़े कार्यान्वयन हैं, अर्थात् RequestA + ResponseA (क्लाइंट द्वारा दिया गया), RequestB + ResponseB (सेवा द्वारा आंतरिक रूप से उपयोग किया जाता है) इत्यादि।

प्रसंस्करण प्रवाह इस तरह दिखता है:

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

अब तक मैंने जावा में कोडिंग करने के लिए दो दृष्टिकोणों की कोशिश की है:

  • गुमनाम वर्ग: आवश्यक घोंसले की वजह से बदसूरत हो जाता है
  • आंतरिक कक्षाएं: उपरोक्त की तुलना में neater, लेकिन अभी भी निष्पादन के प्रवाह को समझने के लिए एक और डेवलपर के लिए मुश्किल है

क्या इस कोड को और अधिक पठनीय बनाने के लिए कुछ पैटर्न है? उदाहरण के लिए, क्या मैं सेवा पद्धति को स्व-निहित संचालन की सूची के रूप में व्यक्त कर सकता हूं जो कि कुछ ढांचे वर्ग द्वारा अनुक्रम में निष्पादित किया जाता है जो घोंसले की देखभाल करता है?




मुझे यकीन नहीं है कि क्या मैं आपको सही तरीके से प्रश्न पूछता हूं। यदि आप एक सेवा शुरू करना चाहते हैं और इसके पूरा होने पर परिणाम को अन्य ऑब्जेक्ट में पारित करने की आवश्यकता है जो परिणाम का उपयोग करके प्रसंस्करण जारी रख सकता है। आप इसे प्राप्त करने के लिए समग्र और पर्यवेक्षक का उपयोग कर देख सकते हैं।






Related