2014-01-27 3 views
2

Мой проект должен анализировать два типа текстовых данных в базу данных.Рефакторинг двух кода

один формат, как это:

<lineNumber>19</lineNumber> 
<begin> 
2013-08-15,2013-08-15,pek001,123456,08654071,CANX,,,,,,011 
<end> 

один похоже, что

<lineNumber>27</lineNumber> 
<begin> 
2012-11-02,08683683,pek001,000,vvip,1 
<end> 

разность два текста между начальной и конечной меткой. поэтому наш синтаксический код вышли: Первый:

  inputStreamReader = new InputStreamReader(new FileInputStream(FileOne),"gbk"); --different place 
     br=new BufferedReader(inputStreamReader); 
    lineNumber = 0; 
     boolean isDataContent = false; 

    while (br.ready()) { 
      String line = br.readLine(); 
      if(line == null){ 
       continue; 
      } 
      if(line.contains("<lineNumber>")) 
      { 

       try { 
        lineNumber = Integer.parseInt(StringTools.getDigitalInString(line)); 
       } catch (NumberFormatException e) { 
        log.error("there is no lineNumber。"); 
       } 
       continue; 
      } 

      if(line.trim().equals("<begin>")) 
      { 
       isDataContent = true; 
       continue; 
      } 

      if(line.trim().equals("<end>")) 
      { 
       break;  
      } 

      if(isDataContent) 
      {     
       insertFirstToDatabase(line,vo); --just this is different. 
      } 


     } 

второй один:

inputStreamReader = new InputStreamReader(new FileInputStream(FileTwo),"gbk"); 
    --different place 
     br=new BufferedReader(inputStreamReader); 
     lineNumber = 0; 
     boolean isDataContent = false; 

    while (br.ready()) { 
      String line = br.readLine(); 
      if(line == null){ 
       continue; 
      } 
      if(line.contains("<lineNumber>")) 
      { 

       try { 
        lineNumber = Integer.parseInt(StringTools.getDigitalInString(line)); 
       } catch (NumberFormatException e) { 
        log.error("there is no lineNumber"); 
       } 
       continue; 
      } 

      if(line.trim().equals("<begin>")) 
      { 
       isDataContent = true; 
       continue; 
      } 

      if(line.trim().equals("<end>")) 
      { 
       break;  
      } 

      if(isDataContent) 
      { 

          insertSecondToDatabase(line,vo); --only this is different. 
      } 
     } 

Два кусок кода в двух разных кода сервиса. Как я могу реорганизовать этот повторяющийся код? так что каждое место Просто вызовите одну и ту же функцию, чтобы проверить номер строки.

ответ

0

Имейте дублированный код в классе, который оба класса наследуют (наследование) или включают в себя копию (состав). В качестве альтернативы вы даже можете сделать его статическим методом в классе утилиты.

0

Ваш код идентичен до одного оператора, и это не показано, как вы определили, какие из этих последовательностей кода вы должны быть выполнение, а просто двигаться, что ветвление в if (isDataContent):

// copy/paste from your own, change the if to: 
if(isDataContent) { 
    if (flagFirst) { 
     insertFirstToDatabase(line,vo); --just this is different. 
    } else { 
     insertSecondToDatabase(line,vo); --only this is different. 
    } 
} 

Где flagFirst является либо логическую переменную, либо логическое выражение, чтобы определить, какая из вставок должна быть выполнена.

0

Вы можете добавить параметр 'Вид' для выбора метода вставки Usded следующим образом:

public void process(int kind) { 

    .... 

    while (br.ready()) { 
     String line = br.readLine(); 
     if(line == null){ 
      continue; 
     } 
     if(line.contains("<lineNumber>")) 
     { 

      try { 
       lineNumber = Integer.parseInt(StringTools.getDigitalInString(line)); 
      } catch (NumberFormatException e) { 
       log.error("there is no lineNumber"); 
      } 
      continue; 
     } 

     if(line.trim().equals("<begin>")) 
     { 
      isDataContent = true; 
      continue; 
     } 

     if(line.trim().equals("<end>")) 
     { 
      break;  
     } 

     if(isDataContent) 
     { 
      if (kind == 1) { 
       insertFirstToDatabase(line,vo); --just this is different. 
      } 
      if (kind == 2) { 
       insertSecondToDatabase(line,vo); --only this is different. 
      } 
     } 
    } 

} 
+0

что, если есть 10+ виды текста? – smart

0

2 вещи:

  1. дублированный код? - положить статический метод в полезный класс
  2. как дифференцировать dataContent? -
    i. это можно определить при разборе строки в зависимости от порядка полей
    (или)
    ii. вызывающий статический метод может определить то же самое, отправив флаг. Но это не очень хороший дизайн. Вы делаете слишком большую реализацию, т. Е. 2 ​​поведения в утилите.
    (или)
    iii. Пусть статический метод проанализирует XML и возвращает только данные о строках в вызываемый. Пусть, дескать, ручка справляется. Первый вызываемый может просто захотеть напечатать, второй вызываемый может захотеть вставить в db.

Итак, вот он идет,

public static LineDetails parseXML(String filename) 
    { 

    inputStreamReader = new InputStreamReader(new FileInputStream(new File(filename)); 

      br=new BufferedReader(inputStreamReader); 
     lineNumber = 0; 
     boolean isDataContent = false; 
     LineDetails lineDetails = new LineDetails(); 

    while (br.ready()) { 
      String line = br.readLine(); 
      if(line == null){ 
       continue; 
      } 
      if(line.contains("<lineNumber>")) 
      { 

       try { 
        lineNumber = Integer.parseInt(StringTools.getDigitalInString(line)); 
       } catch (NumberFormatException e) { 
        log.error("there is no lineNumber"); 
       } 
       lineDetails.setLineNumber(lineNumber); 
       continue; 
      } 

      if(line.trim().equals("<begin>")) 
      { 
       isDataContent = true; 
       continue; 
      } 

      if(line.trim().equals("<end>")) 
      { 
       break;  
      } 

      if(isDataContent) 
      { 
      // parse line 
      lineDetails.setLine(line); 
      } 
     } 
    return lineDetails; 
} 

public class LineDetails 
{ 
private int lineNumber=0; 
private String line=""; 
// getters setters 
} 

//First callee 
methodA() 
{ 
    LineDetails lineDetails = parseXML(filename); 
    if(lineDetails!=null && lineDetails.getLineNumber==19 && lineDetails.getLine()!=null && !lineDetails.getLine.equals("")) 
    { 
    insertFirstToDatabase(line); 
    } 
} 


//Second callee 
methodB() 
{ 
    LineDetails lineDetails = parseXML(filename); 
    if(lineDetails!=null && lineDetails.getLineNumber==27 && lineDetails.getLine()!=null && !lineDetails.getLine.equals("")) 
    { 
    insertSecondToDatabase(line); 
    } 
} 
+0

это хорошая идея ~ спасибо. – smart

Смежные вопросы