Skip to content

Предложение по улучшению кейса аутентификации #22

@ultimate-deej

Description

@ultimate-deej

Сразу к сути: идея в том, чтобы отвязать интерактор от роутера.
Ведь как известно интерактор не должен зависеть от внешних слоёв и внешних библиотек. То, что он знает о cicerone или о PIN_SCREEN - плохо.

Вместо этого, если уж возникла такая потребность, с ним следует работать как и с репозиториями (и с внешним миром вообще) через интерфейс, объявленный в слое домена. По сути интерфейс даже не должен представлять роутер, т.к. домен знать не знает, как в приложении реализована навигация. И такой уже есть в примере, это PinCodeListener.

Навскидку, в первом приближении это может выглядеть так. Вместо явного вызова роутера из интерактора:

private void subscribeToAuthHolder() {
    authHolder.subscribeToSessionExpired(() -> {
        if (pinCodeListener != null) pinCodeListener.needUpdatePinCode();
    });
}

реализуем PinCodeListener где-то в слое навигации (где, кстати?):

public class PinCodeUpdater implements PinCodeListener {
    ...

    public void needUpdatePinCode() {
       router.navigateTo(GlobalNavigator.PIN_SCREEN); 
    }

    ...
}

и прокидываем в домен как зависимость вместо роутера:

public class PinInteractorImpl implements PinInteractor {
    private PinCodeListener pinCodeListener;
    ...

    public PinInteractorImpl(AuthRepository authRepository, PinCodeListener pinCodeListener) {
        this.pinCodeListener = pinCodeListener;
        ...
    }

    private void subscribeToAuthRepos() {
        authRepository.subscribePinCodeNeedUpdate(pinCodeListener);
    }

    ...
}

Всё. Изменения минимальны, но домен избавился от зависимости. Можно и на модули резать :).

Если моё предложение вам понравилось, могу заняться pull request'ом.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions