避免重复的代码Java

时间:2018-01-29 20:22:22

标签: java refactoring

我正在研究ETL Java项目,它做了三件事 extract - 从表中读取数据 将数据转换为JSON 加载数据 它工作正常。问题是我正在为每个表做这件事。我现在的方式是

   class ETLHelper
   {
     private Person read(ResultSet results){
       Person p = new Person();
       p.setPersonId(results.getString("PERSON_ID"));
       p.setPersonName(results.getString("PERSON_NAME"));
       return p;
     }
     private String transform(Person p){
       TransformPerson t = new TransformPerson();
       t.setTransformPersonId(p.getPersonId);
       t.setTransformPersonName(p.getPersonName);
       PersonEData eData = new PersonEData();
       eData.setDate1(p.date1);
       eData.setDate2(p.date2);
       t.seteData(eData);
       PersonDetails pd = new PersonDetails();
       pd.settransformdata(t);
       return writeValueAsString(pd);
     }
     public void etl(){
       Connection c = null;
       PreparedStatement p = null;
       ResultSet r = null;

       c = getConnection();
       p = c.prepareStatement(getSql());
       r = p.executeQuery();

       while(r.next()){
        messages.add(transform(read(r)));
       /*code for loading data*/
       }
     }

   }

Person.Java:

 @JsonTypeName(value = "PERSON")
 @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
  public class Person{
   @JsonProperty(value = "PERSON_ID")
   private String personId;
   //getter and setter for personId
   @JsonProperty(value = "PERSON_NAME")
   private String personName;
   //getter and setter for personName
}

TransformPerson.java:

@JsonRootName(value = "Person")
class TransformPerson{
 private String transformPersonName;
 private String transformPersonId;  
 /*getter and setter for transformPersonName and tranformPersonId*/
 @override
 String toString(){
  return "Person [name =" + transformPersonName + ", id = " + transformPeronId "]";
  }
 }

PersonEdata:

private String date1;
private String date2;
/*getter and setter*/
@override
public String toString(){
 return "PersonEdata [date1=" + date1 +", date2=" + date2 + "]";
}

因此,为每个表编写了一个Person类,一个转换所需的类和etl类。还有一些额外的类,如PersonEdata,在调用toString()时返回JSON。无论如何,我是否可以更改此设计以避免为每个表编写类似的代码?有一些限制。每个表都是不同的,并且需要转换类,因为还有其他程序使用生成的JSON,因此我们需要生成需要这些程序理解的JSON。

1 个答案:

答案 0 :(得分:0)

在您当前的解决方案中,您创建了:

  1. 人员类 - 保存从DB

  2. 检索的数据
  3. PersonTransform类 - 将数据从Person复制到其他表示,并通过覆盖toString()

  4. 扩展了创建JSON的功能

    为了简单起见,您可以做的是:

    1. 为每个实体(表)提供类似Person的单个类 - 这是JSON Serializable。

    2. 不要覆盖toString方法来表示JSON表示 - 而是使用JSON序列化程序。