crafty.orc/calculator

Maintainers

Details

gitlab.com/crafty.orc/calculator

Installs: 15

Dependents: 0

Suggesters: 0

Security: 0

Type:project

1.3.1 2018-09-17 02:40 UTC

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