Scrivo un programma per analizzare un file XML per ottenere un valore di tag specifico denominato SerialNum contenuto in un tag Header. Il file è costruito come di seguito:Quale modello di progettazione da utilizzare per migliorare questo programma Java
- Contiene 1 intestazione e 1 Corpo
- l'intestazione può contiene molti tag SerialNum. Abbiamo bisogno di estrarre il valore dell'ultimo tag.
ho usato il parser Stax per ottenere il valore SerialNum, e ho scritto questo codice:
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;
}
Questo codice estratto il valore necessario, ma la qualità del codice non è molto buona: non è facile leggi e mantieni. Contiene un caso di commutazione e se altrimenti blocchi annidati in un ciclo while. Quale modello di progettazione utilizzare per migliorare la qualità del codice?
Perché non si pubblica il codice su [Code Review] (http://codereview.stackexchange.com/)? –
Viene in mente lo schema di stato. Ma ho la sensazione che il tuo codice non sia corretto: imposta parseComplete su true non appena legge il primo numero seriale. E hai detto che volevi l'ultimo. –
@Andrea Dusza: scusa, non ho capito il tuo suggerimento. Puoi per favore chiarire la tua idea? – amekki