4
« le: mai 31, 2015, 11:28:07 am »
Bonjour
Je voudrais monter ici une approche objet de la modélisation logicielle d'un réseau.
Mon réseau est constitué d'un ovale à double voie sur lequel il y a une coulisse et une gare moyenne. Cette gare comporte plusieurs voies à quai, une partie marchandises et un dépot, de la gare part aussi une voie unique finissant à une petite gare terminus.
Le réseau comporte une trentaine d'aiguilles, une trentaine de zones et une dizaine de cantons.
Le réseau est géré par un très gros programme sur PC. Une dizaine de cartes électroniques sur deux bus I2C font l'interface entre le PC et le réseau.
Le programme sur PC comporte plusieurs parties :
- une partie de gestion des cartes électroniques (rétrosignalisation, souris, commandes des alimentations, des aiguilles, des signaux …)
- une partie de gestion de TCOs sur l'écran du PC (il pourrait avoir un TCO réel)
- une grosse partie de gestion du fonctionnement du réseau, cette partie reçoit toutes les infos du réseau (rétrosignalisation …) et toutes les commandes des utilisateurs (souris, itinéraires, …), elle sait ainsi toujours ce qui se passe sur le réseau. Cette partie est réalisée en programmation objet et ne comporte pas de tables, la description du réseau se fait par les liens entre les objets et les méthodes (fonctions) de ces objets.
Je vais essayer de décrire les principales classes et leur fonctionnement en détaillant un peu plus la classe Zone. Mes classes sont en Java mais je vais essayer de les présenter à la C++ (longtemps que je n'ai pas fait de C++ objet).
La classe essentielle est la classe Zone :
class Zone {
String nom;
boolean etat; // libre ou occupé
Train train; // le train dans la zone
Signal signalPair,signalImpair; // les signaux éventuels de la zone
Zone(…) {…} // constructeur
virtual Zone suivantePaire(); // la zone suivante paire (éventuellement vide)
virtual Zone suvanteImpaire(); // la zone suivante impaire (éventuellement vide)
virtual void actions(); // les actions spécifiques à faire en cas d'occupation
virtual void desactions(); // les actions spécifiques à faire en cas de libération
boolean occupee() { return etat; } // méthode utilitaire
boolean libre() { return !etat; } // méthode utilitaire
void occuper() { // appelée par la rétrosignalisation
// fait tout ce qu'il y a à faire en cas d'occupation (actions communes à toutes les zones)
actions(); // fait les actions spécifiques à une zone
}
void liberer() { // appelée par la rétrosignalisation
// fait tout ce qu'il y a à faire en cas de libération (actions communes à toutes les zones)
desactions(); // fait les actions spécifiques à une zone
}
}
chaque zone réelle fait l'objet d'une classe héritant de la classe Zone, voici un exemple :
class Z9 : Zone { // héritage de Zone
Z9(…) {…} // constructeur
void actions() { aubiner(c3,c5); } // fermeture de signaux (occupation)
void desactions() { detruire(XA,XB,XC); } // destruction d'itinéraires (liberation)
Zone suivantePaire() { return z11; } // la zone paire suivante (toujours la meme)
Zone suivantePaire() { if (a3.directe()) return z9; else return z7; } // la zone impaire suivante (dépends de la position de l'aiguille a3)
}
Ces classes zones décrivent la géométrie du réseau et les interactions entre les différentes parties. Elles précisent les liens entre les zones (de façon dynamique en fonction de la position réelle des aiguilles), l'emplacement des signaux, … Tout le réseau est ainsi décrit.
Les autres classes principales s'articulent autour des zones :
- la classe signal gère les signaux (lumineux et mécaniques), elle calcule les feux en fonction des occupations de zones, des signaux adjacents et de la position des aiguilles, elle fait le cantonnement pour les parties du réseau qui en sont équipées) et commandes les signaux.
- la classe Aiguille garde la position d'une l'aiguille et fait l'interface avec l'électronique pour les commandes
- la classe Train mémorise les informations sur un train ( sens, vitesse, nom de l'engin moteur, adresse DCC, …)
- la classe Itineraire réalise les itinéraires (une centaine), elle fait les enclanchements entre itinéraires, la mémorisation/création/destruction des itinéraires. Elle est organisée comme la classe Zone, la classe Itineraire contient tout ce qui est commun à tous les itinéraires, des classes (héritant de la classe Itineraire) contenant les parties spécifiques.
Cette programmation objet bien que assez technique est très puissante, elle peut gérer des petits ou grands réseaux,, elle évite les tables (avec leur problèmes de construction/mise à jour, …), elle facilite grandement des modification ponctuelles du réseau (seules quelques classes sont à modifier ou à créer) et facilite la mise au point au début. Elle nécessite un processeur assez puissant. Du point de vue allocation mémoire les objets sont tous crées à l'initialisation du programme, l'accroissement des variables est linéaire avec l'accroissement du réseau.
Cette programmation n'évite pas (comme avec d'autres types de programmations) les problèmes de synchronisation dans le cas de fonctionnement multi-tâches et/ou de programmation évenementielle (sur interruptions).
Voila, n'hésitez pas à poser des questions, et franchissez le pas de la programmation objet (voir les cours sur les objets et l'héritage dans une autre partie du site)
Pierre