Sobes.tech
Middle+

¿Cuáles son las desventajas de guardar la vista en el presentador?

sobes.tech AI

Respuesta de la IA

Mantener una referencia a la vista (View) en el presentador (Presenter) en el patrón MVP puede llevar a las siguientes desventajas:

  1. Fugas de memoria: Si el ciclo de vida de la vista es más corto que el del presentador, y este último sigue manteniendo una referencia a la vista destruida, se produce una fuga de memoria.
  2. Alta acoplamiento: El presentador se vuelve estrechamente acoplado a una implementación concreta de la vista, lo que dificulta las pruebas unitarias del presentador y su reutilización con diferentes vistas (por ejemplo, con fragmentos y actividades). Se viola el principio de "Separación de Responsabilidades".
  3. Dificultad en las pruebas: Para probar el presentador, es necesario hacer mocks o crear implementaciones ficticias de toda la interfaz de la vista, lo cual puede ser engorroso y poco claro.
  4. Dificultad con operaciones asíncronas: Trabajar con la vista después de completar una operación asíncrona (por ejemplo, una solicitud de red) requiere verificaciones adicionales de la validez de la vista (si está adjunta a la ventana, si no ha sido destruida), lo que complica el código.

Una buena práctica es usar referencias débiles (WeakReference) o desvincular explícitamente la vista del presentador al destruirla (por ejemplo, en onDestroyView para fragmentos o onDestroy para actividades).

// Ejemplo de uso de referencia débil
private WeakReference<ViewInterface> viewReference;

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

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

// En los métodos del presentador:
private ViewInterface getView() {
    return viewReference != null ? viewReference.get() : null;
}

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