Перевод числа в цифровой записи в строковую. Например 134345 будет "сто тридцать четыре тысячи триста сорок пять". * Учесть склонения - разница в окончаниях (к примеру, две и два).
-
Алгоритм должен работать для сколько угодно большого числа, соответственно, значения степеней - миллион, тысяча, миллиад и т.д. - должны браться из справочника, к примеру, текстового файла.
-
Обязательно создать Data Driven Test (пользователь должен иметь возможность ввести множество наборов 1.число 2.правильный эталонный результат, тест самостоятельно проверяет все наборы и говорит, что неверное), который доказывает, что Ваш алгоритм работает правильно. Использовать JUnit.
-
По возможности, применить ООП.
-
Число состоит из групп цифр, заключенных в порядки (далее - "тройки")
-
Каждый порядок представляет собой показатель степени числа делённый целочисленно на 3
-
Падеж и число (множественное или единственное) каждой тройки зависят от последней цифры в ней, а род - от порядка
-
Цифры в данном проекте представляют собой разряды нулевого порядка, возможно требуется рефакторинг
-
123 - содержит одну тройку, которая имеет порядок равный 0, родительный падеж, единственное число и мужской род
-
12341 - 2 тройки:
- 12, порядок равен 1, падеж родительный, множественное число, женский род
- 341, порядок равен 0, падеж именительный, иденственное число, мужской род
-
Цифры представлены классом Digit. Они хранят последовательность, отражующую их в цифровом представлении, номер разряда в тройке, число и падеж, требуемые для построения словесной формы порядка, а также формы словесного представления для разных родов
-
Порядки представлены классом NamedOrder. Они хранят свой номер, род, и корень словесного представления, а также формы в зависимости от падежа и числа, если для их формирования не определен алгоритм
-
Цифры и порядки хранятся в в файлах digits.yaml и named_orders.yaml
-
Доступ к числам и порядкам предоставляется посредством DefaultDigitsRepository и DefaultNamedOrdersRepository, иницилизациюю которых целесообразно посредством вызова метода create() у экземпляров классов DefaultDigitsRepositoryFacotry и DefaultNamedOrdersRepositoryFactory соответственно
-
Тройки представлены классом Triple. В них хранится не более 3х цифр и порядок. Родом тройки является падеж порядка, а число и падеж представляют собой оные у последней цифры
-
Для построения тройки из последовательности без учёта порядка, содержащей не боллее трёх чисел используется TripleFactory
-
Полное представление числа хранится в классе TripleSequence, он хранит список из троек
-
Формирование последовательностей числа обеспечивает класс TripleSequenceFactory, который после разбиения числа на тройки, присваивает этим тройкам соответствующий порядок
-
Класс DefaultTripleAsStringRepresenter отвечает за представление тройки в словесном представлении, формирование словесного представления тройки происходит путём формирования словесного представления каждой из цифрвы с учётом её номера в тройке и рода порядка, и последующего формирования словесного представления порядка, в зависимости от числа и падежа последней цифры в тройке
-
Класс Suffix хранит окончание, род, число и падеж (которые для удобства объединены в класс Declension), которые в дальнейшем используются для формирования словесного представления порядка в DefaultNamedOrdersAsStringRepresenter
-
Все суффиксы хранятся в файле suffixes.yaml, а доступ к ним предоставляет класс DefaultSuffixesRepository, который лучше инициализировать посредством вызова метода create() у экземпляра класса DefaultSuffixesFactory
-
За формирование словесного представления цифры отвечает класс DefaultDigitsAsStringRepresenter
-
Построение словесной формы всего числа происходит в классе DefaultTripleSequenceAsStringRepresenter, когда последовательно формируются словесные представления каждой из троек
-
Файлы-словари digits.yaml, named_orders.yaml и suffixes.yaml хранятся в папке src/main/sources для основной программы и в src/test/sources для тестов соответственно
Старался использовать слабую связанность, поэтому такое большое колличество интерфейсов. Скорее всего, использование инструмента для внедрения зависимостей такого, как, например, Spring решило бы проблему большого числа классов-построителей (реализации класса Builder).