Код-ревью Senior Clean Architecture и слои обновлено
Код-ревью: use case оформления заказа (Swift)
Вопрос
Найдите нарушения границ слоёв в use case.
import UIKit
import Alamofire
final class PlaceOrderUseCase {
let vc: UIViewController
func execute(cart: CartDTO) async throws -> UIColor {
guard cart.items.count > 0 else {
await vc.present(UIAlertController(title: "Пусто", message: nil, preferredStyle: .alert), animated: true)
return .red
}
let response = try await AF.request("https://api.shop.ru/orders", method: .post)
.serializingDecodable(OrderDTO.self).value
UserDefaults.standard.set(response.id, forKey: "lastOrder")
return response.status == "ok" ? .green : .red
}
}
Коротко
Чистая версия: final class PlaceOrderUseCase { init(orders: OrderRepository, history: OrderHistoryStore) }, метод execute(cart: Cart) async throws(OrderError) - PlacedOrder. Пустая корзина это доменная ошибка, которую view model покажет алертом.
Что должен найти ревьюер
- Стильстрока 1Домен импортирует UIKit: use case нельзя протестировать и переиспользовать без UI.
- Стильстрока 2Сетевая библиотека в домене: запрос должен уходить через интерфейс репозитория, реализованный в data.
- Ошибкастрока 5Use case держит контроллер и показывает алерт: это ответственность presentation.
- Стильстрока 7Use case принимает DTO и возвращает цвет: на входе и выходе должны быть доменные типы (корзина, результат заказа).
- Стильстрока 14Прямая запись в
UserDefaults: хранение тоже скрывается за абстракцией. - Ошибкастрока 15Статус сравнивается со строкой из ответа: формат API протекает в бизнес-логику, опечатка на сервере сломает заказ.
Разбор
Чистая версия: final class PlaceOrderUseCase { init(orders: OrderRepository, history: OrderHistoryStore) }, метод execute(cart: Cart) async throws(OrderError) -> PlacedOrder. Пустая корзина это доменная ошибка, которую view model покажет алертом. Репозиторий в data делает запрос и маппит DTO со строковым статусом в enum.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Clean Architecture и слои»
- Правило зависимостей в Clean Architecture
- Что можно импортировать в domain-слой
- Зачем маппить DTO в доменные модели
- Ошибки на границах слоёв
- Пакеты по слоям или по фичам
- Инверсия зависимостей
- Слои мобильного приложения
- Сколько моделей нужно на сущность