2015-12-27 6 views
5

मैं एक एक्सएमएल फ़ाइल को पार्सल करने के लिए एक प्रोग्राम लिखता हूं जो एक सामान्य टैग मान को सीरियलनम नामक एक हेडर टैग में निहित करता है। फ़ाइल नीचे के रूप में निर्माण किया है:इस जावा प्रोग्राम को बेहतर बनाने के लिए उपयोग करने के लिए कौन सा डिज़ाइन पैटर्न

  • यह 1 शीर्ष लेख और 1 शारीरिक
  • हैडर कई SerialNum टैग हैं हो सकता है शामिल हैं। हमें अंतिम टैग के मूल्य को निकालने की आवश्यकता है।

मैं SerialNum मूल्य प्राप्त करने के Stax पार्सर का इस्तेमाल किया, और मैं इस कोड लिखा है:

public String findIdValue(HttpServletRequest request) { 

    String serialNumberValue = null; 

    if(request != null){ 
     ServletInputStream servletInstream; 
     try { 
      servletInstream = request.getInputStream(); 
      XMLInputFactory factory = XMLInputFactory.newInstance(); 
      XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(servletInstream); 
      //begin parsing if we get <Header> 
      //end parsing if we get <Header/> or </Header> 

      int event = xmlStreamReader.getEventType(); 
      boolean enableToParse = false; 
      boolean gotSerialNumber = false; 
      boolean parseComplete = false; 

      while((xmlStreamReader.hasNext()) && (!parseComplete)){ 
       switch(event) { 
       case XMLStreamConstants.START_ELEMENT: 
        if("Header".equals(xmlStreamReader.getLocalName())){ 
         //tag is header, so begin parse 
         enableToParse = true; 
        }else if(("SerialNum".equals(xmlStreamReader.getLocalName())) && (enableToParse)){ 
         //tag is serialNum so enable to save the value of serial number 
         gotSerialNumber = true; 
        } 
        break; 
       case XMLStreamConstants.CHARACTERS: 
        //get serial number and end the parsing 
        if(gotSerialNumber){ 
         //get wsa and end the parsing 
         serialNumberValue = xmlStreamReader.getText(); 
         gotSerialNumber = false;        
        } 

        break; 
       case XMLStreamConstants.END_ELEMENT: 
        //when we get </Header> end the parse 
        //when we get </SerialNum> reinit flags 
        //when we get </Header> end the parse even we don't get a serial number 
        if("Header".equals(xmlStreamReader.getLocalName())){ 
         parseComplete= true; 
        }else if("SerialNum".equals(xmlStreamReader.getLocalName())){ 
         //reinit flag when we get </SerialNum> tag 
         gotSerialNumber = false; 
        } 
        break; 
       default: 
        break; 
       } 
       event = xmlStreamReader.next(); 
      } 


     } catch (final XMLStreamException e) { 
      //catch block 
      LOG.info("Got an XMLStreamException exception. " + e.getMessage()); 
     } 
     catch (final IOException e1) { 
      //catch block 
      LOG.info("Got an IOException exception. " + e1.getMessage()); 
     } 

    } 


    return serialNumberValue; 
} 

इस कोड को निकालने की जरूरत मूल्य लेकिन कोड गुणवत्ता बहुत अच्छी नहीं है: यह करने के लिए आसान नहीं है पढ़ें और बनाए रखें। इसमें एक स्विच केस होता है और यदि कोई और समय लूप में घोंसला लगाता है। कोड गुणवत्ता को बढ़ाने के लिए उपयोग करने के लिए किस डिजाइन पैटर्न का उपयोग करें?

+0

आप अपना कोड [कोड समीक्षा] (http://codereview.stackexchange.com/) पर क्यों नहीं पोस्ट करते? –

+1

राज्य पैटर्न दिमाग में आता है। लेकिन मुझे लगता है कि आपका कोड सही नहीं है: यह पर्स को सेट करता है जैसे ही यह पहला सीरियल नंबर पढ़ता है। और आपने कहा कि आप आखिरी चाहते थे। –

+0

@Andrea Dusza: क्षमा करें, मुझे आपके सुझाव को समझ में नहीं आया। क्या आप कृपया अपने विचार को स्पष्ट कर सकते हैं? – amekki

उत्तर

1

मुझे नहीं लगता कि आपके कोड को एक डिज़ाइन पैटर्न की आवश्यकता है। लेकिन एक क्लीनर कोड वास्तव में अच्छा होगा।

मैं मानता हूँ के साथ लुई एफ टिप्पणी में सुझाव दिया: "पहले कदम के रूप, आप अलग तरीकों में अपनी अलग स्विच मामलों के कोड निकालें और उन्हें सार्थक नाम देने के लिए कोशिश कर सकते"

मुझे लगता है कि आपके कोड में भी बहुत अधिक टिप्पणियां हैं। यह code smell है। बस एक उदाहरण:

if("Header".equals(xmlStreamReader.getLocalName())){ 
    //tag is header, so begin parse 
    enableToParse = true; 
} 

उस टिप्पणी को हटाने के बारे में और explain it with code?

if(isTagHeader(xmlStreamReader)) { 
    enableToParse = true; 
} 

बस कुछ विचार ... आपका कोड भयानक नहीं दिखता है। लेकिन मुझे लगता है कि यहां मुख्य बिंदु डिजाइन पैटर्न के बारे में नहीं है।

यदि आप इसके बारे में गहराई से रुचि रखते हैं तो मैं रॉबर्ट सी मार्टिन (अंकल बॉब) से "स्वच्छ कोड" पुस्तक की अत्यधिक अनुशंसा करता हूं।

+0

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

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

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