2013-01-09 11 views
8

मुझे जावा में स्थितियों को लागू करने के लिए सही दृष्टिकोण के लिए सुझाव की आवश्यकता है।जावा: शर्तों की एक लंबी सूची, क्या करना है?

मेरे पास 100 स्थितियां हैं जिनके आधार पर मुझे स्ट्रिंग वेरिएबल के मान को बदलना है जो उपयोगकर्ता को प्रदर्शित किया जाएगा।

एक उदाहरण हालत: a<5 && (b>0 && c>8) && d>9 || x!=4

अधिक की स्थिति देखते हैं लेकिन चर एक ही कम या ज्यादा कर रहे हैं।

मैं अब यह सही कर रहा हूँ:

if(condition1) 
    else if(condition2) 
    else if(condition3) 
    ... 

एक स्विच मामले विकल्प स्पष्ट रूप से वहाँ अगर-और की यानी

if(condition1) 
switch(x) 
    { 
    case y: 
    blah-blah 
    }   
else if(condition2) 
switch(x) 
    { 
    case y: 
    blah-blah 
    } 
else if(condition3) 
... 

भीतर नेस्ट किया जाएगा लेकिन मैं का उपयोग कर की तरह कुछ और सुरुचिपूर्ण समाधान के लिए देख रहा हूँ इसके लिए पॉलिमॉर्फिक समर्थन के साथ एक इंटरफेस, कोड की रेखाओं से बचने के लिए संभवतः क्या हो सकता है या सही दृष्टिकोण क्या होना चाहिए।

--- संपादित करें ---


enter image description here

मैं वास्तव में एक Android डिवाइस पर इस आवश्यकता होती है। लेकिन यहां एक जावा का निर्माण अधिक है।

यह मेरे साथ स्थित स्थितियों का एक छोटा स्नैपशॉट है। कुछ सही होंगे यदि कुछ सही हैं। जाहिर है कि अगर और अधिक की आवश्यकता होगी और उनको भी घोंसला जा सकता है। उस स्थिति में प्रसंस्करण धीमा हो जाएगा।

मैं अब विभिन्न स्ट्रिंग चर के साथ एक अलग वर्ग में संदेशों को संग्रहीत करने के रूप में कर रहा हूँ उन मैं स्थिर रखा है, इसलिए यदि एक शर्त सच तो हो जाता है मैं केवल कक्षा से स्थिर चर लेने और कि प्रदर्शित एक। क्या परिणामस्वरूप संदेश संग्रहीत करने के बारे में यह सही होगा।

+4

मुझे कोड की रेखाओं से परहेज करने के बारे में निश्चित नहीं है। लेकिन प्रदर्शन में वृद्धि, शीर्ष पर अधिक लगातार मामलों को रखने? –

+1

IMHO यह प्रश्न http://codereview.stackexchange.com/ –

+4

के लिए अधिक उपयुक्त है आपके लिए प्रदर्शन कितना महत्वपूर्ण है? क्योंकि लचीलापन और पठनीयता के मामले में कुछ अधिक "सुरुचिपूर्ण" समाधान एक बदसूरत पेड़ से भी बदतर होंगे यदि if-elses – radai

उत्तर

7

सशर्त आदानों की संख्या पर निर्भर करता है, आप एक लुक-अप तालिका, या यहां तक ​​कि एक HashMap उपयोग करने के लिए एक एकल मूल्य में सभी आदानों या यहाँ तक कि कुछ अपेक्षाकृत सरल जटिल परिस्थितियों एन्कोडिंग द्वारा सक्षम हो सकता है:

int key = 0; 

key |= a?(1):0; 
key |= b?(1<<1):0; 
key |= (c.size() > 1)?(1<<2):0; 
... 

String result = table[key]; // Or result = map.get(key); 

इस प्रतिमान में निरंतर समय (O(1)) जटिलता का अतिरिक्त लाभ है, जो कुछ अवसरों में महत्वपूर्ण हो सकता है। शर्तों की जटिलता के आधार पर, आपके पास औसतन कोड-पथ में कम शाखाएं हो सकती हैं, क्योंकि if-then-else स्पेगेटी कोड के विपरीत, जो प्रदर्शन सुधारों का कारण बन सकता है।

यदि आप अपने प्रश्न में अधिक संदर्भ जोड़ते हैं तो हम आपकी सहायता करने में सक्षम होंगे। हालत इनपुट कहां से आ रहे हैं? वे किस प्रकार के लोग है?

और अधिक महत्वपूर्ण सवाल: What is the actual problem that you are trying to solve?

+0

मैं इसे आज़मा दूंगा। – Prateek

+1

