Задача: посчитать цену товара нестандартного размера; для этого надо в зависимости от введенных размеров (ширины и длины) получить цену и размеры этой модели базового и далее по формуле плясать от этого базового. Например, пользователь ввел 80x175, тогда ищем в БД эту же модель размера 80x180 (т.к. ширина меньше 100), ее цену делим на 80 и на 180, умножаем на 80 и 175, далее какой-то коэффициент; если же ширина больше 100, то берем за базовую модель уже другой размер и так далее.
Вопрос, где делать запрос к БД для получения базовой модели. У меня получился класс CustomSizeCalculator. Он сначала находит более короткую сторону (в случае если пользователь ввел ширина больше длины), вытаскивает базовый размер через репозиторий, конечно, считает и возвращает цену.
Так неудобно тестировать и это ограничивает расчет цены только до одной сущности: лучше бы получать базовый размер и его цену где-то в другом месте, а в калькулятор передавать уже только значения. Что для этого сделать, сервис?
IMHO
2 пути
CustomSizeCalculator формирует критерий_поиска_по_размеру, репоз по нему возвращает базовый_размер_и_цену
CustomSizeCalculator зависит от поиска_базового_размера
т.е. в двух случаях не свойственная функция поиска базового размера выносится из калькулятора. Калькулятор будет получать извне либо объект реализации репоз. или объект поиска_базового_размера.
тогда калькулятор тестируется заглушками или моками.
так же если расчет может меняться, то его можно вынести как стратегию расчета.
[критерий_поиска возможно это просто размер детали.]