В последнее время, на собеседованиях с новыми кандидатами, мне нравится использовать задачку про генератор кода. Подсмотрел я эту задачку на сайте Яндекса.
Задача
Существует генератор кода на разных языках, реализованный следующим образом:
public class Generator { private final int language; // Language constants public static final int JAVA = 1; public static final int C = 2; public static final int CPP = 3; public Generator(int language) { this.language = language; } public void generateIF() { switch (language) { case JAVA:<Код, генерирующий Java> break; case C:<Код, генерирующий C> break; case CPP:<Код, генерирующий C++> break; } public void generateFOR() { switch (language) { case JAVA:<Код, генерирующий Java> break; case C:<Код, генерирующий C> break; case CPP:<Код, генерирующий C++> break; } }<И так далее> }
Вопросы
- Что не нравится в коде и почему?
- Как изменить?
Ожидаемые ответы
- Должна не нравиться повторяемость кусков кода и их влияние на производительность. А так же, трудности с расширением подобной реализации на новые языки.
- Необходимо выделить общего предка или интерфейс, который будет определять список методов, для генератора каждого языка. Затем для каждого языка реализовать отдельный класс.
Что проверяем
Проверяем умение кандидата работать с ООП и способность видеть несовершенство чужого кода.