OOP Pattern - методы обработки, которые чрезвычайно похожи - PullRequest
0 голосов
/ 26 марта 2020

У меня есть несколько очень похожих методов, за исключением 1 строки в каждом методе. Я пытаюсь избежать дублирования кода и применять хорошие практики в своем коде, но я не эксперт по OOP. Оба метода идентичны, за исключением одного вызова:

Например:

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() в другой общий класс и избегать использования подобных методов в моем проекте.

Как правильно избегать этого? Если я напишу интерфейс типа «Metastore» с методом generateSchema, внедрите его в классы AvroToHive / AWSGlue и передайте в качестве параметра, например:

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

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Создайте 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
1 голос
/ 26 марта 2020

Альтернативой его реализации было бы использование функционального интерфейса.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...