LINUX.ORG.RU

Дизайн калькулятора


0

0

Необходимо было разработать ООП калькулятор с поддержкой операций, функций, графического и текстового интерфейса, и задизайнить так, чтобы при добавлении новой операции/функции логика вычислений не менялась. Некоторую часть работы уже выполнил, вот что получилось (uml): http://ompldr.org/vOWd3dw

Вкратце работает оно так: на вход класса Calculator приходит математическое выражение, мы его передаем синтаксическому анализатору, который с помощью конечного автомата разбивает ее на токены — числа, операции, плюс, минус и тд. Распознает он токен с помощью метода getToken, которому передается символ, скажем плюс, и он возвращает соответствующий объект — Plus. Когда все распарсено, мы передаем очередь классу Notation, в котором происходит перевод выражения в обратную польскую запись, после чего в классе Compute мы вычисляем выражение. Все построено таким образом, что для того, чтобы добавить новую операцию, нужно создать всего лишь один новый класс, наследующий класс Operator из заимплементить логику. Его регистрация происходит в классе TokenTable автоматически — сканируется область пакета, где лежат токены, и подгружаются в Map.

Как вам дизайн? Есть ли какие-нибудь ошибки в нем? Что думаете?

P.S. Еще настораживает тот факт, что с операциями приходится работать как с токенами только на фазе синтаксического анализа (т.е. дергать getIdentifier), в классе Token есть филд identifier, в котором помещено представление токена ('+','(' и тд), который идентифицирует этот класс. Корректно только из-за этого помещать операции в иерархию токенов?



Последнее исправление: JN (всего исправлений: 2)

/убежал за попкорном

anonymous
()
Ответ на: комментарий от AIv

Ну медалька тебе с олимпиады.

JN
() автор топика

А зачем обратная польская нотация, если не секрет? Почему просто не построить дерево и не свернуть его? Что ты с ней собираешься делать?

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

ОПН нужна чтобы расставить приоритеты, т.е. избавится от скобок и спокойно вычислить. Деревом тоже можно, но это лишь альтернативный вариант, я выбрал ОПН.

JN
() автор топика
Ответ на: комментарий от KblCb

Не. Эти инструменты буду использовать тогда, когда не будет задачи разработать интерпретатор самому.

JN
() автор топика

Что за ООП головного мозга? Задание в универе что-ли такое? Других причин писать оопэ-калькулятор я не вижу.

unlog1c ★★★
()

Calculator::calculate -> integer

Compute::compute -> long

ОЛОЛО.

И вообще где на схеме функции? По мне, так Compute лишняя сущность.

parce

baverman ★★★
()
Ответ на: комментарий от JN

Не пойми меня неправильно, но если в качестве тестового задания дают написать ООП-калькулятор - они задумывают что-то плохое. Не то чтобы я противник объектов, но всё должно быть к месту.
Сам дизайн нормальный - вполне выполняет свою задачу изобразить простую задачу кучей прямоугольников и стрелочек, чтобы никому ничего не было понятно, но выглядело внушительно (в этом суть UML'а, я так понимаю:)).
Непонятно правда зачем тебе токены *Bracket, если калькулятор будет с обратной польской нотацией.

unlog1c ★★★
()

У меня под боком подобная клоунада: на сложную технологию (типа семантических сетей) натягивают примитивные приложения уровня калькулятора.

elverion
()
Ответ на: комментарий от baverman

Забыл на диаграмме поправить.

JN
() автор топика
Ответ на: комментарий от unlog1c

Я сам без опыта, вот и хотят посмотреть, как я решаю задачи, подобные тем, которые стоят в реальных проектах.

А токены мне нужны для внутреннего представления данных.
Выражение 2+(3-1) будет стеком из ссылок на классы:
Number(2)
Plus
OpeningBracket
Number(3)
Subtraction
Number(1)
ClosingBracket

JN
() автор топика
Ответ на: комментарий от JN

Это будет создано на этапе синтаксического анализа, после чего результат будет передаваться в метод, конвертирующий выражение в ОПН, вот там и нужны скобки.

JN
() автор топика
Ответ на: комментарий от JN

Так если у тебя изначально задание парсить нормальную инфиксную форму, так зачем в ОНП переводить? Для представления выражений накидай на коленке Composite для из «Design Patterns» и твои наниматели-работодатели соргазмируют сразу.

unlog1c ★★★
()

>Вкратце работает оно так: на вход класса Calculator приходит математическое выражение, мы его передаем синтаксическому анализатору, который с помощью конечного автомата разбивает ее на токены — числа, операции, плюс, минус и тд.
здесь описана модель последовательности действий, т.е. чисто императивная.

т.е. на самом верхнем уровне абстракции в своей голове, ты видишь калькулятор как последовательность действий, а не как совокупность объектов, взаимодействующих вместе... мне кажется, что это неверно.

с помощью конечного автомата разбивает ее на токены

а скобки поддерживаются и приоритет операций?

есть ещё пара мыслей

на картинке token и operator доступны по разным путям, да и вообще диаграмма класса не представляет из себя дерево, что на мой взгляд странно

нету интрефейсов, а мне казалось, что ооп это всё об интерфесах.

на мой взгляд, вычисление должно как-то абстрагировать меня от нотаций и синтаксиса.

dimon555 ★★★★★
()

Вкратце работает оно так: на вход класса Calculator приходит математическое выражение, мы его передаем синтаксическому анализатору, который с помощью конечного автомата разбивает ее на токены — числа, операции, плюс, минус и тд. Распознает он токен с помощью метода getToken, которому передается символ, скажем плюс, и он возвращает соответствующий объект — Plus.

Это лексический анализ...

anonymous
()
Ответ на: комментарий от JN

А на что по твоему нужно?

На четкое разделение этапов разбора выражения и компиляции его в вычислимую форму. Сейчас всё в куче. Оператор у тебя и токен, и, одновременно, непосредственно вычисляемая операция. Как работодателя, меня сильно смущает твоя квалификация.

baverman ★★★
()
Ответ на: комментарий от JN

И еще. Ты схалявил — из схемы совершенно непонятно как будет добавляться функция, например синуса. Или факториал, хе-хе.

baverman ★★★
()
Ответ на: комментарий от anonymous

Я бы писал... в качестве бэкэнда нагенерированный bisonom/flexom транслятор с простенького языка (задача уровня универа). Учёл бы что могут быть функции, в том числе добавляемые пользователем.

Дальше писал бы фронтэнд с «логикой».

anonymous
()
Ответ на: комментарий от Nicholass

кстати ОПН вполне применима, кто помнит МК-61, тот жмет «равно» не спеша ;)

Nicholass ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.