我的课程有几个字段。
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;
}
}
据我所知,这被认为是糟糕的设计,因为无法注入依赖关系。而且,很难测试。如何在不使输入复杂化的情况下更改设计?这两个类的唯一目标是能够最终执行计算。
答案 0 :(得分:0)
您可以添加另一个图层,方法是添加一个从List到List的转换类:
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);
}
通过这种方式,您可以在单独的类中使用另一部分逻辑 - 并且更容易单独测试。