2011-10-21 11 views
6

से बचने के लिए एक डिज़ाइन पैटर्न मेरे पास वास्तव में एक भयानक कक्षा है जिसमें दो विधियां हैं जो कि सेवाएं उपलब्ध होने पर कुछ सेवाओं को शुरू या बंद कर देती हैं। निम्नलिखित की तरह कुछ (वे कर रहे हैं नहीं तो-elses, बस अगर):एकाधिक ifs

void startServices() { 
if (service1 == true) { 
    start1(); 
} 
if (service2 == true) { 
    start2(); 
} if (serviceN == true) { 
    startN(); 
} 
} 


void stopServices() { 
if (service1 == true) { 
    stop1(); 
} 
if (service2 == true) { 
    stop2(); 
} 
if (serviceN == true) { 
    stopN(); 
} 

} 

तुम मुझे यह खूबसूरत बनाने के लिए किसी भी डिजाइन गपशप सुझाव देते हैं?

धन्यवाद!

+0

मैं इसका उत्तर नहीं दूंगा क्योंकि मौजूदा उत्तर अच्छे हैं, लेकिन मैं यह इंगित करना चाहूंगा कि '== true' किसी भी' if() 'में कुछ हद तक अनावश्यक है। –

उत्तर

4

निर्भर करता है; मेरी पहली प्रतिक्रिया हैश या सरणी में सेवाओं को स्टोर करना है। प्रत्येक सेवा प्रारंभ और बंद विधियों के साथ एक इंटरफ़ेस लागू करती है। सेवा शुरू करना या रोकना, फिर केवल एक सेवा कुंजी या अनुक्रमणिका की आवश्यकता होती है।

यह अभी भी थोड़ा भंगुर है, लेकिन बिना किसी ज्ञात के मुझे यकीन नहीं है कि "डोमेनइफ़" कैसे करें, इसलिए यह आपके जैसा काम करता है।

4

आप रणनीति पैटर्न का उपयोग कर सकते हैं।

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

public interface IStartupStrategy 
{ 
    void Start(); 
} 

public interface IStopStrategy 
{ 
    void Stop(); 
} 

public class MyClass 
{ 
    private readonly IEnumerable<IStartupStrategy> startupStrategies; 
    private readonly IEnumerable<IStopStrategy> stopStrategies; 

    public MyClass(IEnumerable<IStartupStrategy> startup, IEnumerable<IStopStrategy> stop) 
    { 
     this.startupStrategies = startup; 
     this.stopStrategies = stop; 
    } 

    public void Start() 
    { 
     foreach(var strategy in this.startupStrategies) 
     { 
      strategy.Start(); 
     } 
    } 

    public void Stop() 
    { 
     foreach(var strategy in this.stopStrategies) 
     { 
      strategy.Stop(); 
     } 
    } 
} 
+0

यह मुझे इंप्रेशन देता है कि रणनीति पैटर्न को इस समस्या पर अंधाधुंध लागू किया गया था। मुझे नहीं लगता कि नामकरण बहुत अधिक समझ में आता है; कई स्टार्ट-अप रणनीतियों हैं? प्रत्येक सेवा के लिए एक? वास्तव में – Guven

+1

। मैं पैटर्न का स्पष्ट प्रतिनिधित्व देने का प्रयास कर रहा था, लेकिन ऐसा करने में मैंने कई स्टार्ट और स्टॉप रणनीतियों में "आईएसईसी" होना चाहिए था। आदर्श रूप से आप "IService" इंटरफ़ेस का उपयोग करेंगे जो विधियों को शुरू और बंद कर देगा। तब वह सेवा तय कर सकती है कि क्या वह या तो शुरू या बंद करना चाहता है। सेवाएं कौन सी सेवाएं उपलब्ध हैं, इस आधार पर सेवाएं पारित की जाएंगी, और कॉलिंग क्लास तय करेगा कि * कब * उन सेवाओं को शुरू या बंद करना चाहिए। यह अभी भी रणनीति पैटर्न है, लेकिन रणनीति एक से अधिक विधि होगी। –

+0

मैंने पूर्व टिप्पणी में जो लिखा है उसे फिर से पढ़ा। यदि रणनीति पैटर्न अनिवार्य रूप से निष्पादित करने के लिए कुछ एल्गोरिदम में गुजर रहा है कि कॉलिंग क्लास आपूर्ति नहीं करता है ... पूरी तरह से नियंत्रण में उलटा एक रणनीति पैटर्न माना जाएगा? सिर्फ एक विचार। –

2

उपयोग वस्तुओं, जहाँ आप सेवा जो आप उन्हें एक विरासत विधि विराम के साथ बंद करने के माध्यम से पुनरावृति कर सकते हैं की एक सूची है()।

public interface Service { 
    void start(); 
    void stop(); 
} 

public class TestService implements Service { 
    @Override 
    void start() { 
    } 

    @Override 
    void stop() { 
    } 
} 

प्रत्येक सेवा अपने राज्य को भी स्टोर कर सकती है ताकि वे चालू होने पर उन्हें बंद कर सकें।

0

स्विच स्टेटमेंट कम भ्रमित हैं। यदि enums कोड के साथ एक साथ उपयोग किया जाता है तो बहुत पठनीय हो जाता है।

संबंधित मुद्दे