Как создать класс со списком элементов из другого класса, не нарушая правила внедрения зависимостей?
У меня есть класс, который имеет несколько полей.
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);
}
Таким образом, у вас есть другая часть логики в отдельном классе - и это проще для тестирования в изоляции.