E-CLIN-1 : Gestion d’une clinique

:timer_clock: Temps estimé: 3h

Avant de commencer

Créez un projet Java 8 avec maven qui utilise junit.

Si vous avez besoin d’un dépôt privé sur github, vous pouvez en créer un avec ce lien.

Le besoin

Nous avons un réseau de cliniques qui ont besoin d’accueillir et trier des patients.

Les cliniques offrent 2 services : médecin et radiologie.

Selon la clinique, les patients sont affectés au médecin ou à la radiologie selon différents algorithmes. Il en existe présentement 2 :

Concrètement, en java :

public static void main(String[] args) {
    // Ceci n'est pas un test!! C'est un exemple d'utilisation.
    TriageType doctorTriageType = TriageType.FIFO;
    TriageType radiologyTriageType = TriageType.FIFO;

    // Clinic clinic = new Clinic(...)
    // clinic.triagePatient("John", 4, VisibleSymptom.MIGRAINE);
}

Voici aussi le code de base à ajouter :

public enum TriageType {
    FIFO
}

public enum VisibleSymptom {
    COLD,
    FLU,
    EBOLA,
    BROKEN_BONE,
    CHEST_PAIN,
    MIGRAINE,
    SPRAIN
}

Et la coquille vide de la clinique :

public class Clinic {
    public Clinic(...) {
    }

    public void triagePatient(String name, int gravity, VisibleSymptom visibleSymptom) {
        // TODO
    }

    // D'autres méthodes peuvent être nécessaires

}

Pour chaque étape, écrire le code et les tests!

:warning: Les exemples ci-bas sont donnés pour vous aider à comprendre. Ce n’est pas 1 scénario == 1 test unitaire. Il manque des cas, ce n’est pas une liste exhaustive.

Étape 1

Implémenter la logique de la clinique en FIFO.

Exemples :

Scénario: Celui où un patient se présente à la clinique avec une migraine
    Lorsqu'un patient se présente avec MIGRAINE (peu importe la gravité)
    Alors il est le premier dans la file d'attente du médecin
    Et il n'est pas dans la file d'attente de la radiologie

Scénario: Celui où 2 patients se présentent à la clinique
    Étant donné qu'il y a un patient dans la file d'attente du médecin
    Lorsqu'un patient se présente avec FLU (peu importe la gravité)
    Alors il est le deuxième dans la file d'attente du médecin
    Et il n'est pas dans la file d'attente de la radiologie

Scénario: Celui où un patient se présente à la clinique avec une entorse
    Lorsqu'un patient se présente avec SPRAIN (peu importe la gravité)
    Alors il est le premier dans la file d'attente du médecin
    Et il est la première dans la file d'attente de la radiologie

:warning: Il est fort probable que vous ayez à ajouter des méthodes dans la clinique, c’est correct.

Étape 2

:warning: Faire un commit du code après l’étape 1!

Certaines cliniques ont exprimé le besoin que de trier par FIFO n’était pas suffisant. Ils veulent systématiquement mettre en tête de liste tous patients avec une gravité plus grande que 5.

Ceci affecte seulement les médecins, pour le moment le département de radiologie dit ne pas avoir ce besoin.

On ajoute donc la valeur à l’enum :

public enum TriageType {
    FIFO,
    GRAVITY
}
Scénario: Celui où un patient plus prioritaire prend la place du patient déjà présent
    Étant donné qu'il y a un patient dans la file d'attente du médecin
    Et que la clinique trie la file du médecin par GRAVITY
    Lorsqu'un patient se présente avec FLU de gravité 7
    Alors il est le premier dans la file d'attente du médecin

Scénario: Celui où un patient plus prioritaire a besoin de radiologie
    Étant donné qu'il y a un patient dans la file d'attente du médecin
    Étant donné qu'il y a un patient dans la file d'attente de la radiologie
    Et que la clinique trie la file du médecin par GRAVITY
    Lorsqu'un patient se présente avec BROKEN_BONE de gravité 7
    Alors il est le deuxième dans la file d'attente de la radiologie

:warning: Attention! Les scénarios de l’étape 1 doivent encore fonctionner. Traiter par FIFO ou GRAVITY dépend de la clinique. Hint: Ce “comportement” est donc passé dans le constructeur de la clinique d’une façon où d’une autre.

Étape 3

:warning: Faire un commit du code après l’étape 2!

Surprise! Le département de radiologie d’une certaine clinique est jaloux. On doit donc traiter la file d’attente de la radiologie de la même façon.

Scénario: Celui où un patient plus prioritaire arrive en radiologie
    Étant donné qu'il y a un patient dans la file d'attente du médecin
    Étant donné qu'il y a un patient dans la file d'attente de la radiologie
    Et que la clinique trie la file du médecin par GRAVITY
    Et que la clinique trie la file de radiologie par GRAVITY
    Lorsqu'un patient se présente avec BROKEN_BONE de gravité 7
    Alors il est le premier dans la file d'attente de la radiologie

:question: Combien de lignes ont dû être modifiées? Vous pouvez le voir avec git diff HEAD --stat. Qu’en pensez-vous?

Étape 4

:warning: Faire un commit du code après l’étape 3!

On doit maintenant supporter aussi les centres communautaires (anciennement CLSC) de la région. Ceux-ci offrent seulement un service d’infirmière-er. Par contre, selon le centre, ceux-ci désirent traiter les patients en ordre d’arrivée ou par gravité, tout comme les cliniques.

On a donc besoin de compléter cette coquille :

public class CommunityCenter {
    public CommunityCenter(...) {
    }

    public void triagePatient(String name, int gravity) {
        // TODO
    }
}

:question: Combien de lignes ont dû être modifiées? Vous pouvez le voir avec git diff HEAD --stat. Qu’en pensez-vous?

:question: Combien de comportements possède la classe Clinic? Combien de tests y a-t-il? Est-ce le même nombre? Commentez.

Étape 5

:warning: Faire un commit du code après l’étape 3!

Bon, comme toute bonne chose, certains patients abusent de notre réseau de cliniques!

Afin d’améliorer les services, les cliniques et les centres communautaires ont décidé de ne plus traiter les patients avec gravity == 1. On les ignore tout simplement dans notre cas.

Ajoutez tous les tests qui permettent de vérifier cela pour les médecins, la radiologie et les infirmi(ères,ers).

:question: Combien de tests avez-vous ajoutés? Versus combien de ligne de code de production? Pourquoi?

Solutions

Aucune solution ne sera donnée.