Java 重构两个代码

Java 重构两个代码,java,refactoring,Java,Refactoring,我的项目需要将两种类型的文本数据解析到数据库中 一种格式如下: <lineNumber>19</lineNumber> <begin> 2013-08-15,2013-08-15,pek001,123456,08654071,CANX,,,,,,011 <end> 19 2013-08-152013-08-15,堪萨斯州PEK00112345608654071 一个是这样的 <lineNumber>27</line

我的项目需要将两种类型的文本数据解析到数据库中

一种格式如下:

 <lineNumber>19</lineNumber>
 <begin>
 2013-08-15,2013-08-15,pek001,123456,08654071,CANX,,,,,,011  
 <end>
19
2013-08-152013-08-15,堪萨斯州PEK00112345608654071
一个是这样的

<lineNumber>27</lineNumber>
 <begin>
 2012-11-02,08683683,pek001,00001234,vvip,1
 <end>
27
2012-11-02086833,PEK00100001234,vvip,1
这两个文本的区别在于开始标记和结束标记之间。 所以我们的解析代码出来了: 第一个是:

         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=新的inputStreamReader(新文件InputStream(FileOne),“gbk”)--异地
br=新的BufferedReader(inputStreamReader);
行号=0;
布尔值isDataContent=false;
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
log.error(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{                  
insertFirstToDatabase(line,vo);--只是这是不同的。
}
}
第二个是:

  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.
            }
        }
inputStreamReader=新的inputStreamReader(新文件InputStream(文件二),“gbk”);
--异地
br=新的BufferedReader(inputStreamReader);
行号=0;
布尔值isDataContent=false;
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
日志错误(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{
insertSecondToDatabase(line,vo);--只是这是不同的。
}
}

这两段代码位于两个不同的服务代码中。我如何重构这个重复的代码?这样每个地方只需要调用一个相同的函数来检查行号

在一个类中包含重复的代码,该类由其他两个类继承(继承)或包含(组合)的副本。或者,您甚至可以将其作为实用程序类中的静态方法。

您的代码在一条语句之前是相同的,并且没有显示您如何确定应该执行这些代码序列中的哪一个,只需将分支移到
if(isDataContent)


其中,
flagFirst
是一个布尔变量或布尔表达式,用于确定应执行哪些插入。

您可以添加“种类”参数以选择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.
            }
        }
    }

}
公共作废流程(int类){
....
while(br.ready()){
String line=br.readLine();
如果(行==null){
继续;
}
如果(第行包含(“”))
{
试一试{
lineNumber=Integer.parseInt(StringTools.getDigitalInString(line));
}捕获(数字格式){
日志错误(“没有行号”);
}
继续;
}
if(line.trim()等于(“”)
{
isDataContent=true;
继续;
}
if(line.trim()等于(“”)
{
打破
}
if(isDataContent)
{
如果(种类==1){
insertFirstToDatabase(line,vo);--只是这是不同的。
}
如果(种类==2){
insertSecondToDatabase(line,vo);--只是这是不同的。
}
}
}
}
2件事:

  • 重复代码在实用程序类中放入静态方法
  • 如何区分数据内容
    我这可以在分析行时根据字段的顺序确定
    (或)
    二,。静态方法的被调用方可以通过发送一个标志来确定。但这不是一个好的设计。您在实用工具方法中放置了太多的实现,即两种行为。
    (或)
    iii.让静态方法解析XML,并只向被调用方返回行详细信息。让被叫人随意处理。第一个被调用方可能只想打印,第二个被调用方可能想放入数据库
  • 所以,就这样

        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;
    }
    


    如果有10多种文字怎么办?
        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); 
      }
    }