Необходимо было разработать ООП калькулятор с поддержкой операций, функций, графического и текстового интерфейса, и задизайнить так, чтобы при добавлении новой операции/функции логика вычислений не менялась. Некоторую часть работы уже выполнил, вот что получилось (uml): http://ompldr.org/vOWd3dw
Вкратце работает оно так: на вход класса Calculator приходит математическое выражение, мы его передаем синтаксическому анализатору, который с помощью конечного автомата разбивает ее на токены — числа, операции, плюс, минус и тд. Распознает он токен с помощью метода getToken, которому передается символ, скажем плюс, и он возвращает соответствующий объект — Plus. Когда все распарсено, мы передаем очередь классу Notation, в котором происходит перевод выражения в обратную польскую запись, после чего в классе Compute мы вычисляем выражение. Все построено таким образом, что для того, чтобы добавить новую операцию, нужно создать всего лишь один новый класс, наследующий класс Operator из заимплементить логику. Его регистрация происходит в классе TokenTable автоматически — сканируется область пакета, где лежат токены, и подгружаются в Map.
Как вам дизайн? Есть ли какие-нибудь ошибки в нем? Что думаете?
P.S. Еще настораживает тот факт, что с операциями приходится работать как с токенами только на фазе синтаксического анализа (т.е. дергать getIdentifier), в классе Token есть филд identifier, в котором помещено представление токена ('+','(' и тд), который идентифицирует этот класс. Корректно только из-за этого помещать операции в иерархию токенов?