DY

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):

Dinosaur UML class diagram
Diagramme UML de classe pour nos dinosaures

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:

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!
  1. Lancez l'exécution des tests que se passe t'il ?
  2. 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:

Full Dinosaur UML class diagram
Diagramme UML de classe pour nos dinosaures
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:

Hug Dinosaur UML class diagram
Diagramme UML de classe pour 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.
  1. Quel test devriez vous développer pour tester cette nouvelle méthode ?
  2. Implémentez cette nouvelle méthode.
  3. 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: