В соответствии с принципом разделения интерфейсов, лучше иметь отдельные интерфейсы вариантов использования для каждого случая. Это позволяет вам каким-то образом абстрагировать реализацию варианта использования. И вы можете разделить или разделить реализацию варианта использования независимо от уровня контроллера.
Я бы порекомендовал разделить каждый вариант использования на отдельный класс. Потому что, когда вы модифицируете один из них, вы будете на 100% уверены, что не тормозите другой.
Но если у вас есть много вариантов использования, и они маленькие, в этом случае имеет смысл сгруппировать его в файлы. Но я думаю, функции высокого порядка подходят лучше, чем набор функций в классе.
Имеет смысл создать класс, когда он имеет состояние и поведение, но если вы создадите класс для сценариев использования, он не будет иметь состояния и методы вряд ли будут тесно связаны.
Но что действительно важно, согласно чистой архитектуре, так это разделение слоев. Не важно, как организовать хранение вариантов использования, но очень важно иметь возможность изменить решение позже независимо от других уровней.