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