Сегодня утром я читал Стив Йегге: когда полиморфизм не срабатывает, когда я столкнулся с вопросом о том, что один из его сотрудников спросите потенциальных сотрудников, когда они пришли на собеседование в Amazon.
В качестве примера полиморфизма в действие, посмотрим на классику вопрос "eval", который (как насколько я знаю) был доставлен в Амазонку Рон Браунштейн. Вопрос в том довольно богатый, поскольку ему удается исследовать широкий спектр важных навыки: дизайн ООП, рекурсия, двоичный деревья, полиморфизм и время выполнения типизация, общие навыки кодирования и (если вы хотите сделать его сложным) теории парсинга.
В какой-то момент кандидат, надеюсь, понимает, что вы можете представлять арифметическое выражение как двоичное дерево, предполагая, что вы используете бинарные операторы, такие как "+", "-", "*", "/". Листовые узлы - все числа, а внутренние узлы всех операторов. Оценка выражение означает хождение по дереву. Если кандидат этого не осознает, вы можете мягко привести их к нему, или если необходимо, просто скажите им.
Даже если вы скажете им, это все равно интересная проблема.
Первая половина вопроса, которая некоторые люди (чьи имена я буду защитите мое умирающее дыхание, но их инициалы - Вилли Льюис). Требования к работе, если вы хотите позвонить Сам разработчик и работа в Amazon, на самом деле очень тяжело. вопрос: как вы переходите от арифметическое выражение (например, в строка), например "2 + (2)", дерево выражений. У нас может быть ADJ вызов по этому вопросу на некоторых точка.
Вторая половина: скажем, это проект из двух человек и ваш партнер, который мы будем называть "Вилли", ответственный за преобразование string выражение в дерево. Вы получаете легкая часть: вам нужно решить, что Клайв Вилли должен построить дерево с. Вы можете сделать это в любом язык, но убедитесь, что вы выбрали один, или Вилли вручит вам сборку язык. Если он чувствует себя, он будет для процессора, который не является более долгое производство в производстве.
Вы будете поражены тем, сколько кандидатов boff этот.
Я не отвечу ответа, но Стандартное плохое решение подразумевает использование (или просто хороший старомодный каскадный-ifs). Немного лучшее решение используя таблицу указателей функций, и, возможно, лучшее решение предполагает использование полиморфизма. я поощрять вас к работе когда-то. Забавные вещи!
Итак, попробуем решить эту проблему всеми тремя способами. Как вы переходите от арифметического выражения (например, в строке), такого как "2 + (2)" к дереву выражений, используя cascaded-if's, таблицу указателей функций и/или полиморфизм?
Не стесняйтесь решать одну, две или все три.
[обновление: название изменено, чтобы лучше соответствовать большинству ответов.]