🎯 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.