Программируемый польский калькулятор

Первая версия польского калькулятора была описана тут. В ней мы изучили что такое стэк, как написать много if else и как заменить их всех на словарь операций.

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

SOLID

В этом задании мы концентрируемся на принципах "single responsibility" (единая ответсвенности) и "open-closed" (открытость/закрытость принцип). Особенно нас интересует open-closed - система открыта для расширения, но закрыта для модификации.

Компоненты системы

  1. Ядро системы. В нём сосредоточена бизнес логика - то как хранится стек операций, то как происходят вычисления независимо от самих операций.
  2. Система подключения операций. При запуске системы этот компонент должен найти в папке динамически все операции и подключить их к ядру.
  3. Интерфейс взаимодействия с пользователем. В простом варианте - это command line interface (CLI). Запуск может выглядеть следующим образом: python3 calc/ "5 1 2 + 4 * + 3 -".
  4. Пользовательские операции. Каждая операция - это отдельный файл внутри которого описана логика его работы и дополнительная необходимая информация для его использования ядром.

Соответсвенно принципу open-closed 1, 2, 3 компоненты системы модифицировать запрещено. Расширение системы операциями идет только через добавление новых файлов в 4.

Классы системы

Каждый класс лежит в отдельном модуле(файле). Если написано, что нужно создать интерфейс, то создавайте его с помощью @abstractmethod аннотации над методом, в теле которого стоит просто pass. Потом в отдельном файле создаете конкретный класс реализацию интерфейса. Например class ListStack(Stack):.... Каждый класс должен быть протестирован.

Stack интерфейс

Обычный стек с операциями pop и push.