Как создать класс со списком элементов из другого класса, не нарушая правила внедрения зависимостей?

У меня есть класс, который имеет несколько полей.

public class Foo {
 int firstCoef;
 int secondCoef;

 public Foo(String args){
  this.firstCoef=Integer.parseInt(args[0]);
  this.secondCoef=Integer.parseInt(args[1]);
 }
}

Аргументы назначаются таким образом, потому что я создаю несколько членов этого класса, читая данные из.csv. У меня есть другой класс, который управляет списком экземпляров Foo. Он создает весь список сразу, читая его из файла, и использует этот список для расчета. При создании списка в конструкторе классов он использует new Foo(string),

public class FooManager {
    protected List<Foo> allFoos = new ArrayList<Foo>();

    public FooManager(List<String[]> input) {
        String[] line;
        for (int lineNumber = 0; lineNumber < input.size(); lineNumber++) {
            line = input.get(lineNumber);
            allFoos.add(new Foo(line));
        }
    }

    public int calculate(int number) {
        int result = 0;
        for (Foo foo : allFoos) {
            result += Math.pow(number + foo.getFirstCoef(), foo.getSecondCoef());
        }
        return result;
    }
}

Насколько я понимаю, это считается плохим дизайном, потому что зависимости не могут быть введены. Кроме того, это трудно проверить. Как я могу изменить дизайн, не усложняя ввод? Единственная цель обоих классов - иметь возможность выполнять вычисления в конце.

1 ответ

Вы можете добавить еще один слой, добавив класс, который выполняет перевод из списка в список:

public class FooParser implements Function<String[], Foo> {

    public Foo apply(String[] input) 
        for (int lineNumber = 0; lineNumber < input.size(); lineNumber++) {
            String[] line = input.get(lineNumber);
            allFoos.add(new Foo(line));
        }
    }
}

А затем используйте его в конструкторе FooManger:

public FooManager(FooParser parser, List<String[]> input) {
    allFoos = parser.apply(input);
}

Таким образом, у вас есть другая часть логики в отдельном классе - и это проще для тестирования в изоляции.

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