2010-03-20 13 views
5

मैं ऐसे ऐप्स लिखना चाहता हूं जो उपयोगकर्ता आदेश स्वीकार करता है। उपयोगकर्ता आदेश इस प्रारूप में प्रयोग किया जाता है:इस तर्क/कोड को सरल कैसे करें?

आदेश -parameter

उदाहरण के लिए, अनुप्रयोग "कॉपी", हो सकता है "चिपकाएँ", "हटाएँ" आदेश मैं इस कार्यक्रम में सोच रहा हूँ चाहिए इस तरह काम करते हैं:

public static void main(String args[]){ 

    if(args[0].equalsIgnoreCase("COPY")){ 
    //handle the copy command 

    } else if(args[0].equalsIgnoreCase("PASTE")){ 
    //handle the copy command 


    }/** 
    code skipped 
    **/ 


} 

तो, यह काम करता है, लेकिन मुझे लगता है कि जब मैं अपने कार्यक्रम में अधिक आदेश है यह अधिक से अधिक जटिल हो जाएगा, यह भी, इसे पढ़ने के लिए अलग है। तर्क के लिए कोई विचार?

+3

यह भी देखें http://stackoverflow.com/questions/1199646 – dfa

उत्तर

7

यदि आप के बारे में चिंतित हैं तो कमांड लाइन पैरामीटर को संभालने के लिए Commons CLI इसका अर्थ है।
CommandLineParser

के माध्यम से जाओ और आप अपने अगर-बाकी तो आप उपयोग कर सकते हैं कमान पैटर्न की जटिलता

public interface Command { 
    void exec(); 
} 

public class Copy implements Command {  
    void exec() { 
      // your copy Code 
    } 
} 

public class Paste implements Command {  
    void exec() { 
      // your Paste Code 
    } 
} 


public class Delete implements Command {  
    void exec() { 
      // your Delete Code 
} 

बारे में चिंतित हैं, तो - तो

public static void main(String args[]){ 
Map commandMap<String,Command> = new HashMap<String,Command>(); 
commandMap.put("Copy", new Copy()); 
commandMap.put("Paste", new Paste()); 
commandMap.put("Delete", new Delete()); 

if (commandMap.containsKey(args[0])){ 
commandMap.get(args[0]).exec(); 

} 
} 
+1

+1 यह उत्तर है। मैं कमांड मैप बनाने के लिए आवश्यकता से छुटकारा पाने के लिए पारित स्ट्रिंग से कमांड क्लास बनाने के लिए प्रतिबिंब का उपयोग करने के लिए भी बहुत मोहक हूं, जो आदेशों की संख्या बढ़ने के साथ भारी और कुछ हद तक गन्दा हो सकता है। – Robin

+0

+1 हां, यह मेरा सुझाव भी होगा यदि आप अपने 'if' खंडों से छुटकारा पाने के लिए और थोड़ा अधिक लचीला बनाना चाहते हैं। –

3

अपने कोड से कमांड लाइन तर्क पार्सिंग की गड़बड़ी को बनाए रखने के लिए लाइब्रेरी का उपयोग करें, उदाहरण के लिए args4j

7

कैसे सरल अपने आदेश पंक्ति वाक्य रचना के आधार पर, एक सरल enum अपने समाधान

public enum Command { 
    COPY { 
     @Override void execute() { 
      System.out.println("Copying..."); 
     } 
    }, 
    PASTE { 
     @Override void execute() { 
      System.out.println("Pasting..."); 
     }  
    }, 
    DELETE { 
     @Override void execute() { 
      System.out.println("Deleting...");   
     } 
    }, 
    ; 

    abstract void execute(); 

    public static void main(String args[]) { 
     Command c = Command.valueOf(args[0].toUpperCase()); 
     c.execute(); 
    } 
} 

संकलित हो सकता है और java Command paste साथ java Command bleh इस चलाने के लिए, हो सकता है, आदि आप को args के बाकी पारित करने के लिए चाहता हूँ आपके उत्पादन कोड में enum। इसके अलावा, valueOfIllegalArgumentException फेंकता है यदि निर्दिष्ट नाम के साथ कोई enum स्थिरांक नहीं मिलता है।


अपने वाक्य रचना हालांकि, और अधिक जटिल होने के लिए बढ़ता है, तो आप पुस्तकालयों को विशेष कमांड लाइन पार्स, उदा के लिए बनाया गया उपयोग कर सकते हैं Apache Commons CLI

+2

यह वास्तव में अगर/elseifs के ढेर से बेहतर नहीं है। यदि आप enums का उपयोग कर रहे हैं तो यह तर्क को enum की विधि में स्थानांतरित करने के लिए बहुत अच्छा होगा, तो आप बस सभी गन्दा जांच या स्विचिंग के बजाय Command.valueOf (...) निष्पादित() का उपयोग कर सकते हैं। – Chris

+0

सुझाव के लिए धन्यवाद! जोड़ा गया! – polygenelubricants

+1

यह कोड मात्रा के मामले में अब बहुत अच्छा है, भले ही थोड़ा जादू हो। – msandiford

0

कई पुस्तकालय हैं जो सभी कोड को लिखने के बजाय इस स्थिति को संभाल सकते हैं।

1

जब मैं बहुत सारे/फिर/कोड कोड देखता हूं, मैं तुरंत पॉलीमोर्फिज्म को एक संभावित समाधान के रूप में सोचता हूं।

एक कमांड इंटरफ़ेस और एक मानचित्र इस समस्या को हल करने का एक अच्छा तरीका होगा। अगर मैं जावा में इस लिख रहे थे, यह इस प्रकार दिखाई देंगे:

public interface Command<T, V> 
{ 
    V execute(T parameter) throws Exception; 
} 

अपने संचालन मल्टी-थ्रेडेड हैं, तो आप बस आदेश के लिए Runnable इंटरफ़ेस है कि एक मूल्य और प्रतिदेय < टी > नहीं लौटते पुनः उपयोग कर सकते जो लोग करते हैं उनके लिए।

किसी भी मामले में, अब आपका if/then/else निर्माण एक मानचित्र है जहां कुंजी नाम है और मान कमांड ऑब्जेक्ट है। आप नाम कुंजी प्रदान करके एक कमांड देखते हैं।आप कमांड इंटरफ़ेस का एक नया कार्यान्वयन लिखकर और इसे मानचित्र में जोड़कर एक नया आदेश जोड़ते हैं। नक्शा शुरू करना कुछ ऐसा है जो आप स्टार्टअप पर करते हैं। आप इसे कॉन्फ़िगरेशन के रूप में भी बाहरी कर सकते हैं ताकि आपको नए (ओपन/क्लोज़ेड सिद्धांत) जोड़ने के लिए कोड को संशोधित करने की आवश्यकता न हो।

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