Интерактор в интеракторе или другой интерактор

Есть несколько интеракторов:

  1. ObjectsInteractor (внутри objectsRepository, treeRepository, stateRepository)
  2. UserInteractor (внутри userRepository)
  3. AuthInteractor (внутри userRepository, authRepository)
  4. SecurityInteractor (внутри securityRepository)
  5. SettingsInteractor (внутри settingsRepository)

Необходимо очистить пользовательские данные (logout).

Первоначально сделал так: В SettingsViewModel есть все перечисленные выше интеракторы, и у них во всех есть функция clear() - эти функции не просто перебрасывают clear в соответствующий репозиторий, а в некоторых есть какая то особая логика. При нажатии на кнопку logout, я друг за другом тяну функции clear у выше описанных интеракторов и при успешном выполнении цепочки выхожу на экран авторизации. Было все прекрасно :)

Но сейчас необходимо сделать функцию logout еще и в SecurityView (экран входа по паролю).

Прикинул два способа решения:

  1. В принципе могу сделать также как выше в SettingsViewModel. Но тогда я должен буду скопировать код и каждый раз менять этот код в двух местах (может потом в трех и т.д.) при каких то изменениях, например, при logout придется еще добавить очистку чего либо или там какой то request делать(в цепочку вызова что-то добавляется).

  2. Или могу сделать еще один интерактор AppDataInteractorи внутри него выполнять очистку всех данных, но в этом случае мне нужно будет либо копировать функции clear из всех выше перечисленных инеракторов и придется всегда при изменении логики этих методов менять их в соответствующих интеракторах и в AppDataInteractor либо мне надо в AppDataInteractor держать ссылки на вышеперечисленные интеракторы и вызывать их функции, а это уже совсем плохо (по феншую, один useCase не должен знать о другом).

Я даю предпочтение первому способу(так уже сделано). Что посоветуете вы?


Ответы (1 шт):

Автор решения: Sergei Buvaka

Я не очень уверен, что до конца вас понял но все же накину.

Я конечно не знаю сколько у вас там еще интеракторов, но если выше перечисленные это и есть все, то можно создать какой-то abstract class/interface и в нем иметь метод clear() от которого будут наследоваться/имплементировать интеракторы. При нажатии кнопки logout(). Можно создать какой-то хендлер который будет хранить в себе созданные экземпляры интеракторов (тут можно подумать о том, чтоб в нем были методы add() и remove()) и он имел бы метод clear() который пробегался бы по всем интерракторам и вызывал метод clear() внутри каждого (а там они везде реализованы по своему). Можно в этот метод на вход передавать какие-то фильтры и если вдруг вам необходимо чистить интеракторы по какому-то предикату.

А вообще здесь нужно видеть какие-то кейсы и код. Так очень трудно дать какой-то ответ.

→ Ссылка