GLO-4002 - Site du cours 2023

Temps estimé: 1 heure à 2 heures

Devoir 1 : Gestion d'une clinique

Avant de commencer

Créer un projet Java de base. Vous pouvez vous inspirer de la structure du TP de début de session.

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.

Chaque clinique a sa propre façon de trier les patients et ceux-ci sont affectés au médecin ou à la radiologie selon différents algorithmes. En termes concret, chaque clinique (e.g. dans le constructeur) reçoit en paramètre 1 algorithme pour la file du médecin et un pour la file de radiologie. Il en existe présentement 2 :

  • En ordre d'arrivé (FIFO = premier arrivé, premier servi)
  • Selon la gravité de l'état. Si un patient a une gravité > 5, alors il est automatiquement assigné comme le plus prioritaire de la clinique (index=0).

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(doctorTriageType, radiologyTriageType /* , ... */)
   // 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,
    CORONAVIRUS
}

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!

⚠️ 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.

  • Les patients sont toujours assignés pour voir le médecin (premier arrivé, premier servi).
  • Si le symptôme est BROKEN_BONE ou SPRAIN, alors le patient est également mis dans la file d'attente pour la radiologie (c'est une file d'attente différente)

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

⚠️ Il est fort probable que vous ayez à ajouter des méthodes dans la clinique, c'est correct.

Note sur les scénarios: Certains auront peut-être reconnu la syntax gherkin dans laquelle ces scénarios sont écrit. Sachez simplement que ce sont des EXEMPLES seulement. Par exemple, le premier exemple suppose une clinique vide, donc un patient qui aurait une migraine serait le premier dans la file d'attente. Il ne faut pas le lire à l'envers: il est faux de dire qu'un patient avec une migraine est toujours le premier.

Étape 2

⚠️ 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

⚠️ 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

⚠️ 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

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

Étape 4

⚠️ 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
    }
}

Réflexions

Vous n'avez pas à remettre les réponses à ces questions, mais nous vous conseillons fortement de questionner votre code avec celles-ci.

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

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

Étape 5

⚠️ Faire un commit du code après l'étape 4!

Uh oh! On a une pandémie de COVID!

Afin d'éviter de propager le Coronavirus, les cliniques et les centres communautaires ont décidé de rapidement renvoyer à la maison les patients se présentant avec le symptome CORONAVIRUS. Ceux-ci ne sont ajoutés à aucune file d'attente.

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

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

Étape 6

Partage ta réponse dans ton channel d'équipe sur Discord!

Solutions

Aucune solution ne sera donnée, mais le devoir pourrait être repris lors d'un TD.

Cependant, pour vous autocorriger, nous vous recommandons fortement de discuter de vos réponses dans Discord avec vos camarades.