面试的Java编程测试

use*_*115 46 java oop

这是在求职面试中使用的编程测试.我发现它有一个非常奇怪的非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)


Mar*_*aux 6

恕我直言,这确实是一种奇怪的做法.该名称Solver是通用名称,默认情况下不应实现特定操作.然而,也许这是采访的一部分?第一部分:简单地完成请求.第二部分:说这样做很奇怪.

我想说一个更好的方法就是有一个addMathFunction(MathFunction mf)方法.如果需要,可以创建扩展Solver类的子类并在其构造函数中添加MathFunctions.