这是在求职面试中使用的编程测试.我发现它有一个非常奇怪的非OO视角,并想知道为什么有人会从这个角度来看待构造函数.作为一名非常有经验的Java程序员,我立即质疑编写此代码的个人的能力以及问题的奇怪视角.
我发现这些奇怪的脱离背景问题令人不安.我希望得到其他经验丰富的OO Java程序员的反馈.
完成Solver构造函数,以便对solveAll的调用返回一个包含2个值的列表,包括平方根和作为参数传递的整数的倒数.
public interface MathFunction {
double calculate(double x);
}
public class Solver {
private List<MathFunction> functionList;
public Solver() {
//Complete here
}
public List<Double> solveAll(double x) {
List<Double> result = new ArrayList<Double>();
for (MathFunction function : this.functionList) {
result.add(new Double(function.calculate(x)));
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*Joe 38
这是通过使用最简单的方法测试您的设计模式.我认为这可能是战略(或其他一些行为模式).看到这些:
http://en.wikipedia.org/wiki/Strategy_pattern
http://en.wikipedia.org/wiki/Behavioral_pattern
如果您要参加Java面试,您应该能够确定他们所暗示的设计模式,这样可以防止您过于不稳定!
要回答这个问题,请创建两个MathFunction
根据需要实现的类,然后创建两个实例并将其存储functionList
.
这里的重点不是 "你能用这种奇怪的方式进行计算",它是"你能识别设计模式"吗?
ᴇʟᴇ*_*ᴀтᴇ 31
我同意这是令人困惑和过度设计的.
但我认为代码是合理的面向对象.这是战略模式的一个实例.生成答案列表的代码并不关心如何计算答案 - 这两个问题是分开的,可以应用不同的计算策略而无需触及生成列表的代码.
为了使类更有用,这些函数应该从外部传递(即依赖注入),而不是在构造函数中实例化.
你知道答案,我认为,但是它值得......
public Solver() {
functionList = new ArrayList<MathFunction>();
functionList.add(new MathFunction() {
@Override
public double calculate(double x) {
return 1d/x;
}
});
functionList.add(new MathFunction() {
@Override
public double calculate(double x) {
return Math.sqrt(x);
}
});
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,这确实是一种奇怪的做法.该名称Solver
是通用名称,默认情况下不应实现特定操作.然而,也许这是采访的一部分?第一部分:简单地完成请求.第二部分:说这样做很奇怪.
我想说一个更好的方法就是有一个addMathFunction(MathFunction mf)
方法.如果需要,可以创建扩展Solver
类的子类并在其构造函数中添加MathFunctions.