crafty.orc / calculator
Requires
- php: >=5.3.3||^7.0
- ext-ctype: *
- ext-iconv: *
- nxp/math-executor: ^0.2.0
- symfony/console: *
- symfony/expression-language: *
- symfony/framework-bundle: *
- symfony/yaml: *
Requires (Dev)
- phpunit/phpunit: ^4.8||^5.7
- symfony/phpunit-bridge: ^4.1
This package is not auto-updated.
Last update: 2019-09-16 23:32:46 UTC
README
Тестовое задание по написанию калькулятора
Бандл работает для Symfony 3.4 или Symfony 4.x.
Требования для бандла
Symfony 3.4
symfony/framework-standard-edition
Symfony 4.x
symfony/skeleton
Установка бандла
composer require crafty.orc/calculator
Необходимо инициализировать бандл для загрузки в используемом проекте
Symfony 3.4
app/AppKernel.php
$bundles = [
...
new Calculator\Bundle\CalculatorBundle()
];
Symfony 4.x
config/bundles.php
return [
...
Calculator\Bundle\CalculatorBundle::class => ['all' => true],
];
Использование функционала
Для подсчета выражений используется команда
bin/console calculator:calculate
Описание команды можно получить так:
bin/console calculator:calculate --help
Пример
bin/console calculator:calculate "2 + 2 * 9 - 1 * 3"
-> 2 + 2 * 9 - 1 * 3 = 17
Обработчики выражений
Для готового использования доступны 2 вида обработчиков выражений
- nxp - реализация парсера математических выраженией из библиотеки https://github.com/NeonXP/MathExecutor
- custom - моя собственная реализация парсера с урезанной функциональностью
Переключаться между ними можно следующим образом
bin/console calculator:calculate "2 + 2 * 9 - 1 * 3" --instance=nxp
bin/console calculator:calculate "2 + 2 * 9 - 1 * 3" --instance=custom
Примечание
При использовании обработчика nxp обязателен 1 пробел между символами, иначе в некоторых случаях подсчет не работает.
При использовании обработчика custom недоступна обработка сложных математических выражений (скобки, логические функции, итд)
Расширение функционала
Для расширения функционала подготовлен абстрактный класс
Instance\AbstractCalculator
Его метод AbstractCalculator::execute($expression)
должен принимать string
и возвращать string
, либо float
.
Подготовив конкретную реализацию класса AbstractCalculator
необходимо описать его, как тегированный сервис в своем проекте, например:
MyApp\Calculator\Instance\ConcreteCalculator:
tags:
- { name: calculator.instance, type: my_calc }
Если сервис подключен правильно, то он будет доступен для вызова в открытом сервисе Provider\CalculatorProvider::getCalculator('my_calc')
, для возможного использования этого функционала, например, в контроллере.
Таким образом при вызове имеющейся команды, нужно будет написать
bin/console calculator:calculate "2 + 2 * 9 - 1 * 3" --instance=my_calc