मुझे लगता है कि यह बनाए रखना मुश्किल होगा, क्योंकि आप बयान के लंबे अनुक्रम के साथ समाप्त होते हैं, जहां एक ही कथन स्वयं जटिल होता है। चूंकि इन स्थितियों का उपयोग उपयोगकर्ता संदेशों के लिए किया जाता है, इसलिए वे अक्सर परिवर्तन के अधीन हो सकते हैं। तो आप अपने कोड में रखरखाव हॉटस्पॉट बनाएंगे। – SpaceTrucker

+0

@ स्पेसट्रकर: मैं सिद्धांत रूप से सहमत हूं, हालांकि यह इस बात पर निर्भर करेगा कि कोड वास्तव में कैसे निर्धारित किया जाता है और इसके लिए वास्तव में क्या उपयोग किया जा रहा है। यह काफी संभावना है कि, एक बार ओपी हमें यह बताता है कि यह वास्तव में क्या है, हम उच्च स्तर के कार्य से निपटने के लिए एक और अधिक सुरुचिपूर्ण समाधान पाएंगे, "अनिवार्य रूप से एक कोड कैसे जटिल हो सकता है" जावा में तर्क तालिका? " – thkala

4

यह करने के लिए संभावनाओं का एक बहुत हैं। आपके डोमेन के बारे में ज्यादा जानने के बिना, मैं की तरह (आप बेहतर नाम के बारे में सोच सकते हैं: पी) कुछ बनाना चाहते हैं

public interface UserFriendlyMessageBuilder { 
     boolean meetCondition(FooObjectWithArguments args); 

     String transform(String rawMessage); 
} 

इस तरह, आप UserFriendlyMessageBuilder के Set बना सकते हैं और सिर्फ पहली को पूरा करती है कि के लिए उन के माध्यम से पुनरावृति आपके कच्चे संदेश को बदलने की स्थिति।

public class MessageProcessor { 
    private final Set<UserFriendlyMessageBuilder> messageBuilders; 

    public MessageProcessor(Set<UserFriendlyMessageBuilder> messageBuilders) { 
     this.messageBuilders = messageBuilders; 
    } 

    public String get(FooWithArguments args, String rawMsg) { 

     for (UserFriendlyMessageBuilder msgBuilder : messageBuilders) { 
      if (msgBuilder.meetCondition(args)) { 
       return msgBuilder.transform(rawMsg); 
      } 
     } 
     return rawMsg;  
    } 
} 
+0

जिसमें ओ (एन) लुकअप टाइम (एन ऐसे क्लासिफायरों की संख्या होगी) प्रोबैली के विपरीत एक पेड़ के लिए आदर्श रूप से एक पेड़ (लॉग (एन) के लिए कम जटिलता) – radai

+2

@radai मैं आपका बिंदु देखता हूं । ~ लॉग (एन) केवल तभी होता है जब उसके अगर/elses जहां/elses के अंदर घोंसला हो। यदि नहीं, तो वे वही ओ (एन) भी होंगे। इसके अलावा, मुझे लगता है कि साधारण तुलना के इस मामले के लिए, खर्च किया गया समय वास्तव में कम होगा। –

+0

@RalfHoppen अगर मेरे मामले में if-elses घोंसला नहीं है लेकिन यह पसंद का मामला हो सकता है। चलिए इसे घोंसले के साथ जाने वाले मौसम पर सुझाव जोड़ने के लिए भी चिह्नित करते हैं या नहीं – Prateek

0

मुझे लगता है क्या "आप बहुत कम महत्व दिया जाता है मॉड्यूल में उत्पाद डिजाइन करने के लिए" कौन सा OOP भाषा का उपयोग करने का मुख्य कारक है।

उदाहरण: यदि आपके पास 100 स्थितियां हैं और आप 4 मॉड्यूल बनाने में सक्षम हैं तो कुछ भी चुनने के लिए थोटोटिक रूप से आपको 26 स्थितियों की आवश्यकता है।

0

यह एक अतिरिक्त संभावना है जो विचार करने लायक हो सकती है।

प्रत्येक तुलना लें, और इसकी सत्यता की गणना करें, फिर परिणाम तालिका में परिणामस्वरूप बूलियन [] देखें। simplifying truth tables पर बहुत से मौजूदा काम हैं जिन्हें आप लागू कर सकते हैं। मेरे पास एक सत्य तालिका सरलीकरण applet है जिसे मैंने कई साल पहले लिखा था। आप इसका स्रोत कोड उपयोगी पा सकते हैं।

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

भले ही आप कोड में सीधे सत्य तालिका का उपयोग न करें, तो अपने कोड को व्यवस्थित करने के तरीके के रूप में लिखने और सरल बनाने पर विचार करें।

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