Tôi viết chương trình phân tích cú pháp tệp XML để nhận giá trị thẻ cụ thể có tên là SerialNum được chứa trong thẻ Tiêu đề. Các tập tin được xây dựng như sau:Mẫu thiết kế nào cần sử dụng để cải thiện chương trình Java này
- nó chứa 1 Header và 1 Body
- Header có thể chứa nhiều thẻ SerialNum. Chúng ta cần trích xuất giá trị của thẻ cuối cùng.
tôi đã sử dụng phân tích cú pháp Stax để lấy giá trị SerialNum, và tôi đã viết mã này:
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;
}
Mã này chiết xuất từ các giá trị cần thiết nhưng chất lượng mã không phải là rất tốt: nó không phải là dễ dàng để đọc và duy trì. Nó chứa một trường hợp chuyển đổi và nếu khối khác lồng nhau trong một vòng lặp while. Mẫu thiết kế nào để sử dụng để nâng cao chất lượng mã?
Tại sao bạn không đăng mã của mình lên [Đánh giá mã] (http://codereview.stackexchange.com/)? –
Mẫu trạng thái xuất hiện trong đầu bạn. Nhưng tôi có cảm giác mã của bạn không chính xác: nó đặt parseComplete thành true ngay sau khi nó đọc số sê-ri đầu tiên. Và bạn nói bạn muốn người cuối cùng. –
@Andrea Dusza: xin lỗi, tôi không hiểu đề xuất của bạn. Bạn có thể làm rõ ý tưởng của bạn? – amekki