Bonjour,
Je vous sollicite sur une question de bonnes pratiques concernant la POO.
J'utilise le mapping objet avec databinding sur les champs. J'ai donc pour chacun de mes fichiers de l'analyse une classe mappée. (Je n'utilise pas de couches présentations, donc pas de MVP)
Pour l'exemple, imaginons que j'ai une table dans l'analyse "Offre" contenant une rubrique PrixAchat, une rubrique PrixVente et une rubrique Marge. J'ai donc ma classe générée :
J'ai ensuite une fenêtre avec 3 champs. Dans l'initialisation de la fenêtre, j'initialise mon objet. gpclOffre est un MOffre dynamique <- allouer un MOffre(Id)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 MOffre est une classe <MAPPING=Offre> <MAPPING> m_nIDOffre est un entier sur 8 octets <MAPPING=IDOffre,clé unique> m_moPrixAchat est un monétaire <MAPPING=PrixAchat> m_moPrixVente est un monétaire <MAPPING=PrixVente> m_rMarge est un réel <MAPPING=Marge> </MAPPING>
- Champ SAI_PrixAchat (databindé sur gpclOffre.m_moPrixAchat)
- Champ SAI_PrixVente (databindé sur gpclOffre.m_moPrixVente)
- Champ SAI_Marge (databindé sur gpclOffre.m_rMarge et à calculer en temps réel lors de la modification des champs prix d'achat ou du prix de vente)
Ma question porte sur la méthode à utiliser pour calculer et mettre à jour le champ Marge à chaque modification des champs SAI_PrixAchat ou SAI_PrixVente. Comment doit-je m'y prendre ?
Méthode 1) Dans l'événement "A chaque modification" du champ SAI_PrixAchat ajouter le code : "gpclOffre.m_moPrixAchat = MoiMême" et dans le champ SAI_PrixVente ajouter le code "gpclOffre.m_moPrixVente=MoiMême" afin d'avoir mes membres à jour dans mon objet ? Et après ces codes appeler une méthode "CalculerMarge" de ma classe mappée MOffre :
Et ensuite faire un SourceVersEcran() afin de rafraichir ma vue ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PROCEDURE CalculerMarge() :m_rMarge = :m_moPrixVente - :m_moPrixAchat
Méthode 2) Ou ne pas tenir compte des membres dans ma procédure et utiliser :
Et dans les codes "A chaque modification" de mes champs SAI_PrixAchat et SAI_PrixVente faire SAI_Marge = gpclOffre.CalculerMarge(SAI_PrixAchat, SAI_PrixVente) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PROCEDURE CalculerMarge(PrixAchat est un numérique, PrixVente est un numérique) renvoyer PrixVente - PrixAchat
Ici, je perd l'intérêt du databinding, et ma méthode CalculerMarge ne tient pas compte des membres de ma classe mappée, donc je ne suis pas sur que cela soit la meilleur solution.
Je pourrais éventuellement créé la méthode ci-dessus dans une classe globale et ajouter ensuite une autre méthode (CalculerMargeOffre) dans ma classe mappé MOffre qui va appeler la méthode globale :m_rMarge = CGlobal.CalculerMarge(:m_moPrixVente,:m_moPrixAchat), mais cela revient au même que la méthode 1 vu qu'il faut que mes membres soient à jour dans mon objet.
Méthode 3) Créer la méthode ci-dessus dans une classe globale CGlobal en tant que méthode globale et appeler directement cette méthode à chaque modification des champs SAI_PrixAchat et SAI_PrixVente ? SAI_Marge = CGlobal.CalculerMarge(SAI_PrixAchat,SAI_PrixVente) et donc ne pas avoir de méthode dans ma classe MOffre ?
Qu'en pensez-vous ? Comment feriez-vous ?
Autres questions que je me pose en terme de bonnes pratiques et qui sont liées à ma question ci-dessus :
Q1) Affecter directement un membre PUBLIQUE d'un objet avec les données saisies dans un champ est-il autorisé, propre ? (Ex gpclOffre.m_moPrixAchat = SAI_PrixAchat). Ou il faudrait que j'ajoute des SETTER sur chaque membre de ma classe MOffre et dans mon code faire "gpclOffre.SETprixAchat = SAI_PrixAchat" à la place de "gpclOffre.m_moPrixAchat = SAI_PrixAchat" ? Sachant que mes membres sont PUBLIQUES donc directement accessibles dans mes fenêtres, il y a t-il une différence entre affecter directement les membres publiques ou utiliser des setter pour affecter ?
Q2) Faut-il mettre à jour en temps réel les membres des classes databindés, donc avoir dans l'événement "A chaque modification" de chaque champ de saisie "MonObjet.MonMembreDatabindé = MoiMême" OU alors mettre à jour qu'à la fin en utilisant EcranVersSource() ?
Merci d'avance,
Cordialement
Partager