当前位置: 首页 > 知识库问答 >
问题:

使用哪种设计模式来改进这个Java程序

申屠健
2023-03-14

我编写了一个程序来解析XML文件,以获取一个名为SerialNum的特定标记值,该值包含在Header标记中。该文件的构造如下:

    < li >它包含一个标题和一个正文 < li >标题可能包含许多SerialNum标签。我们需要提取最后一个标签的值。

我使用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;
}

此代码提取所需的值,但代码质量不是很好:它不容易阅读和维护。它包含一个开关案例,如果其他块嵌套在 while 循环中。使用哪种设计模式来提高代码质量?

共有1个答案

都沈浪
2023-03-14

我不认为你的代码需要一个设计模式。但是一个更干净的代码会非常好。

我同意Louis F.在评论中的建议:“作为第一步,您可以尝试在不同的方法中提取不同开关案例的代码,并给它们有意义的名称。”。

我认为你的代码也有太多的注释。这是一种< code >代码味道。仅举一个例子:

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

删除注释并用代码解释它怎么样?

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

只是一些想法…你的代码看起来并不可怕。但我认为这里的重点不是设计模式。

如果您有兴趣深入了解它,我强烈推荐Rober C.Martin(Bob叔叔)的《清洁代码》一书。

 类似资料:
  • 目前我有3个类,其中大多数变量是相同的。所有变量都有getter和setter。我需要根据提供的数据类型变量Year创建类的对象,并在十多个方法中传递该对象。让我们举个例子。 我们有三个班,A班,B班,C班。如果我们通过2017年,那么我需要ClassA的目标。如果我们通过2016年,那么我需要B类的目标,而对于所有其他年份,我们需要C类的目标。 然后,我们需要在所有10个方法中传递该对象。让我们

  • 我目前正在使用HibernateConstraintValidator来实现我的验证。但是我的审阅者不喜欢在代码或!运算符中使用if/其他。我可以使用哪种设计模式来删除验证逻辑中的if/其他? 在下面的代码中,他不想要if/否则 附带说明:我们必须使用域驱动设计(如果有帮助的话)

  • 我是设计模式领域的新手,我正在尝试了解其中的诀窍。我曾多次听到人们使用的“工厂”或“工厂模式”,但当我开始学习设计模式(目前我正在读GoF的书)时,我了解到实际上并不存在“工厂设计模式”这样的东西。GoF这本书描述了两种与工厂相关的模式:“抽象工厂”和“工厂方法”。 所以我的问题是这样的--当人们只说“工厂”(没有添加任何其他东西)时,他们实际上指的是哪种设计模式? 我找到了两个关于这件事的消息来

  • 我有一个vehicle类,还有一个很好的隐含的船和飞机来检查安全性,每个类都实现了自己的SafetyCheck。世界很好。 但很快就需要一种叫做水上飞机的混合体,它重复了和的安全检查 在这样的特定场景中,哪些设计模式有助于减少代码冗余并使实现更干净?

  • 在网上搜索和阅读了关于设计模式的文章后,我发现了三种类型,即行为型、创造型和结构型设计模式(GOF)。