这是一个在求职面试中使用的编程测试。我发现它有一个非常奇怪的非面向对象的观点,我想知道为什么有人会从这个角度来处理构造器。作为一名非常有经验的Java程序员,我马上就会质疑编写这段代码的人的能力以及这个问题的奇怪视角。
在面试中,我发现这些奇怪的断章取义的问题令人不安。我希望得到其他有经验的OO Java程序员的反馈。
完成求解器构造函数,以便调用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;
}
}
发布于 2012-08-21 22:51:14
这是通过使用最简单的方法来测试您的设计模式。我认为这可能是策略(或其他一些行为模式)。请参阅以下内容:
http://en.wikipedia.org/wiki/Strategy_pattern
http://en.wikipedia.org/wiki/Behavioral_pattern
如果你要去参加Java面试,你应该能够识别出他们所暗示的设计模式,这应该可以防止你过于不安!
要回答这个问题,请根据需要创建两个实现MathFunction
的类,然后创建两个实例并将它们存储在functionList
中。
这里的重点不是“你能用这种奇怪的方式做计算吗”,而是“你能识别出设计模式吗”。
发布于 2012-08-21 23:06:53
我同意这是令人困惑和过度设计的。
但我确实认为代码是合理的面向对象的。它是策略模式的一个实例。生成答案列表的代码并不关心如何计算答案-这两个关注点是分开的,并且可以应用不同的计算策略,而不必接触生成列表的代码。
为了使类更有用,这些函数应该从外部传入(即依赖注入),而不是在构造函数中实例化。
你知道答案,我想,但值得一提的是...
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);
}
});
}
发布于 2012-08-21 22:53:18
IMHO,这确实是一种奇怪的方法。名称Solver
是泛型的,默认情况下它不应该实现特定的操作。然而,也许这是面试的一部分?第一部分:简单地满足请求。第二部分:说这样做很奇怪。
我想说的是,一种更好的方法是使用addMathFunction(MathFunction mf)
方法。如果需要,还可以创建扩展Solver
类的子类,并在它们的构造函数中添加MathFunctions。
https://stackoverflow.com/questions/12057460
复制相似问题