【问题标题】:OOP Pattern - handle methods that are extremely similarOOP Pattern - 处理极其相似的方法
【发布时间】:2020-03-25 21:24:24
【问题描述】:

我有一些超级相似的方法,除了每个方法中的 1 行。我试图避免重复代码并在我的代码中应用良好实践,但我不是 OOP 专家。除了 1 次调用之外,这两种方法都是相同的:

例如:

classa.java

    public static void updateTable() throws Exception {
        List<T> newSchema = AvroToHive.generateSchema(...);
        ...
    }

classb.java

    public static void updateTable() throws Exception {
        List<T> newSchema = AWSGlue.generateSchema(...);
        ...
    }

我想将方法​​ updateTable() 移动到另一个公共类,并避免在我的项目中使用类似的方法。

什么是避免它的正确方法?我是否应该使用generateSchema 方法编写类似“Metastore”的接口,将其实现到 AvroToHive/AWSGlue 类中并将其作为参数传递,例如:

    public static void updateTable(Metastore metastore) throws Exception {
        List<T> newSchema = metastore.generateSchema(...);
        ...
    }

【问题讨论】:

  • 谁拥有这张桌子?
  • 如果 classA 和 classB 不拥有一个表,那么也许某种表管理器是有意义的,它将处理 updateTable。传入 Metastore 的想法对我来说似乎是个好设计。对我来说,它看起来像是依赖注入,但通常,在我见过的所有依赖注入示例中,它都会涉及存储 Metastore 对象。我认为你的设计会像这样很好。

标签: java oop


【解决方案1】:

实现它的替代方法是使用功能接口。

AvroToHive 示例:

import java.util.ArrayList;
import java.util.List;

public class AvroToHive {

  public static List<String> generateSchema() {
    ArrayList<String> values = new ArrayList<>();
    values.add("Hello");
    return values;
  }

}

AWSGlue 示例:

import java.util.ArrayList;
import java.util.List;

public class AWSGlue {

  public static List<Integer> generateSchema() {
    ArrayList<Integer> values = new ArrayList<>();
    values.add(10);
    return values;
  }

}

功能界面示例:

import java.util.List;

public class FuncInterExample {

  @FunctionalInterface
  interface ListSupplier<T> {
    List<T> generateSchema();
  }

  public static void main(String[] args) {
    updateTable(AvroToHive::generateSchema);
    updateTable(AWSGlue::generateSchema);
  }

  public static <T> void updateTable(ListSupplier<T> obj) {
    List<T> list = obj.generateSchema();
    for(T item : list) {
      System.out.println(item);
    }
  }

}

样本输出:

Hello
10

【讨论】:

    【解决方案2】:

    interface 设为他们的共同父母,如下所示:

    interface Common {
        void generateSchema();
    }
    
    class AvroToHive implements Common {
        public void generateSchema() {
            System.out.println("In AvroToHive");
        }
    }
    
    class AWSGlue implements Common {
        public void generateSchema() {
            System.out.println("In AWSGlue");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Common obj1 = new AvroToHive();
            Common obj2 = new AWSGlue();
            updateTable(obj1);
            updateTable(obj2);
        }
    
        public static void updateTable(Common obj) {
            obj.generateSchema();
        }
    }
    

    输出:

    In AvroToHive
    In AWSGlue
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      相关资源
      最近更新 更多