2015-12-27 2 views
5

XMLファイルを解析して、Headerタグに含まれるSerialNumという特定のタグ値を取得するプログラムを作成します。このファイルは以下のように構築された:それは1つのヘッダーと1つのボディ このJavaプログラムを改善するために使用するデザインパターン

  • ヘッダーが含まれてい

    • かもしれないが、多くのSERIALNUMタグが含まれています。最後のタグの値を抽出する必要があります。

  • 私は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; 
    } 
    

    このコードの抽出物を必要な値ではなく、コードの品質は非常に良いではありません。それが容易ではありません読んで維持する。これにはスイッチケースが含まれ、elseブロックがwhileループにネストされている場合 コードの品質を高めるために使用するデザインパターンはどれですか?

    +0

    [コードレビュー](http://codereview.stackexchange.com/)にコードを投稿してみませんか? –

    +1

    状態パターンが気になります。しかし、私はあなたのコードが正しくないと感じています:最初のシリアル番号を読むとすぐにparseCompleteをtrueに設定します。そして、あなたは最後のものが欲しいと言った。 –

    +0

    @Andrea Dusza:申し訳ありませんが、私はあなたの提案を理解していませんでした。あなたのアイデアを明確にしていただけますか? – amekki

    答えて

    1

    あなたのコードにデザインパターンが必要とは思われません。しかし、より洗練されたコードは本当に素晴らしいでしょう。

    私はルイF.の意見に同意します:"最初のステップとして、異なるスイッチケースのコードを別々の方法で抽出して意味のある名前を付けることができます"

    あなたのコードにはあまりにも多くのコメントがあると思います。これはcode smellです。ほんの一例:

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

    このコメントとexplain it with codeはどうやって削除しますか?

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

    あなたのコードはひどく見えません。しかし、ここの主なポイントはデザインパターンではないと思います。

    詳細については、Rober C. Martin(Bob Uncle)の書籍「Clean Code」をお勧めします。

    +0

    あなたの投稿に感謝します。私は、異なるケースのためのメソッドを追加します。デザインパターンを使用することができれば、私にとっては非常に面白いでしょう。 – amekki