271
Modélisation, Architectures logicielles et matérielles / Re : Modélisation logicielle d'un réseau - le système de Pierre59
« le: juin 16, 2015, 05:23:56 pm »
Bonjour
J'en remet une couche (d'objets), voici un squelette d'itinéraire.
Il faut d'abord quelque classes accessoires :
class Zone {
boolean etat; // etat de la Zone (libre ou occupee)
public:
boolean libre() { return !etat; }
};
class Aiguille {
public:
boolean directer() { /* commande de l'aiguille */ return true; }
boolean devier() { /* commande de l'aiguille */ return true; }
};
class Signal {
public:
boolean ouvrir() { /* commande du signal */ return true; }
boolean fermer() { /* commande du signal */ return true; }
} ;
Puis quelques variables :
TB iTB; TD iTD; BT iBT; DT iDT; // itineraires
Zone za,zb,zc; // zones
Aiguille a1,a2,a3; // aiguilles
Signal s1,s2,s3; // signaux
La classe de base "Itineraire" contient tout ce qui est commun à tous les itinéraires :
class Itineraire { // classe de base des itineraires
byte etat; // l'etat de l'itineraire (libre, en attente, forme, ... )
public:
boolean libre() { return etat==0; }
boolean formation() { if (formable()) return former(); else return false; }
boolean destruction() { if (deformable()) return deformer(); else return false; }
protected:
virtual boolean formable();
virtual boolean former();
virtual boolean deformable();
virtual boolean deformer();
// methodes utilitaires
protected:
boolean libre(Zone &a) { return a.libre(); }
boolean libres(Zone &a,Zone &b) { return a.libre() && b.libre(); }
boolean libres(Zone &a,Zone &b,Zone &c) { return a.libre() && b.libre()&& c.libre(); }
boolean libres(Zone &a,Zone &b,Zone &c,Zone &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
// ...
boolean libre(Itineraire &a) { return a.libre();
boolean libres(Itineraire &a,Itineraire &b) { return a.libre() && b.libre(); }
boolean libres(Itineraire &a,Itineraire &b,Itineraire &c) { return a.libre() && b.libre()&& c.libre(); }
boolean libres(Itineraire &a,Itineraire &b,Itineraire &c,Itineraire &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
// ...
};
Les méthodes formation() et deformation() permettent de former et de détruire l'itinéraire (elles peuvent êtres enrichies si nécessaire). Elles peuvent êtres appellées par les boutons de commande et/ou par d'autres objets (Zone par exemple) pour des destructions automatiques.
Les méthodes formable(), former(), deformable() et deformer() sont propres à un itinéraire particulier, elles seront définies dans des classes dérivées, une par itinéraire (c'est pour cela qu'elles sont marquées virtuelles).
Les méthodes libre(s)(…) sont des méthodes utilitaires pour faciliter l'écriture des méthodes précédentes. Pour ne pas faire de copies inutiles les objets sont appelés par référence. (on peut aussi utiliser des méthodes avec un nombre d'arguments variables).
Voici pour finir un exemple d'itinéraire particulier (une des classes correspondant à chaque itinéraire) :
class TC:public Itineraire { // un itineraire particulier de T vers C
virtual boolean formable() { return
libres(iTB,iTD,iBT,iDT) && // enclanchements entre itineraires
libres(za,zb,zc); // enclanchements sur les zones
}
virtual boolean former() { return a1.devier() && a2.directer() && s1.ouvrir(); }
virtual boolean deformable() { return libres(za,zb,zc); }
virtual boolean deformer() { return s1.fermer(); }
};
La méthode formable() gère les enclanchements.
La méthode former() établit l'itinéraire en positionnant les aiguilles et en ouvrant le signal.
La méthode deformable() s'assure que l'itinéraire peut être détruit.
La méthode deformer() ferme le signal.
Bien sur d'autres tests et d'autres actions peuvent êtres ajoutées dans ces méthodes.
Vous voyez ce n'est pas si compliqué que cela, il faut bien entendu écrire toutes les classes itinéraire particulier, mais c'est assez répétitif.
Il est facile de modifier des itinéraires d'ajouter des itinéraires …
Il est facile de faire la mise au point avec des affichages sur le moniteur série.
Bon courage !
Pierre
J'en remet une couche (d'objets), voici un squelette d'itinéraire.
Il faut d'abord quelque classes accessoires :
class Zone {
boolean etat; // etat de la Zone (libre ou occupee)
public:
boolean libre() { return !etat; }
};
class Aiguille {
public:
boolean directer() { /* commande de l'aiguille */ return true; }
boolean devier() { /* commande de l'aiguille */ return true; }
};
class Signal {
public:
boolean ouvrir() { /* commande du signal */ return true; }
boolean fermer() { /* commande du signal */ return true; }
} ;
Puis quelques variables :
TB iTB; TD iTD; BT iBT; DT iDT; // itineraires
Zone za,zb,zc; // zones
Aiguille a1,a2,a3; // aiguilles
Signal s1,s2,s3; // signaux
La classe de base "Itineraire" contient tout ce qui est commun à tous les itinéraires :
class Itineraire { // classe de base des itineraires
byte etat; // l'etat de l'itineraire (libre, en attente, forme, ... )
public:
boolean libre() { return etat==0; }
boolean formation() { if (formable()) return former(); else return false; }
boolean destruction() { if (deformable()) return deformer(); else return false; }
protected:
virtual boolean formable();
virtual boolean former();
virtual boolean deformable();
virtual boolean deformer();
// methodes utilitaires
protected:
boolean libre(Zone &a) { return a.libre(); }
boolean libres(Zone &a,Zone &b) { return a.libre() && b.libre(); }
boolean libres(Zone &a,Zone &b,Zone &c) { return a.libre() && b.libre()&& c.libre(); }
boolean libres(Zone &a,Zone &b,Zone &c,Zone &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
// ...
boolean libre(Itineraire &a) { return a.libre();
boolean libres(Itineraire &a,Itineraire &b) { return a.libre() && b.libre(); }
boolean libres(Itineraire &a,Itineraire &b,Itineraire &c) { return a.libre() && b.libre()&& c.libre(); }
boolean libres(Itineraire &a,Itineraire &b,Itineraire &c,Itineraire &d) { return a.libre() && b.libre() && c.libre() && d.libre(); }
// ...
};
Les méthodes formation() et deformation() permettent de former et de détruire l'itinéraire (elles peuvent êtres enrichies si nécessaire). Elles peuvent êtres appellées par les boutons de commande et/ou par d'autres objets (Zone par exemple) pour des destructions automatiques.
Les méthodes formable(), former(), deformable() et deformer() sont propres à un itinéraire particulier, elles seront définies dans des classes dérivées, une par itinéraire (c'est pour cela qu'elles sont marquées virtuelles).
Les méthodes libre(s)(…) sont des méthodes utilitaires pour faciliter l'écriture des méthodes précédentes. Pour ne pas faire de copies inutiles les objets sont appelés par référence. (on peut aussi utiliser des méthodes avec un nombre d'arguments variables).
Voici pour finir un exemple d'itinéraire particulier (une des classes correspondant à chaque itinéraire) :
class TC:public Itineraire { // un itineraire particulier de T vers C
virtual boolean formable() { return
libres(iTB,iTD,iBT,iDT) && // enclanchements entre itineraires
libres(za,zb,zc); // enclanchements sur les zones
}
virtual boolean former() { return a1.devier() && a2.directer() && s1.ouvrir(); }
virtual boolean deformable() { return libres(za,zb,zc); }
virtual boolean deformer() { return s1.fermer(); }
};
La méthode formable() gère les enclanchements.
La méthode former() établit l'itinéraire en positionnant les aiguilles et en ouvrant le signal.
La méthode deformable() s'assure que l'itinéraire peut être détruit.
La méthode deformer() ferme le signal.
Bien sur d'autres tests et d'autres actions peuvent êtres ajoutées dans ces méthodes.
Vous voyez ce n'est pas si compliqué que cela, il faut bien entendu écrire toutes les classes itinéraire particulier, mais c'est assez répétitif.
Il est facile de modifier des itinéraires d'ajouter des itinéraires …
Il est facile de faire la mise au point avec des affichages sur le moniteur série.
Bon courage !
Pierre