ame*_*kki 5 java design-patterns
我编写了一个程序来解析XML文件,以获取一个名为SerialNum的特定标记值,该值包含在Header标记中.该文件构造如下:
我使用Stax解析器来获取SerialNum值,我编写了这段代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
此代码提取所需的值但代码质量不是很好:它不易于阅读和维护.它包含一个switch case和if else块嵌套在while循环中.使用哪种设计模式来提高代码质量?
我认为您的代码不需要设计模式。但如果代码更简洁那就太好了。
我同意 Louis F. 在评论中建议的观点:“作为第一步,您可以尝试用单独的方法提取不同开关案例的代码,并给它们提供有意义的名称”。
我认为你的代码也有太多注释。这是一个code smell。举个例子:
if("Header".equals(xmlStreamReader.getLocalName())){
//tag is header, so begin parse
enableToParse = true;
}
Run Code Online (Sandbox Code Playgroud)
删除该注释并用代码解释怎么样?
if(isTagHeader(xmlStreamReader)) {
enableToParse = true;
}
Run Code Online (Sandbox Code Playgroud)
只是一些想法......你的代码看起来并不糟糕。但我认为这里的重点不是设计模式。
如果您有兴趣更深入地了解它,我强烈推荐 Rober C. Martin(鲍勃叔叔)的书“干净的代码”。
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |