Middle+
Jakie są wady przechowywania widoku w prezenterze?
sobes.tech AI
Odpowiedź od AI
Utrzymywanie odniesienia do widoku (View) w prezenterze (Presenter) w wzorcu MVP może prowadzić do następujących wad:
- Wycieki pamięci: Jeśli cykl życia widoku jest krótszy niż cykl życia prezenter, a prezenter nadal utrzymuje odniesienie do zniszczonego widoku, dochodzi do wycieku pamięci.
- Silne powiązanie: Prezenter staje się mocno powiązany z konkretną implementacją widoku, co utrudnia testowanie jednostkowe prezenter i jego ponowne użycie z różnymi widokami (np. fragmentami i aktywnościami). Narusza to zasadę "Separation of Concerns".
- Trudności w testowaniu: Aby przetestować prezenter, trzeba tworzyć mocki lub fikcyjne implementacje całego interfejsu widoku, co może być uciążliwe i niejasne.
- Trudności z operacjami asynchronicznymi: Praca z widokiem po zakończeniu operacji asynchronicznej (np. zapytania sieciowego) wymaga dodatkowych sprawdzeń ważności widoku (czy jest podłączony do okna, czy nie został zniszczony), co komplikuje kod.
Dobrą praktyką jest używanie słabych referencji (WeakReference) lub jawne odłączanie widoku od prezentera podczas niszczenia (np. w onDestroyView dla fragmentów lub onDestroy dla aktywności).
// Przykład użycia słabej referencji
private WeakReference<ViewInterface> viewReference;
public void attachView(ViewInterface view) {
viewReference = new WeakReference<>(view);
}
public void detachView() {
if (viewReference != null) {
viewReference.clear();
viewReference = null;
}
}
// W metodach prezentera:
private ViewInterface getView() {
return viewReference != null ? viewReference.get() : null;
}
public void updateData(String data) {
ViewInterface view = getView();
if (view != null) {
view.showData(data);
}
}