В чем разница между хранилищами и сценариями использования?
Я создаю приложение чата с использованием чистой архитектуры, я хочу проверить, вошел ли пользователь в систему при запуске приложения, и открыть экран входа, если он не вошел в систему, поэтому у меня следующие вопросы:
Каков наилучший способ реализовать это? Должен ли я сделать
LoginActivity
активность запуска и проверьте, когдаLoginPresenter
запускается, если пользователь уже вошел в систему, затем откройтеMainActivity
? И куда мне поставить логику для проверки подлинности пользователя (IsLoggedInUseCase
может быть?)?Я не очень понимаю, в чем разница между хранилищами и сценариями использования, почему я должен сделать
GetAllUsersUseCase
а такжеEditUserUseCase
.. и т. д., когда уже естьUsersRepository.getAllUsers()
а такжеUsersRepository.editUser(User user)
? Зачем создавать новый класс просто для ссылки на метод, который уже существует в хранилище?
1 ответ
Просто, Use-Cases
обрабатывает вашу бизнес-логику, Repositories
слой данных, который вы храните и доступ к данным.
Например, когда вы открываете действие Launcher (Давайте назовем его SplashActivity
)
Сначала вы начинаете свой Presenter
:
mSplashPresenter.start();
Во-вторых, в методе запуска вашего докладчика вы реализуете логику, если пользователь вошел в систему или нет? Если это логин, перейдите на панель инструментов, если нет, перейдите к LoginActivity
,
Я предполагаю, что у вас есть LoginUseCase.
public void start(){
if(mLoginUseCase.isLoggedIn()){
mView.navitageToDashboard();
} else {
mView.navigateToLogin();
}
}
В-третьих, вам нужен метод прецедента, подобный следующему. (Опять же я предполагаю, что у вас есть UserRepository
)
public boolean isLoggedIn(){
// This is your business logic.
return mUserRepository.getCurrentUser() != null;
}
И в твоем User Repository
:
public User getCurrentUser(){
// This is your data
// You can access remote or local data with repository.
return mLocalDataSource.getUser();
}
Так зачем нам нужен вариант использования? Это простая бизнес-логика, которая решает, вошел ли пользователь в систему или нет. Это может быть более сложная бизнес-логика, или вы хотите использовать эту логику в других докладчиках. Так с Use-Cases
Вы делаете свой бизнес-код повторно используемым и избегаете дублирования кода в своих докладчиках.
Позже, если вы захотите изменить логику входа в систему, вы измените только свой вариант использования, а не всех докладчиков.
Давайте определимся с логикой для вашего вопроса: EditUser
,
У вас есть метод репозитория UsersRepository.editUser(User user)
который редактирует пользователь.
У тебя есть Profile
экран, который пользователь может редактировать все поля. Также у вас есть EditScreenDetail
На экране этот пользователь может редактировать некоторые поля, связанные с деталями экрана, которые могут видеть другие люди.
На обоих экранах вы редактируете пользователя, но перед вызовом UserRepository
Метод, вам нужно проверить обязательные поля, которые отличаются на двух экранах. Итак, вы определяете ProfileEditUseCase
а также ScreenDetailsEditUseCase
реализовать две разные бизнес-логики. Но последняя операция такая же. Вы редактируете пользователя своим репо. Из удаленного или местного.
Резюме:
С Use-Cases
Вы отделяете свою бизнес-логику от докладчиков и слоя данных, избегая дублирования кода в своих докладчиках. Также вы управляете своим бизнесом, который можно использовать в других частях из одного класса.
Я надеюсь, что я объяснил это ясно.