Этим утром я читал Steve Yegge: When Polymorphism Fails, когда наткнулся на вопрос, который его коллега задавал потенциальным сотрудникам, когда они приходили на собеседование в Amazon.
В качестве примера полиморфизма в действии давайте рассмотрим классический «eval» вопрос для интервью, который (насколько мне известно) был представлен на Amazon Роном Браунштейном. Вопрос довольно сложный, так как он позволяет исследовать широкий спектр важных навыков: проектирование ООП, рекурсия, бинарные деревья, полиморфизм и типизация во время выполнения, общие навыки кодирования и (если вы хотите усложнить) теорию синтаксического анализа. .
В какой-то момент кандидат, надеюсь, поймет, что вы можете представить арифметическое выражение в виде двоичного дерева, предполагая, что вы используете только бинарные операторы, такие как «+», «-», «*», «/». Листовые узлы — это все числа, а внутренние узлы — это все операторы. Вычисление выражения означает обход дерева. Если кандидат этого не понимает, вы можете мягко подвести его к этому или, если необходимо, просто сказать ему.
Даже если вы расскажете им, это все равно интересная проблема.
Первая половина вопроса, которую некоторые люди (имена которых я буду защищать до последнего вздоха, но их инициалы — Уилли Льюис) считают требованием к работе, если вы хотите называть себя разработчиком и работать в Amazon, на самом деле довольно сложная. . Вопрос в том, как перейти от арифметического выражения (например, в строке), такого как «2 + (2)», к дереву выражений. В какой-то момент у нас может возникнуть вызов ADJ по этому вопросу.
Вторая половина: допустим, это проект для двух человек, и ваш партнер, которого мы назовем «Вилли», отвечает за преобразование строкового выражения в дерево. Вы получаете простую часть: вам нужно решить, из каких классов Вилли будет строить дерево. Вы можете сделать это на любом языке, но убедитесь, что вы выбрали один, или Вилли предоставит вам язык ассемблера. Если он и злится, то это будет для процессора, который больше не производится в производстве.
Вы будете поражены тем, как много кандидатов на это.
Я не буду раскрывать ответ, но стандартное плохое решение предполагает использование оператора switch или case (или просто старых добрых каскадных if). Несколько лучшее решение предполагает использование таблицы указателей на функции, а вероятно лучшее решение предполагает использование полиморфизма. Я призываю вас когда-нибудь поработать над этим. Забавный материал!
Итак, давайте попробуем решить проблему всеми тремя способами. Как перейти от арифметического выражения (например, в строке), такого как «2 + (2)», к дереву выражений, используя каскадные операторы if, таблицу указателей на функции и/или полиморфизм?
Не стесняйтесь заниматься одним, двумя или всеми тремя.
[обновление: заголовок изменен, чтобы лучше соответствовать большинству ответов.]