05 Base de la conception objet
Il y a 165 millions d'années
Rappellez vous nous avions entamés en cours notre voyage dans le temps pour remonter en plein Mésozoïque et plus particulièrement au jurassique moyen.
Au cours de notre voyage, nous avons rencontré les dinosaures suivants:
Nom | Espèce | Age | |
---|---|---|---|
![]() |
Louis |
Stegosaurus |
12 |
![]() |
Nessie |
Diplodocus |
11 |
Suite à une analyse et une conception (très) poussée nous obtenons le diagramme de classe UML suivant (nous omettons volontairement pour l'instant la visibilité des attributs):
Maintenant que nous avons ce diagramme il convient d'implémenter notre classe Dinosaur via le langage C#.
Création de notre solution
Nous allons créer une solution nommée MesozoicSolution qui contiendra:
- Un projet console: MesozoicConsole,
- Un projet de test unitaire: MesozoicTest.
Vous savez désormais créer une solution contenant ces deux types de projet.
Création de tests
Nous allons toujours adopter l'approche TDD en écrivant d'abord nos tests et ensuite en rédigant notre code qui sera validé par les tests.
Fichier DinosaurTest.cs au sein du projet MesozoicTest
En .NETCore
// Le fichier est ici tronqué et ne fait apparaître que les méthodes de tests
[Fact]
public void TestDinosaurConstructor()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.Equal("Louis", louis.name);
Assert.Equal("Stegosaurus", louis.specie);
Assert.Equal(12, louis.age);
}
[Fact]
public void TestDinosaurRoar()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.Equal("Grrr", louis.roar());
}
[Fact]
public void TestDinosaurSayHello()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.Equal("Je suis Louis le Stegosaurus, j'ai 12 ans.", louis.sayHello());
}
En .Net Framework:
// Le fichier est ici tronqué et ne fait apparaître que les méthodes de tests
[TestMethod]
public void TestDinosaurConstructor()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.AreEqual("Louis", louis.name);
Assert.AreEqual("Stegosaurus", louis.specie);
Assert.AreEqual(12, louis.age);
}
[TestMethod]
public void TestDinosaurRoar()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.AreEqual("Grrr", louis.roar());
}
[TestMethod]
public void TestDinosaurSayHello()
{
Dinosaur louis = new Dinosaur("Louis", "Stegosaurus", 12);
Assert.AreEqual("Je suis Louis le Stegosaurus, j'ai 12 ans.", louis.sayHello());
}
Création du squelette de notre classe
Nous allons créer le squelette de notre classe pour que nous puissions compiler notre projet de test et ... lancer les tests unitaires pardi!
Créer un nouveau Fichier Dinosaur.cs au sein du projet MesozoicConsole (Ajouter > Nouveau Fichier > Fichier de Code Source sous Visual Studio 2017) et conserver le fichier Program.cs
using System;
namespace Mesozoic
{
public class Dinosaur
{
public string name;
public string specie;
public int age;
public Dinosaur(string name, string specie, int age)
{
throw new NotImplementedException();
}
public string sayHello()
{
throw new NotImplementedException();
}
public string roar()
{
throw new NotImplementedException();
}
}
}
À vous de jouer!
- Lancez l'exécution des tests que se passe t'il ?
- Nous avons indiquer que nos méthodes ne sont pas implémentées, il convient donc de les implémenter et de vérifier que nos tests passent au vert.
Visibilités
Accéder directement aux attributs de notre classe peut être un problème, il convient donc d'utiliser le mot clé private
pour modifier la visibilité de nos attributs et de modifier dans un premier temps nos tests puis notre classe pour aboutir à l'implémentation de notre classe UML révisée:
Méthodes manipulant des objets
Nous pouvons implémenter des méthodes qui prennent comme paramètre la référence d'un autre objet, par exemple nous allons ajouter la méthode hug
à nos dinosaures:
La méthode hug
prend en paramètre la référence vers un dinosaure et retourne une chaîne de caractéres.
Son exécution serait:
louis.hug(nessie); // Je suis Louis et je fais un calin à Nessie.
- Quel test devriez vous développer pour tester cette nouvelle méthode ?
- Implémentez cette nouvelle méthode.
- Dans le
main
du fichier Program.cs instanciez plusieurs dinosaures et utilisez leurs différentes méthodes.
Warcraft
Pour la suite de ce TP, nous nous inspirerons de l’univers d’un jeu vidéo bien connu à savoir Warcraft.
Voici quelques unités:
Type | Race | Faction | Hit points | Armor | |
---|---|---|---|---|---|
![]() |
Peasant |
Human |
Alliance |
30 |
0 |
![]() |
Peon |
Orc |
Horde |
30 |
0 |
Ces unités possédent les méthodes suivantes:
sayHello(): string
grunt(): string
talk(): string
talkToPeasant(Peasant peasant): string
-
talkToPeon(Peon, peon): string
-
Quels sont les classes que vous devrez implémenter pour représenter ces unités ?
- Réalisez le schéma UML de ces classes,
- Quels sont les tests à implémenter pour valider le fonctionnement de ces classes ?
- Réalisez l'implémentation des tests puis des classes.
- Créez un
main
dans le fichier Program.cs pour manipuler des instances de ces classes.