Где должна находиться бизнес-логика: в моделях или в use cases?
Что проверяют
Хотят понять, отличаете ли вы правила предметной области от сценария приложения и не сведётся ли ваш ответ к «всё в use case». Следом обычно просят показать на примере, какой код куда пойдёт, и спрашивают, где в этой схеме ViewModel.
Как отвечать
Правильный ответ: и там, и там, но это разная логика.
- в модели: инварианты и правила, которые верны всегда, независимо от экрана. Можно ли отменить заказ в текущем статусе, как считается сумма корзины со скидкой, валиден ли номер телефона. В Swift это
structс методами и вычисляемыми свойствами, напримерorder.canBeCancelledилиcart.total; - в use case (interactor): сценарий приложения, который координирует несколько участников.
PlaceOrderUseCaseпроверяет корзину через модель, вызывает репозиторий, платёжный сервис и аналитику, решает, что делать при ошибке. Зависимости приходят протоколами через инициализатор, метод обычноasync throws; - не во ViewModel и не в
UIViewController: они превращают результат в состояние экрана. Если правило скидки живёт во ViewModel, второй экран его скопирует, и через месяц версии разойдутся.
Отдельно скажите про модели разных слоёв. Codable-структура из ответа API это DTO, а не доменная модель: её форму диктует бэкенд, поэтому правила туда не кладут, а маппят DTO в доменную сущность на границе слоя данных.
Хорошо показать, что вы знаете цену. Use case, который просто вызывает repository.fetch(), это лишний файл. В небольшом приложении на SwiftUI с @Observable моделью экрана отдельный слой use case часто не нужен, пока сценарий не начал повторяться или усложняться.
Где спотыкаются
Делают модели пустыми структурами с полями, а всю логику уносят в use case. Это анемичная модель: одно и то же правило проверяется в пяти сценариях по-разному, а модель ничего не гарантирует.
Путают DTO с доменной сущностью и добавляют бизнес-методы прямо в Codable-тип, который повторяет JSON.
Заводят use case на каждый вызов сети по шаблону Clean Architecture, даже когда логики нет. Интервьюер спросит, что этот класс проверяет, и честный ответ «ничего» звучит плохо.