IOS-приложение VIPER Архитектура - сколько dataManagers?
Я ищу ответ на этот вопрос в контексте архитектурного шаблона VIPER -
Если у вас есть приложение, которое говорит с обоими web api
и database
Как много dataManagers
у тебя должен быть один, два или три?
случай
а) dataManager
б) APIDataManager
а также LocalDataManager
с) dataManager
, APIDataManager
а также LocalDataManager
В которой
а) interactor
разговаривает с одним dataManager
который говорит с любыми услугами, которые вы можете иметь (удаленные или локальные).
б) interactor
знает разницу между local
а также remote
информация - и называет либо APIDataManager
или LocalDataManager
, которые разговаривают с удаленными и местными службами соответственно.
в) interactor
разговаривает только с генералом dataManager
, генерал dataManager
затем говорит с APIDataManager
а также LocalDataManager
РЕДАКТИРОВАТЬ
Там может быть не окончательное решение. Но любой вклад будет принята с благодарностью.
2 ответа
Это зависит от того, где находится абстракция в вашем приложении, то есть от того, что вы делаете, и от того, как вы это делаете. Кто определяет, что есть два разных хранилища данных?
Если локальные и удаленные хранилища данных являются частью самой проблемной области (например, иногда проблема требует извлечения удаленных данных, а в других случаях требует извлечения локальных данных), для интерактора целесообразно знать о двух разных хранилищах данных.
Если Interactor заботится только о том, какие данные запрашиваются, но не заботится о том, как данные извлекаются, имеет смысл для одного менеджера данных определить, какой источник данных использовать.
Здесь играют две разные роли - бизнес-дизайнер и дизайнер данных. Интерактор отвечает за удовлетворение потребностей бизнес-дизайнера, то есть бизнес-логики, проблемной области и т. Д. Уровень данных отвечает за удовлетворение потребностей дизайнера данных, то есть команды сервера, команды ИТ, команды базы данных и т. Д.
Кто может изменить место поиска данных: бизнес-дизайнер или дизайнер данных? Ответ на этот вопрос поможет вам определить, к какому классу принадлежит эта ответственность.
Ни VIPER, ни Чистая Архитектура не требуют, чтобы для всех интеракторов был только один диспетчер данных. В статье VIPER, на которую ссылаются, используется только один менеджер, просто в качестве примера, что конкретная реализация хранилища удалена.
Интерактивные объекты реализуют бизнес-правила для конкретного приложения. Если приложение обращается к серверу, затем поворачивается и обращается к локальному хранилищу дисков, тогда для интерактора совершенно нормально знать об этом. Более того, некоторые из интеракторов должны справляться именно с этим.
Не забывайте, что нормальные правила композиции объектов применимы и к интеракторам. Например, вы начинаете с одного интерактора, который получает данные с сервера и сохраняет их в локальном хранилище. Если он становится слишком большим, вы можете создать два новых интерактора, один из которых выполняет выборку, другой - сохранение в локальном хранилище. Тогда ваш оригинальный интерактор будет содержать эти новые и делегировать всю свою работу им. Если вы будете следовать правилам определения границ, то при рефакторинге класса extract вам не придется менять объекты, которые работают с новым составным интерактором.
Также обратите внимание, что в целом предлагается не называть объекты с окончаниями менеджера или контроллера, потому что их роли становятся не совсем понятными. Вы могли бы назвать интерфейс, который говорит с сервером, что-то вроде APIClient
тот, который абстрагирует ваше локальное хранилище - что-то вроде EntityGateway
или же EntityRepository
,