47 votes

Programmation Java de test pour l'interview

Voici une programmation de test utilisé dans une entrevue d'emploi. Je trouve qu'il a un très étrange non OO point de vue et me demande pourquoi quelqu'un serait à l'approche d'un constructeur à partir de ce point de vue. Comme une expérience de programmeur Java, j'ai immédiatement en question la capacité de la personne qui a écrit ce code et de l'étrange point de vue de la question.

Je trouve ces étranges hors contexte des questions sur des entretiens inquiétant. J'aimerais des retours d'autre expérimentés OO programmeurs Java.

Compléter le Solveur constructeur afin qu'un appel à solveAll retourner une liste avec les 2 valeurs y compris la racine carrée et à l'inverse de l'entier passé en paramètre.

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;
    }
} 

38voto

Joe Points 18328

C'est un test de vos modèles de conception, en utilisant la méthode la plus simple possible. Je pense que cela pourrait être la Stratégie (ou certains autres modèles de comportement). Voir ces:

http://en.wikipedia.org/wiki/Strategy_pattern

http://en.wikipedia.org/wiki/Behavioral_pattern

Si vous allez pour un Java entrevue, vous devriez être en mesure d'identifier le modèle de conception, ils sont faisant allusion à et qui devrait vous empêcher d'être trop instable!

Pour répondre à la question, de créer deux classes qui implémentent MathFunction requis, puis la création de deux instances et de les stocker en functionList.

Le point ici est de ne pas "pouvez-vous faire des calculs dans cette étrange façon", il est "pouvez-vous identifier des modèles de conception'.

31voto

aetheria Points 3821

Je suis d'accord que c'est source de confusion et conçu.

Mais je pense que le code est raisonnablement orientée objet. C'est une instance du modèle de stratégie. Le code qui génère une liste de réponses ne se soucie pas de la façon dont les réponses sont calculés - les deux préoccupations sont séparés et d'un calcul différent de la stratégie pourrait être appliquée sans avoir à toucher au code qui génère la liste.

Pour faire la classe la plus utile, ces fonctions doivent être transmis à partir de l'extérieur (c'est à dire l'injection de dépendance) plutôt que d'être instancié dans le constructeur.

Vous connaissez la réponse, je suppose, mais pour ce que ça vaut...

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);
        }
    });
}

6voto

Martijn Courteaux Points 33836

À mon humble avis, c'est en effet une étrange démarche. Le nom de l' Solver est générique, il ne devrait pas mettre en œuvre des opérations par défaut. Cependant, peut-être que c'était une partie de l'entretien? Première partie: il suffit de remplir la demande. Partie deux: dire que c'est étrange de le faire.

Je dirais qu'un beaucoup plus agréable approche serait d'avoir un addMathFunction(MathFunction mf) méthode. Et si l'on voulait, à créer des sous-classes qui étendent l' Solver de la classe et ajouter MathFunctions dans leur constructeur.

3voto

Jason Carter Points 39

Alors que je suis d'accord que ce n'est probablement pas la meilleure façon, ou plus OO façon de le faire, je suppose que le but de cet exercice est de voir comment vous comprenez l'Héritage, les Interfaces et peut-être que les classes internes anonymes. C'est la seule chose que je peux comprendre.

3voto

Oscar Points 1352

Je pense qu'ils voulaient vous d'ajouter deux éléments dans le functionlist. Chacun de mettre en œuvre les MathFunction interface, l'une pour la racine carrée et l'autre pour l'inverse. Le prboblem réside dans les détails:

1 - Vous avez une fonction qui retourne 2 valeurs parce qu'il fait deux choses différentes, c'est mal

2 - Si vous voulez avoir ce "à tout faire" de la classe,m, il serait intéressant de recevoir le Mathfunctions en tant que paramètre de sorte que vous pouvez faire toute sorte de MathFunctions, le MathFunctions serait paramétrable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X