मेरे पास एक ऐसा एप्लिकेशन है जिसमें दो प्रक्रियाएं होती हैं, एक (एसडब्ल्यूटी-आधारित) जीयूआई और एक सर्वर प्रक्रिया के साथ एक क्लाइंट प्रक्रिया होती है। क्लाइंट प्रक्रिया बहुत हल्का है, जिसका अर्थ है कि बहुत सारे जीयूआई ऑपरेशंस को सर्वर प्रक्रिया से पूछना होगा या किसी चीज़ से अनुरोध करना होगा, उदाहरण के लिए उपयोगकर्ता को बटन पर क्लिक करने या मेनू आइटम चुनने के जवाब में। इसका मतलब है कि वहाँ ईवेंट हैंडलर्स का एक बहुत है कि इस तरह दिखता है हो जाएगा:आंतरिक कक्षाओं के साथ अनुरोध-प्रतिक्रिया प्रवाह के लिए पैटर्न
// Method invoked e.g. in response to the user choosing a menu item
void execute(Event event) {
// This code is executed on the client, and now we need some info off the server:
server.execute(new RemoteRequest() {
public void run() {
// This code is executed on the server, and we need to update the client
// GUI with current progress
final Result result = doSomeProcessing();
client.execute(new RemoteRequest() {
public void run() {
// This code is again executed on the client
updateUi(result);
}
}
}
});
}
हालांकि, बाद से server.execute
एक क्रमबद्धता (यह एक दूरस्थ मशीन पर निष्पादित किया जाता है) का अर्थ है, इस पद्धति पूरी किए बिना संभव नहीं है कक्षा serializable (RemoteRequest
आंतरिक वर्ग स्थिर नहीं हैं (बस स्पष्ट होने के लिए: यह एक आवश्यकता नहीं है कि Request
कार्यान्वयन आवेदन के लिए माता-पिता के उदाहरण के लिए मूल उदाहरण तक पहुंच सकता है)
बेशक , एक समाधान अनुरोध और प्रतिक्रिया के लिए अलग (संभवतः स्थैतिक आंतरिक) कक्षाएं बनाना है, लेकिन इससे पठनीयता को नुकसान पहुंचाता है और इसे कठिन बनाना मुश्किल हो जाता है निष्पादन प्रवाह को मिटा दें।
मैंने इस समस्या को हल करने के लिए कोई मानक पैटर्न खोजने की कोशिश की है, लेकिन मुझे कुछ भी नहीं मिला है जो पठनीयता के बारे में मेरी चिंता का उत्तर देता है।
स्पष्ट होने के लिए, इनमें से बहुत से ऑपरेशन होंगे, और ऑपरेशन अक्सर काफी कम होते हैं। ध्यान दें कि Future
ऑब्जेक्ट्स पूरी तरह से यहां उपयोगी नहीं हैं, क्योंकि कई मामलों में सर्वर से एक अनुरोध को क्लाइंट (अक्सर अलग-अलग) पर कई चीजें करने की आवश्यकता होती है, और यह हमेशा परिणाम न लौटाया जाता है। (अब स्पष्ट छद्म कोड, कृपया विवरण में स्पष्ट त्रुटियों उपेक्षा)
String personName = nameField.getText();
async exec on server {
String personAddress = database.find(personName);
async exec on client {
addressField.setText(personAddress);
}
Order[] orders = database.searchOrderHistory(personName);
async exec on client {
orderListViewer.setInput(orders);
}
}
अब मैं स्पष्ट कर देना चाहते कि अंतर्निहित:
आदर्श रूप में, मैं इस तरह कोड लिखने में सक्षम होना चाहते हैं आर्किटेक्चर जगह पर है और अच्छी तरह से काम करता है, इस समाधान का कारण यह है कि उपर्युक्त उदाहरण नहीं है। एकमात्र चीज जिसे मैं ढूंढ रहा हूं वह उपरोक्त की तरह कोड लिखने का एक तरीका है, प्रत्येक प्रक्रिया संक्रमण के लिए स्थैतिक कक्षाओं को परिभाषित किए बिना। मुझे उम्मीद है कि मैंने इस उदाहरण को देकर जटिलताओं को जटिल नहीं किया है ...
यह जेएम से कैसे संबंधित है? क्या यह कोड क्लाइंट या सर्वर या किसी अन्य मशीन पर निष्पादित है? – Andrejs
हां, यह है। ऐसे मामले हैं जहां क्लाइंट और सर्वर पर कोड निष्पादित किया जाता है। ऐसे मामले भी हैं जहां क्लाइंट सर्वर पर कुछ निष्पादित करता है जो बदले में क्लाइंट पर कुछ निष्पादित करता है। – Krumelur
मुझे लगता है कि हमें थोड़ा और विवरण चाहिए। क्या अनुरोध है/अपनी खुद की कक्षाओं का जवाब दें या वे कुछ ढांचे का हिस्सा हैं? निष्पादन वास्तव में क्या करता है? – Andrejs