Volubis, le forum IBM i Index du Forum Volubis, le forum IBM i
avec les clubs Informatiques IPL et Bretagne.
 
 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

fonctions RPG et modèle MVC

 
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Ponpon



Inscrit le: 15 Fév 2017
Messages: 14

MessagePosté le: Mer 05 Déc 2018, 09:23:02    Sujet du message: Répondre en citant

Bonjour,

Je poste ce message afin d’obtenir des avis et/ou retour d’expériences sur un mode de conception.

Depuis 2 ans, nous sommes en train de moderniser notre ERP : historiquement, il était constitué d’une multitude de petit programmes/modules écrit en RPG. Nous remplaçons au fur et à mesure du temps ces modules par des fonctions de programmes de services écrit en full free, que nous avons conçu en s’inspirant des méthodes de programmation objets et des modèles MVC que l’on rencontre dans d’autres langages tels que PHP, Java etc.

Nous avons par exemple créé un programme de service pour la gestion des colis appelé SRVCOLIS. Celui-ci contient des fonctions de chargement, manipulation des données, et une série de fonctions get et set pour obtenir ou modifier les différents champs du fichier.

Exemple pour une création :

Code:

SRVCOLIS_Inz() ; initialise les champs de la table COLIPF
SRVCOLIS_setREFERENCE(‘COLIS1000’);
SRVCOLIS_setPOIDS(30);

if SRVCOLIS_Ctl();
   SRVCOLIS_Add();
endif;


Exemple pour un affichage dans un écran :

Code:

if SRVCOLIS_LoadByReference(‘COLIS1000’);
   zone écran poidCol=SRVCOLIS_getPOIDS() ;
   zone écran clicol = SRVCOLIS_getCLIENT() ;

endif ;


Nous avons également ajouté dans ces programmes de service des fonctions plus liées aux actions métier (ce qui ne respecte pas tout à fait le modèle MVC évoqué plus haut, car nous avons mélangés le modèle et le contrôleur).

Par exemple, nous avons une fonction AlimenterColis afin d’ajouter des articles dans un colis.

Code:

if SRVCOLIS_LoadByReference(‘COLIS1000’);
   SRVCOLIS_AlimenterColis(pARTICLE, pQUANTITE);

endif;



Nous sommes globalement satisfaits de cette méthode qui a fait ses preuves depuis 2 ans, et l’ensemble de nos nouveaux développements utilisent ce modèle de conception.


Nous rencontrons cependant quelques problématiques : la manipulation de plusieurs « instances » et le passage de paramètres.

1.Instances

Etant donné que nous ne faisons pas vraiment de l’objet, nous ne pouvons avoir qu’une instance chargée à la fois. Si nous voulons par exemple comparer des colis, nous ne pouvons pas faire comme suit :

Code:

if colis1_getCLIENT()=colis2_getCLIENT();
   …
endif;


Nous nous débrouillons donc en sauvegardant certaines données dans des variables intermédiaires et faisons nos comparaisons.

De même, il arrive que dans certains traitements, nous « changions » d’enregistrement chargé au cours de l’appel de la fonction, ce qui nous oblige à recharger l’enregistrement initial.

Code:

if SRVCOLIS_LoadByReference(‘COLIS1000’);
   SRVCOLIS_FusionColis(‘COLIS2000’);   
   //C’est le colis COLIS2000 qui est chargé dans SRVCOLIS pendant l’appel de fonction

   SRVCOLIS_LoadByReference(‘COLIS1000’);
   //On recharge donc le colis initial

endif ;



2.Paramètres

Là encore, ne faisant pas totalement de l’objet, nous ne pouvons passer des « instances » en paramètre. Nous utilisons plusieurs méthodes et n’arrivons pas vraiment à nous décider et choisir quelle est la meilleure solution.

Généralement, nous faisons des passages de paramètres classiques (référence, quantité etc.) et utilisons les mot clés *NOPASS et/ou *OMIT. Nous passons par exemple des identifiant (colis, client) et chargeons les données par les fonctions Load. Ce qui impose d’effectuer ces Load assez régulièrement, et parfois d’en faire plusieurs sur le même identifiant lorsque plusieurs fonctions de ce type sont appelées.

Pour éviter de relire l’enregistrement dans l’appelé ou de passer ses champs en paramètre, nous effectuons les chargements des différents enregistrements en amont et utilisons la fonction du programme de service.

Exemple :
Code:

SRVCOLIS_LoadByReference(‘COLIS1000’);
SRVCLIENT_LoadByNom(‘MAGASIN 1’);

SRVCOLIS_AssocierAuClient();


Dans le code de SRVCOLIS_AssocierAuClient();
Code:

SRVCOLIS_setIDCLIENT(SRVCLIENT_getIDCLIENT());
Callp(e) EditionEtiquette(SRVCLIENT_getNOM():SRVCOLIS_getREFERENCE());


Ce qui nous impose là aussi une attention particulière, car nous devons bien avoir fait les Load nécessaire avant l’appel de la fonction.


Avec toutes ces informations, j’aimerais donc avoir vos points de vue/remarques sur cette méthode.

Merci d’avance.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com

Anti Bot Question MOD - phpBB MOD against Spam Bots