Новый и старый строковый калькулятор Ката

сравнение моего нового и старого строкового калькулятора

Что я делаю?!

В рамках моего учебного путешествия я решил выполнить ката кодирования String Calculator. По сути, это калькулятор, который складывает несколько чисел и возвращает результат. Уловка, однако, заключается в входных данных и в том, как они получены. Программе нужна строка из ввода, где она получит числа, необходимые для выполнения вычислений. Эта строка содержит разделители, такие как запятая, символ новой строки или настраиваемые разделители. Затем программе необходимо проанализировать этот ввод, применить некоторые правила (например, числа не должны быть отрицательными) и вычислить сумму этих чисел. Я укажу на несколько отличий между моей старой версией этой программы и новой и объясню, почему я изменил ее и как я сделал ее лучше.

Интерфейсы против конкретных классов

В моей старой версии программы я не использовал никаких интерфейсов. Все классы были конкретными с надежной реализацией. Таким образом, калькулятор принял бы только список целых чисел и выдал бы целое число. Мой синтаксический анализатор был строковым синтаксическим анализатором с определенными правилами, который одновременно выполнял синтаксический анализ и проверку чисел. И входные данные поступали через жестко закодированную строку из аргументов командной строки.
Однако в моей новой версии я создал интерфейс калькулятора, который принимает список чисел и возвращает число (класс Number в java). Что касается синтаксического анализатора, то теперь он реализует собственную версию метода синтаксического анализа в интерфейсе синтаксического анализатора. Я также получил часть проверки из парсера и поместил ее в отдельный класс проверки. Этот класс реализует метод проверки в интерфейсе проверки, который просматривает все числа в списке, проанализированном синтаксическим анализатором, отфильтровывает недопустимые числа и возвращает список допустимых чисел в калькулятор. Также имеется интерфейс ввода и вывода, который позволяет подключать к программе различные типы ввода/вывода. Хотя пока я использую только консольный ридер/запись.

Обзор

Основное улучшение моего нового кода заключается в том, что он стал более гибким. Теперь он может суммировать различные типы чисел. Парсер только выполняет синтаксический анализ и не заботится о правилах и фактических числах, которые он анализирует. Существует также сущность-валидатор, которая принимает только список и проверяет его элементы. И калькулятор только складывает полученные числа, не заботясь о каких-либо правилах или о том, как они были проанализированы или отфильтрованы.

Урок выучен

Я считаю, что приверженность программированию в стиле BDD очень помогла мне со второй попытки. Я мог бы придумать лучший дизайн и отдельные обязанности для каждого подразделения. Мои тесты не сломались, когда я изменил свои реализации (в частности, реализацию парсера). Я воспринимаю это как хороший знак, чтобы подходить к проблемам в стиле BDD. Это даст возможность разделить ответственность и сложность системы, чтобы найти достаточно хорошую структуру для начала. Любое изменение этого дизайна с течением времени тоже допустимо. Я просматриваю обе версии своего кода и доволен достигнутым прогрессом. Теперь я могу сказать, что я на шаг ближе к лучшему пониманию развития, основанного на поведении.