Шаблон проектирования для многократных методов с использованием одного и того же аргумента

У меня есть этот класс, на котором у меня есть метод, и он вернет карту, используя в ней десятки методов, используя те же аргументы.

В моем классе тысячи строк, и это будет еще больше.

Я могу создать несколько классов и внутри методов создания, но я спрашиваю, есть ли специальный сценарий для этого сценария

Фактический сценарий:

public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {

   Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);

   lastMap = do1(firstMap, lastMap);

   lastMap = do2(firstMap, lastMap);

   lastMap = do3(firstMap, lastMap);

   lastMap = do4(firstMap, lastMap);

   //more 20 methods

   return lastMap;

}

Фактический сценарий:

public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {

    Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);

    Do1 do1 = new Do1();
    lastMap = do1.do1(firstMap, lastMap);

    Do2 do2 = new Do2();
    lastMap = do2.do2(firstMap, lastMap);

    // more 20 methods

    return lastMap;

}
3
задан 13 August 2018 в 13:29

3 ответа

Почему бы не использовать более функциональный подход?

определить интерфейс

interface MapTransformation{ 
     void transformation(Map<String, Object>  first, Map<String, Object>  last);
}

, тогда при создании класса класс, имеющий определение transformMapOnAnotherMap, принимает список преобразований как параметр то вы можете сделать

class SomeClass {

    final private List<MapTransformation> transformations;

    //constructor omitted 

    public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {

        Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
        transformations.forEach(t->t.transformation(firstMap,lastMap);
        return lastMap;

    }
}
1
ответ дан 15 August 2018 в 17:05

Если do1 и т. д. - это просто реализация, а не часть открытого интерфейса вашего класса, вероятно, имеет смысл создать частный класс (возможно, даже вложенный) с конструктором, принимающим две карты, которые он сохраняется как переменные экземпляра:

private static class Worker {
    Worker(Map firstMap, Map secondMap) {
        this.firstMap = firstMap;
        this.secondMap = secondMap;
    }
    void do1() {
        // ...update `this.lastMap` if appropriate...
    }
    void do2() {
        // ...update `this.lastMap` if appropriate...
    }
}

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

Тогда

public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
     Worker worker = new Worker(firstMap, new HashMap<String, Object>(firstMap));
     worker.do1();
     worker.do2();
     worker.do3();
     worker.do4();
     //more 20 methods
     return worker.lastMap;
}
2
ответ дан 15 August 2018 в 17:05

Вы можете использовать interface и сделать каждый «делать» реализацию функционального интерфейса.

interface Do {
    Map<String, Object> apply(Map<String, Object> firstMap, Map<String, Object> lastMap);
}

Затем вы можете инициализировать статические do s:

static Do[] allDos = {
    (firstMap, lastMap) -> {
        // do0
    },
    (firstMap, lastMap) -> {
        // do1
    },
    // ...do2, do3, ...
};

Если вам нужно вызвать do0 -> do2 -> do4, например:

public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {
    Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);
    int[] ids = { 0, 2, 4 };
    for (int id : ids)
        lastMap = allDos[id].apply(firstMap, lastMap);
    return lastMap;
}
1
ответ дан 15 August 2018 в 17:05

Другие вопросы по тегам:

Похожие вопросы: