Allez, c’est parti pour la correction.
Tout d’abord, nous devons créer notre simulateur météo. Il sera représenté par une classe :
Code : C# | public class SimulateurMeteo
{
}
|
Nous aurons également besoin de quelque chose pour représenter le temps, soleil, nuage, pluie et orage. Une énumération semble appropriée :
Code : C# | public enum Temps
{
Soleil,
Nuage,
Pluie,
Orage
}
|
Enfin, nous aurons notre statisticien :
Code : C# | public class Statisticien
{
}
|
Commençons par le simulateur de météo. Nous aurons besoin de plusieurs variables membres afin de stocker notre générateur de nombre aléatoires, le dernier temps qu’il a fait et le nombre de répétitions.
Le nombre de répétitions pourra être un paramètre du constructeur :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13 | public class SimulateurMeteo
{
private Temps? ancienTemps;
private int nombreDeRepetitions;
private Random random;
public SimulateurMeteo(int nombre)
{
random = new Random();
ancienTemps = null;
nombreDeRepetitions = nombre;
}
}
|
Étant donné que nous allons déterminer plusieurs nombres aléatoires, il est pertinent de ne pas ré-allouer à chaque fois le générateur de nombre aléatoire. C’est pour cela qu’on le crée une unique fois dans le constructeur de la classe.
Créons désormais une méthode permettant de démarrer le simulateur et codons les règles métiers du simulateur :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | public class SimulateurMeteo
{
//[…] Code supprimé pour plus de clarté […]
public void Demarrer()
{
for (int i = 0; i < nombreDeRepetitions; i++)
{
int valeur = random.Next(0, 100);
if (valeur < 5)
GererTemps(Temps.Soleil);
else
{
if (valeur < 50)
GererTemps(Temps.Nuage);
else
{
if (valeur < 90)
GererTemps(Temps.Pluie);
else
GererTemps(Temps.Orage);
}
}
}
}
}
|
C’est très simple, on boucle sur le nombre de répétitions. Un nombre aléatoire est déterminé à chaque itération. La méthode
GererTemps prend en paramètre le temps déterminé à partir du nombre aléatoire.
C’est cette méthode
GererTemps qui aura pour but de lever un événement quand le temps change :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | public class SimulateurMeteo
{
public delegate void IlFaitBeauDelegate(Temps temps);
public event IlFaitBeauDelegate QuandLeTempsChange;
// […] Code supprimé pour plus de clarté […]
private void GererTemps(Temps temps)
{
if (ancienTemps.HasValue && ancienTemps.Value != temps && QuandLeTempsChange != null)
QuandLeTempsChange(temps);
ancienTemps = temps;
}
}
|
Ici, j’ai choisi de créer un seul événement quand le temps change et de lui indiquer le temps qu’il fait en paramètres.
Nous avons donc besoin d’un délégué qui prend un
Temps en paramètres et qui ne renvoie rien. (C’est d’ailleurs souvent le cas des événements). Puis nous avons besoin d’un événement du type du délégué.
Ensuite, si le temps a changé et que quelqu’un s’est abonné à l’événement, alors nous levons l’événement.
Il ne reste plus qu’à remplir notre classe
Statisticien. Cette classe a besoin de travailler sur une instance de la classe
SimulateurMeteo, nous pouvons donc lui en passer une dans les paramètres du constructeur. Nous utiliserons également des variables membres privées permettant de stocker ses analyses :
Code : C# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | public class Statisticien
{
private SimulateurMeteo simulateurMeteo;
private int nombreDeFoisOuLeTempsAChange;
private int nombreDeFoisOuIlAFaitSoleil;
public Statisticien(SimulateurMeteo simulateur)
{
simulateurMeteo = simulateur;
nombreDeFoisOuLeTempsAChange = 0;
nombreDeFoisOuIlAFaitSoleil = 0;
}
public void DemarrerAnalyse()
{
simulateurMeteo.QuandLeTempsChange += simulateurMeteo_QuandLeTempsChange;
simulateurMeteo.Demarrer();
}
public void AfficherRapport()
{
Console.WriteLine("Nombre de fois où le temps a changé : " + nombreDeFoisOuLeTempsAChange);
Console.WriteLine("Nombre de fois où il a fait soleil : " + nombreDeFoisOuIlAFaitSoleil);
Console.WriteLine("Pourcentage de beau temps : " + nombreDeFoisOuIlAFaitSoleil * 100 / nombreDeFoisOuLeTempsAChange + " %");
}
private void simulateurMeteo_QuandLeTempsChange(Temps temps)
{
if (temps == Temps.Soleil)
nombreDeFoisOuIlAFaitSoleil++;
nombreDeFoisOuLeTempsAChange++;
}
}
|
Notons que dans la méthode
DemarrerAnalyse, nous nous abonnons à l’événement de changement de temps. La méthode qui est appelée lors de la notification est très simple, elle incrémente les compteurs.
Enfin, l’affichage du rapport est trivial. Ici, comme nous n’avons que des entiers, la division produira un entier également.
Il ne reste plus qu’à faire fonctionner nos objets :
Code : C# | class Program
{
static void Main(string[] args)
{
SimulateurMeteo simulateurMeteo = new SimulateurMeteo(1000);
Statisticien statisticien = new Statisticien(simulateurMeteo);
statisticien.DemarrerAnalyse();
statisticien.AfficherRapport();
}
}
|
Ici, je travaille sur 1000 répétitions.
Lorsque j’exécute l’application, j’obtiens :
Évidemment, vu que nous travaillons avec des nombres aléatoires, chacun aura un résultat différent.
Et voilà, c’est terminé pour ce TP. Notre application est fonctionnelle …
Terminé ? mmmhhh … pas tout à fait, allons un peu plus loin.