Sobes.tech
Middle+

Quels sont les inconvénients de sauvegarder la vue dans le présentateur?

sobes.tech IA

Réponse de l'IA

Conserver une référence à la vue (View) dans le présentateur (Presenter) dans le pattern MVP peut entraîner les inconvénients suivants :

  1. Fuites de mémoire : Si le cycle de vie de la vue est plus court que celui du présentateur, et que ce dernier continue de maintenir une référence à la vue détruite, cela entraîne une fuite de mémoire.
  2. Forte dépendance : Le présentateur devient fortement couplé à une implémentation spécifique de la vue, ce qui complique les tests unitaires du présentateur et sa réutilisation avec différentes vues (par exemple, avec un fragment et une activité). Le principe de "Séparation des responsabilités" est violé.
  3. Difficulté lors des tests : Pour tester le présentateur, il faut faire des mocks ou créer des implémentations fictives de toute l'interface de la vue, ce qui peut être lourd et peu évident.
  4. Difficulté avec les opérations asynchrones : Travailler avec la vue après une opération asynchrone (par exemple, une requête réseau) nécessite des vérifications supplémentaires de la validité de la vue (si elle est attachée à la fenêtre, si elle n'a pas été détruite), ce qui complique le code.

Une bonne pratique consiste à utiliser des références faibles (WeakReference) ou à détacher explicitement la vue du présentateur lors de sa destruction (par exemple, dans onDestroyView pour les fragments ou onDestroy pour les activités).

// Exemple d'utilisation d'une référence faible
private WeakReference<ViewInterface> viewReference;

public void attachView(ViewInterface view) {
    viewReference = new WeakReference<>(view);
}

public void detachView() {
    if (viewReference != null) {
        viewReference.clear();
        viewReference = null;
    }
}

// Dans les méthodes du présentateur :
private ViewInterface getView() {
    return viewReference != null ? viewReference.get() : null;
}

public void updateData(String data) {
    ViewInterface view = getView();
    if (view != null) {
        view.showData(data);
    }
}