Улучшаю модульный калькулятор.
Я немного улучшил реализацию калькулятора и добавил туда несколько новых операций: вычитание, умножение и деление.
Самое основное изменение заключается в том, что я изменил интерфейс Operation, который реализует плагины/модули нашего калькулятора. Теперь он выглядит вот так:
1 2 3 4 5 6 7 |
package ru.urvanov.calculatorex.plugin; public interface Operation { String getButtonText(); void calculate(CalculatorState state); void buttonPressed(CalculatorState state); } |
Обратите внимание, что метод calculate теперь принимает в качестве параметра экземпляр класса CalculatorState, а не просто два числа. Класс CalculatorState описывает состояние калькулятора и позволяет более тонко контролировать вычислительные операции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package ru.urvanov.calculatorex.plugin; public class CalculatorState { private double accumulatedValue; private double displayValue; private boolean calculated; public double getAccumulatedValue() { return this.accumulatedValue; } public void setAccumulatedValue(double accumulatedValue) { this.accumulatedValue = accumulatedValue; } public double getDisplayValue() { return this.displayValue; } public void setDisplayValue(double displayValue) { this.displayValue = displayValue; } public void setCalculated(boolean calculated) { this.calculated = calculated; } public boolean isCalculated() { return this.calculated; } } |
Идея была в том, что большая часть операций оперирует двумя операндами: накопленным операндом от предыдущих операций и операндом, который сейчас отображается на дисплее. Плюс признак calculated проставляется в том случае, когда нажатие кнопки с цифрой должно приводить не к продолжению ввода, а к началу ввода нового числа.
Архитектура, конечно, выглядит всё ещё довольно сыро и топорно, но основной идеей создания этого калькулятора была идея изучения Jigsaw и модулей в Java 9, так что конечной цели я всё-таки достиг.
Модуль со стандартными плагинами теперь обеспечивает пять реализаций интерфейса Operation, которые перечислены в provides файла «module-info.java» через запятую:
1 2 3 4 5 6 7 8 9 |
module ru.urvanov.calculatorex.standardplugin { requires ru.urvanov.calculatorex; provides ru.urvanov.calculatorex.plugin.Operation with ru.urvanov.calculatorex.plugin.standard.Clear, ru.urvanov.calculatorex.plugin.standard.Sum, ru.urvanov.calculatorex.plugin.standard.Minus, ru.urvanov.calculatorex.plugin.standard.Multiply, ru.urvanov.calculatorex.plugin.standard.Divide; } |
Текущую реализацию можно посмотреть в репозитории на GitHub с тегом step2.
Не знаю, стоит ли продолжать развивать этот проект. Конечной цели он уже достиг, похоже.
Следующим логическим шагом будет, похоже, написание обучающей статьи по проекту Jigsaw.