Filtre dans le modèle MVP

Architecture MVP – Présentateurs avec vues filtrées

🎯 Principe

Dans une architecture Modèle-Vue-Présentateur (MVP), un même Modèle peut être partagé entre plusieurs présentateurs, chacun pilotant une Vue distincte.

Chaque Présentateur peut appliquer sa propre logique de filtrage ou de transformation sur les données du modèle, afin d’afficher une perspective adaptée à sa fonction (ex. liste technique, propriétés, résumé, etc.).

✅ Structure recommandée

  • Le Modèle contient toutes les données brutes sans logique de filtrage.
  • Le Présentateur applique un filtre en fonction du type de vue souhaité.
  • La Vue consomme les données filtrées fournies par son présentateur.

💡 Illustration 1 : Présentateurs avec filtres différents

Dans cet exemple, deux vues utilisent le même modèle partagé mais appliquent chacune un filtre spécifique dans leur présentateur.

PROCÉDURE InitialiserFI_Propriete()

// Affectation du modèle partagé aux deux vues
CFIVue_Propriete.gpclPresentation.p_pclModele = gpclPresentation.p_pclModele.p_pclComposant
CFIVue_Test.gpclPresentation.p_pclModele = gpclPresentation.p_pclModele.p_pclComposant

// Application de deux vues différentes
CFIVue_Propriete.gpclPresentation.SetVue(VUE_PROPRIETE)
CFIVue_Test.gpclPresentation.SetVue(VUE_DEFAUT)

Chaque vue dispose de son propre Présentateur qui filtre les champs selon le contexte de la vue :

PROCÉDURE PUBLIQUE p_tabChampSelonVue() : tableau de MVChamp dynamique

tabTous est un tableau de MVChamp dynamique = m_pclModele.p_pclChampListe.p_tabModele

SELON m_eTypeDeVue
    CAS VUE_DEFAUT
        RENVOYER tabTous.Filtre(X => X.p_eType <> MVCHAMP_PROPRIETE)
    CAS VUE_PROPRIETE
        RENVOYER tabTous.Filtre(X => X.p_eType = MVCHAMP_PROPRIETE)
AUTRE CAS
        RENVOYER []
FIN

📌 Illustration 2 : Généralisation du filtre

Pour permettre l’ajout futur de nouveaux types de vues, on peut généraliser la logique de filtrage :

PROCÉDURE PUBLIQUE p_tabChampSelonVue() : tableau de MVChamp dynamique

tabTous est un tableau de MVChamp dynamique = m_pclModele.p_pclChampListe.p_tabModele
filtreChamp est une procédure = Null

SELON m_eTypeDeVue
    CAS VUE_DEFAUT
        filtreChamp = X => X.p_eType <> MVCHAMP_PROPRIETE
    CAS VUE_PROPRIETE
        filtreChamp = X => X.p_eType = MVCHAMP_PROPRIETE
    AUTRE CAS
        filtreChamp = X => Vrai
FIN

RENVOYER tabTous.Filtre(filtreChamp)

🔒 Avantages

  • Le modèle est immuable et peut être réutilisé dans plusieurs contextes.
  • Chaque présentateur contrôle sa propre logique de vue sans impacter les autres.
  • Facilite les tests unitaires sur la logique de présentation.
  • Permet une évolutivité naturelle de l’application.