2012-06-05 15 views
6

मेरे पास लगभग एक ही पैटर्न के साथ लगभग 20 कार्य हैं, मैं साइट्स के सरणी पर चलाता हूं, साइट ऑब्जेक्ट के साथ साइटऑपरेशन बनाता हूं और कुछ ऑपरेशन करता हूं (इस मामले में एक परम के साथ लेकिन कभी-कभी कोई भी या अधिक नहीं होता)इसी तरह के फ़ंक्शन रिफैक्टरिंग पैटर्न

int wantedBandwidthInLBps = 2048/8; 
foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.LimitBandwidth(wantedBandwidthInLBps); 
} 

foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.KillJames(); 
} 

foreach (Sites site in _sitesManagement.GetAll()) 
{ 
SiteOperation siteOperation = new SiteOperation(site); 
siteOperation.FlyToMoon(2012, new TaskIdentifier(10,20)); 
} 

क्या यह कोड लपेटना संभव है, इसलिए मैं सिर्फ _sites प्रबंधन कहने के लिए कार्रवाई भेजूंगा जो इस साइट को सभी साइटों पर चलाएगा?

+3

क्या आप कुछ अन्य कार्यों को पोस्ट कर सकते हैं ताकि हम देख सकें कि वास्तव में क्या लपेटा जा सकता है? – gingerbreadboy

+0

@gingerbreadboy, सुनिश्चित करें – eugeneK

उत्तर

4

इस प्रयास करें:

void PerformOperationOnAllSites(Action<SiteOperation> doIt) { 
    foreach (Sites site in _sitesManagement.GetAll()) { 
     SiteOperation siteOperation = new SiteOperation(site); 
     doIt(siteOperation); 
    } 
} 

... 

_sitesManagement.PerformOperationOnAllSites(op => op.LimitBandwidth(wantedBandwidthInLBps)); 
_sitesManagement.PerformOperationOnAllSites(op => op.KillJames()); 
_sitesManagement.PerformOperationOnAllSites(op => op.FlyToMoon(2012, new TaskIdentifier(10,20)); 
+0

क्या मैं गलत कह रहा हूं कि इस विधि के लिए मुझे साइटऑपरेशन को प्रत्येक विधि के लिए सर्वोपरि के रूप में प्राप्त करने की आवश्यकता होगी? – eugeneK

+0

अरे वहां तेजी से उंगलियां हैं: पी – gingerbreadboy

+0

@ यूजीनके यह विधि 'साइटऑपरेशन' को आपके * लैम्बडास * को केवल पैरामीटर के रूप में पास कर देगी, इसलिए आपके लैम्बडास को इसके बारे में कुछ अन्य डेटा के साथ, शायद इस पर काम करने की आवश्यकता होगी कॉल (जैसे पहली कॉल में 'वांछित बैंडविड्थइनएलबीपीएस')। – dasblinkenlight

1
public void DoSiteOperationActions(Action<SiteOperation> toDo) 
{ 
     foreach (Sites site in _sitesManagement.GetAll()) 
     { 
      SiteOperation mySiteOperation = new SiteOperation(site); 
      toDo(mySiteOperation); 
     } 
} 

और फिर आप इसे पसंद कॉल कर सकते हैं ...

DoSiteOperationActions(so => so.FlyToMoon(2012, new TaskIdentifier(10,20)));

वाक्य रचना एक छोटे से बंद हो सकता है, मैं यहां कोई आईडीई नहीं है, लेकिन यहां अधिक जानकारी http://msdn.microsoft.com/en-us/library/018hxwa8.aspx

0
private static void InvokeMethod(Action<SiteOperation> action) 
    { 
     foreach (SiteOperation siteOperation in _sitesManagement.GetAll() 
           .Select(site=>new SiteOperation(site)) 
     { 
      action(siteOperation); 
     } 
    } 
.. 

    public static void KillJames() 
    { 
     InvokeMethod(so => so.KillJames()); 
    } 

    public static void LimitBandwidth(int wantedBandwidthInLBps) 
    { 
     InvokeMethod(so => so.LimitBandwidth(wantedBandwidthInLBps)); 
    } 

    public static void FlyToMoon(int year=2012, TaskIdentifier ti=new TaskIdentifier(10,20)) 
    { 
     InvokeMethod(so => so.FlyToMoon(year, ti)); 
    } 
संबंधित मुद्दे