मुझे कुछ कोड मिला है जिसमें बहुत अधिक नकल है। समस्या इस तथ्य से आती है कि मैं नेस्टेड IDisposable
प्रकारों से निपट रहा हूं। आज मैं कुछ है कि तरह दिखता है:नेस्टेड उपयोग में शामिल एक रिफैक्टर कोड कैसे हो सकता है?
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
}
}
public bool GetSomeValueById(Guid innerId)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
return c.GetSomeValue();
}
}
पूरे नेस्टेड using
ब्लॉक इन तरीकों में से प्रत्येक के लिए एक ही है (दो दिखाए जाते हैं, लेकिन उनमें से दस के बारे में कर रहे हैं)। एकमात्र चीज जो अलग है वह तब होती है जब आप using
ब्लॉक के आंतरिक स्तर तक पहुंच जाते हैं।
एक तरह से मैं सोच रहा था की तर्ज पर कुछ करने के लिए होगा:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
ActOnC(innerId, c =>
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
});
}
public bool GetSomeValueById(Guid innerId)
{
var result = null;
ActOnC(innerId, c => { result = c.GetSomeValue(); });
return result;
}
private void ActOnC(Guid innerId, Action<TheCType> action)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
action(c);
}
}
यह काम करता है, यह सिर्फ एक तरह से (एक इंसान के रूप में) पार्स करने के लिए भद्दा है। क्या किसी के पास कोई अन्य सुझाव है कि कोई इस तरह के नेस्टेड using
ब्लॉक के आसपास कोड डुप्लिकेशंस को कैसे कम कर सकता है? यदि वे IDisposable
नहीं थे तो संभवतः b.GetC(innerId)
के परिणामों को वापस करने के लिए एक विधि तैयार की जाएगी ... लेकिन यह मामला यहां नहीं है।
+1 मैं कुछ भी अपने समाधान में भद्दा दिखाई नहीं देता। यह प्रक्रियात्मक से अधिक कार्यात्मक होने के रूप में अपरंपरागत है, लेकिन मैं इसे एक समर्थक के रूप में मानता हूं, न कि – mfeingold
पर मुझे लगता है कि आपका कार्यान्वयन ठीक दिखता है लेकिन शायद आप नीचे दिए गए कुछ विकल्पों को प्राथमिकता देंगे। यदि आपको अपने आप को बहुत से डिस्पोजेबल चेन करना पड़ता है तो आप चीजों को फिर से डिजाइन करने के लिए देख सकते हैं ताकि आप इस स्थिति में खत्म न हों। – Thomas