这是在求职面试中使用的编程测试.我发现它有一个非常奇怪的非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;
    }
} 
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);
        }
    });
}
恕我直言,这确实是一种奇怪的做法.该名称Solver是通用名称,默认情况下不应实现特定操作.然而,也许这是采访的一部分?第一部分:简单地完成请求.第二部分:说这样做很奇怪.
我想说一个更好的方法就是有一个addMathFunction(MathFunction mf)方法.如果需要,可以创建扩展Solver类的子类并在其构造函数中添加MathFunctions.
| 归档时间: | 
 | 
| 查看次数: | 11239 次 | 
| 最近记录: |