किसी भी तरह से मैं विश्वास नहीं कर सकता कि मैं उस समस्या में भाग लेने वाला पहला व्यक्ति हूं (और मैं विश्वास नहीं करना चाहता कि मैं केवल एक मूर्ख हूं जो सीधे समाधान देखने के लिए पर्याप्त नहीं है), लेकिन मेरी खोज-फू मजबूत नहीं थी पर्याप्त।समापन घटनाओं का उपयोग करते समय स्पेगेटी कोड से कैसे बचें?
मैं नियमित रूप से एक स्थिति में भाग जाता हूं, जब मुझे एक के बाद एक समय लेने वाले कदमों की आवश्यकता होती है। कार्यप्रवाह लग रहा है
तरहvar data = DataGetter.GetData();
var processedData = DataProcessor.Process(data);
var userDecision = DialogService.AskUserAbout(processedData);
// ...
मैं प्रत्येक चरण में यूआई ब्लॉक करने के लिए नहीं करना चाहते हैं, तो हर विधि तुरंत वापसी करता है, और एक बार यह समाप्त हो गया है एक घटना को जन्म देती है। अब आनंद
DataGetter.Finished += (data) =>
{
DataProcessor.Finished += (processedData) =>
{
DialogService.Finished(userDecision) =>
{
// ....
}
DialogService.AskUserAbout(processedData);
}
DataProcessor.Process(data);
};
DataGetter.GetData();
यह बहुत ज्यादा मेरे स्वाद के लिए Continuation-passing style की तरह पढ़ता है, और वहाँ इस कोड की संरचना करने के लिए एक बेहतर तरीका हो गया है में ensues, ऊपर कोड ब्लॉक mutates के बाद से। पर कैसे?
बनाता है मुझे निरंतरता कार्य के बारे में सोच: http://www.blackwasp.co.uk/ContinuationTasks.aspx –
यह 'await' साथ सी # 5 में बड़े पैमाने पर आसान हो जाएगा। तो हाँ, लोग हर समय इसमें भागते हैं और यह सुंदर नहीं है - वास्तव में इसे मूल भाषा में बनाने के लिए पर्याप्त है। इनपुट के लिए –