2015-12-27 13 views
5

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ã?

+0

Tại sao bạn không đăng mã của mình lên [Đánh giá mã] (http://codereview.stackexchange.com/)? –

+1

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. –

+0

@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

Trả lời

1

Tôi không nghĩ mã của bạn cần mẫu thiết kế. Nhưng một mã sạch hơn sẽ thực sự tốt đẹp.

Tôi đồng ý với Louis F. đề xuất trong các ý kiến: "Là bước đầu tiên, bạn có thể thử trích xuất mã của các trường hợp chuyển đổi khác nhau theo các phương pháp riêng biệt và đặt tên có ý nghĩa".

Tôi nghĩ rằng mã của bạn cũng có quá nhiều nhận xét. Đây là code smell. Chỉ cần ví dụ:

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

Điều gì sẽ xóa nhận xét đó và explain it with code?

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

Chỉ cần một số suy nghĩ ... mã của bạn không quá tệ. Nhưng tôi nghĩ điểm chính ở đây không phải là về các mẫu thiết kế.

Nếu bạn quan tâm đến việc đi sâu hơn về nó, tôi đặc biệt khuyên bạn nên cuốn sách "Mã sạch" từ Rober C. Martin (Chú Bob).

+0

Tôi muốn cảm ơn bạn đã đăng bài. Tôi sẽ thêm các phương thức cho các trường hợp khác nhau. Nó sẽ rất thú vị đối với tôi, nếu tôi cũng có thể sử dụng một mẫu thiết kế. – amekki

Các vấn đề liên quan