В последнее время, на собеседованиях с новыми кандидатами, мне нравится использовать задачку про генератор кода. Подсмотрел я эту задачку на сайте Яндекса.
Задача
Существует генератор кода на разных языках, реализованный следующим образом:
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;
}
}<И так далее>
}
Вопросы
- Что не нравится в коде и почему?
- Как изменить?
Ожидаемые ответы
- Должна не нравиться повторяемость кусков кода и их влияние на производительность. А так же, трудности с расширением подобной реализации на новые языки.
- Необходимо выделить общего предка или интерфейс, который будет определять список методов, для генератора каждого языка. Затем для каждого языка реализовать отдельный класс.
Что проверяем
Проверяем умение кандидата работать с ООП и способность видеть несовершенство чужого кода.