Bonsoir,
Depuis quelques semaines je m'intéresse à la POO afin de structurer mon projet, séparer les couches UI/Métier, etc.
Selon ma logique et après pas mal de recherche, je souhaiterais partir sur l'architecture suivante : Fenêtre <-> Classe Contrôleur/Presentation propre à ma fenêtre <-> Classes modèles mappées sur mes fichiers de données <-> BDD
Question préalable : Est-ce bien une architecture MVP ? J'ai analysé en profondeur les deux exemples fournis par PCSOFT MVP1/MVP2. Cela ressemble à ça, sauf qu'eux passent les couches présentations en paramètre dans les fenêtres et travaillent pratiquement qu'en mémoire, pas de rafraîchissement de tables etc. Moi je souhaite passer les ID dans mes fenêtres afin d'actualiser les données, recharger mes tables afin d'avoir des données toujours à jour (dans le cas où d'autres utilisateurs auraient modifiés des données entre temps etc.)
Cas concret : (J'ai pris cet exemple là afin d'avoir un exemple concret, je réutiliserais le même principe pour mes autres fenêtres)
J'ai une table société, une table société_probleme, une table probleme_contact et une table contact. Je m'intéresse à la partie Societe_Probleme, Probleme_Contact. Pour un problème donné, je peux associer plusieurs contacts à ce problème. J'ai donc :
J'ai généré mes classes MProbleme, MProbleme_Contact et MContact
Classe MProbleme :
Possède la méthode ChargeElement pour charger le problème, les méthodes d'enregistrement etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 MProbleme est une Classe <MAPPING=Societe_Probleme> hérite de MBase <MAPPING> m_nPBid est un entier sur 8 octets <MAPPING=DRPBid> m_nPBcode est un entier sans signe sur 4 octets <MAPPING=DRPBcode, clé unique> m_nPBnom est une chaine <MAPPING=PBnom> m_sPBdescript est une chaîne ANSI <MAPPING=DRPBdescript> m_dPBdate est une Date <MAPPING=DRPBdate> <FIN> m_tabProblemeContact est un tableau de MProbleme_Contact dynamique //Dois-je déclarer ici le tableau ? (Plusieurs contacts sont associés au problème) FIN
Classe MProbleme_Contact :
Possède la méthode : tabCharge qui renvoie un tableau de contact pour un problème donné
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 MProbleme_Contact est une Classe <MAPPING=Probleme_Contact> hérite de MBase <MAPPING> m_nPBCONTid est un entier <MAPPING=PBCONTid, clé unique> m_nPBcode est un entier <MAPPING=PBcode> m_nCONTcode est un entier <MAPPING=CONTcode> m_sPBCONTcom est une chaine <MAPPING=PBCONTcom> <FIN> m_pclContact est un MContact dynamique FIN
J'ai également créé une classe PFicheProbleme qui gère les actions des utilisateurs sur la fenêtre, initialise les données en appelant les méthodes des classes MProbleme et MProbleme_Contact etc.
Classe Controleur/Présentation PFicheProbleme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 PFicheProbleme est une Classe m_pclProbleme est un MProbleme dynamique <associé> //classe Problème, possède un tuple tableau contact m_pclProblemeContact est un MProbleme_Contact dynamique //Élément courant du tableau Contact FIN Constructeur(PBcode) m_pclProbleme <- allouer un MProbleme(PBcode) m_pclProblemeContact <- allouer un MProblemeContact(PBcode) Méthode ChargeProbleme // qui va appeler la méthode de la classe MProbleme : Si m_pclProbleme.bHChargeElement()=faux alors erreurdéclenche(2,...) renvoyer faux fin demandemiseajourui() renvoyer vrai Méthode ChargeTableProblemeContact // qui va remplir mon tableau de mon objet à partir de la méthode de la classe MProblemeContact m_pclProbleme.m_tabProblemeContact = m_pclProblemeContact.tabCharge() demandemiseajourui("CONTACT")
Maintenant mes questions concernant tout ça :
Q1) Déjà est-ce que la façon de faire est bonne, propre ?
Q2) Dois-je déclarer le tableau : m_tabProblemeContact est un tableau de MProbleme_Contact dynamique directement dans ma classe MProbleme comme j'ai fait OU alors le déclarer dans ma classe présentation PFicheProbleme et le remplir indépendamment de mon objet Probleme ? (Ligne en rouge dans mon exemple)
Q3) Si je conserve "m_tabProblemeContact est un tableau de MProbleme_Contact dynamique" dans ma classe MProbleme. Est-ce que je dois créer dans ma classe MProbleme une méthode "ChargeTableauProblemeContact" qui va exécuter la méthode TabCharge (Renvoie un tableau) de ma classe MProbleme_Contact afin de remplir le tableau ? Ou alors j'appelle directement ma méthode TabCharge depuis ma classe Présentation PFicheProbleme comme j'ai fait dans mon exemple ci-dessus (Code en vert)
Q4) Dans le cas concret que j'ai exposé ci-dessus, si je veux ajouter une ligne à mon tableau m_tabProblemeContact de ma classe MProbleme (tableau de MProblemeContact) , où dois-je écrire cette méthode ?
- Dans ma classe Présentation ?
- Dans ma classe MProblemeContact (où j'ai la méthode pour me renvoyer un tableau) en passant mon tableau en paramètre de ma méthode ? Dans ce cas, je dois appeler la méthode à partir de ma classe présentation ? Ou je dois dans ma classe MProbleme écrire aussi une méthode "Ajouter Ligne" qui va chercher la méthode dans MProblemeContact afin d'ajouter la ligne à son propre tableau membre ?
- Ou alors créer une classe indépendante "tableau" de Probleme_Contact :
avec les méthodes de chargement, d'ajout, modification, et suppression de ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 MTableauProbleme_Contact est une classe m_tabProblemeContact est un tableau de MProbleme_Contact dynamique
et ainsi remplacer dans ma classe MProbleme : "m_tabProblemeContact est un tableau de MProbleme_Contact dynamique" PAR "m_pclProblemeContact est un MTableauProbleme_Contact dynamique" et utiliser directement les méthodes de cette classe pour charger mon tableau, ajouter ligne etc
J'espère m'être fait comprendre, pas facile à l'écrit
Merci d'avance à ceux qui prendront le temps de m'aider ou me donner leur avis
Bonne soirée,
Esteban
Partager