Разгледайте проекта. Той представлява имплементация на постфиксен калкулатор. Проектът се състои от 5 класа:
-
org.elsys.postfix.MainClass
- стартиращ клас на проекта, който създава инстанция на калкулатор и добавя в него операцията плюс; -
org.elsys.postfix.Calculator
- основен клас за проекта; четящ и изпълняващ операции от подаден поток и пишещ в подаден изход; операциите, които поддържа се добавят в конструктора му; -
org.elsys.postfix.operations.Operation
- интерфейс, който наследяват всички операции; -
org.elsys.postfix.operations.AbstractOperation
- абстрактен наследник наOperation
, в който се съдържат общите свойства и методи за всички операции; -
org.elsys.postfix.operations.Negate
- имплементация на унарен минус;
Задачите е добре да се имплементират в реда, изброен тук.
Имплементирайте операция за дупликиране на последната стойност в стека.
Обърнете внимание дали в имплементацията на тази операция и имплементацията на
операцията neg
има еднакъв код. Ако да, помислете как да го избегнете.
Тестът DuplicateTest.java
трябва да минава.
Тестовете SinTest.java
и CosTest.java
минават.
Помислете какъв е общият код между всички бинарни операции и как можете да го изнесете на едно място.
Тестовете PlusTest.java
, MinusTest.java
, MultiplicationTest.java
и
DivisionTest.java
минават.
\*-\*
, която умножава три числа и връща резултата от умножението с обратен знак
-
Да се имплементира операцията
swap
, която разменя местата на последните два елемента на върха на стека. -
Да се имплементира операцията
rot3
, коята ротира последните три елемента на на върха на стека.
Да се имплементира композитна операция CompositeOperation
, която използва
composite pattern за поддръжка
на композиране на вече съществуващи операции. Класът CompositeOperation
трябва да
наследява AbstractOperation
и да поддъжа добавяне на операции, а метода
calculate()
изпълнява последователно всяка от операциите в CompositeOperation
.
Тестът CompositeOperationTest
трябва да минава.
В метода run()
на класа Calculator
да се добави поддръжка за дефиниране на макро
операции. Например следният фрагмент дефинира операцията square
:
\square
dup *
def
Началото на макро дефиницията започва с обратна наклонена и името на дефинираният
макрос square
. Дефиницията на макроса продължава до срещането на думата def
.
Тестът SquareMacroTest
трябва да минава.
Дефиницията на макро операции трябва да поддържа използване на константи. Например:
\add1
1 +
def
дефинира операцията add1
, която добавя 1 към последният елемент в стека.