मैं एक एक्सएमएल फ़ाइल को पार्सल करने के लिए एक प्रोग्राम लिखता हूं जो एक सामान्य टैग मान को सीरियलनम नामक एक हेडर टैग में निहित करता है। फ़ाइल नीचे के रूप में निर्माण किया है:इस जावा प्रोग्राम को बेहतर बनाने के लिए उपयोग करने के लिए कौन सा डिज़ाइन पैटर्न
- यह 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;
}
इस कोड को निकालने की जरूरत मूल्य लेकिन कोड गुणवत्ता बहुत अच्छी नहीं है: यह करने के लिए आसान नहीं है पढ़ें और बनाए रखें। इसमें एक स्विच केस होता है और यदि कोई और समय लूप में घोंसला लगाता है। कोड गुणवत्ता को बढ़ाने के लिए उपयोग करने के लिए किस डिजाइन पैटर्न का उपयोग करें?
आप अपना कोड [कोड समीक्षा] (http://codereview.stackexchange.com/) पर क्यों नहीं पोस्ट करते? –
राज्य पैटर्न दिमाग में आता है। लेकिन मुझे लगता है कि आपका कोड सही नहीं है: यह पर्स को सेट करता है जैसे ही यह पहला सीरियल नंबर पढ़ता है। और आपने कहा कि आप आखिरी चाहते थे। –
@Andrea Dusza: क्षमा करें, मुझे आपके सुझाव को समझ में नहीं आया। क्या आप कृपया अपने विचार को स्पष्ट कर सकते हैं? – amekki