Я реализовал улучшенный алгоритм Shunting-Yard для разбора арифметического выражения. Одним из аспектов алгоритма является то, что он поддерживает Очередь
и Стек
.
В моей реализации очередь
содержит Выражения
и Операторы
.
Стек
содержит Операторы
и Круглые скобки
.
Выражения
, Круглые скобки
и Операторы
имеют нет ничего общего, что гарантирует, что у любых двух из них будет общий интерфейс.
Подходы:
Моя текущая реализация состоит из Expression
и Operator
, реализующих INotParanthesis
]. Оператор
и Paranthesis
реализуют INotExpression
. Затем я объявляю Queue
и Stack
.
Мне не нравится эта реализация - эти интерфейсы кажутся очень хакерскими для целей более чистого алгоритма код. Я также считаю, что интерфейсы должны описывать, что такое объект, а не то, чем он не является.
С другой стороны, я также не хочу использовать коллекции
, поскольку может быть трудно быть уверенным в правильности такого кода.
Единственное, что я придумал до сих пор, это реализация моих собственных контейнеров NonParanthesisQueue
и NonExpressionStack
. Это дает преимущество в виде более последовательной проверки типов для объектов, извлекаемых из этих контейнеров, а также недостаток в гораздо большем объеме кода.
Есть ли разумные альтернативы моим подходам?