Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente | |||
| public:appro-s7:td1 [2020/11/01 17:37] – ↷ Nom de la page changé de public:appro-s7:td3 à public:appro-s7:td1 edauce | public:appro-s7:td1 [2023/10/09 11:32] (Version actuelle) – edauce | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ===== MVC et hamsters...===== | ||
| + | Le patron de conception " | ||
| + | |||
| + | Une Interface graphique est constituée essentiellement de deux modules : | ||
| + | * Le "// | ||
| + | * Le "// | ||
| + | |||
| + | Pour développer un tel programme, on le divise généralement en trois modules appelés respectivement: | ||
| + | * le Modèle | ||
| + | * la Vue | ||
| + | * le Contrôleur | ||
| + | |||
| + | === Le Modèle == | ||
| + | Le modèle est la partie du programme qui manipule et met à jour les informations qui doivent être conservées d'une session à l' | ||
| + | |||
| + | === La Vue == | ||
| + | La Vue est la partie du programme qui gère la mise en page, la disposition des informations, | ||
| + | * La Vue fait appel au Contrôleur à chaque fois que l' | ||
| + | * La Vue fait appel au Modèle pour afficher en permanence un contenu actualisé par les actions de l' | ||
| + | |||
| + | === Le Contrôleur === | ||
| + | Le contrôleur est la partie du programme qui gère les actions de l' | ||
| + | * Le contrôleur fait appel au Modèle lorsque l' | ||
| + | |||
| + | <note tip> | ||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | ===== Mise en œuvre ==== | ||
| + | |||
| + | Dans ce TD, nous développons une application permettant de gérer une petite animalerie. Le programme gère un cheptel de rongeurs (tamias, hamsters, etc..) qui vivent dans une cage. | ||
| + | * La cage est constituée d'une litière, ainsi que d'une mangeoire, un nid et une roue pour faire de l' | ||
| + | * Les animaux passent par différents états au cours de la journée: | ||
| + | * Lorsqu’ils se réveillent, | ||
| + | * Une fois qu'ils ont mangé, ils sont " | ||
| + | * Après avoir fait du sport, ils sont " | ||
| + | * et ainsi de suite... | ||
| + | |||
| + | L' | ||
| + | * {{http:// | ||
| + | * {{http:// | ||
| + | |||
| + | |||
| + | |||
| + | Nous allons procéder par essai/ | ||
| + | - Le Modèle | ||
| + | - Le Contrôleur | ||
| + | - La Vue | ||
| + | |||
| + | ==== 1. Le Modèle === | ||
| + | |||
| + | Commençons par le Modèle. Le Modèle est la seule partir du programme autorisée à manipuler directement les données contenues dans les tables. Il permet essentiellement de réaliser des opérations de lecture et d' | ||
| + | |||
| + | Nous disposons pour l' | ||
| + | * le fichier {{http:// | ||
| + | Voici en clair l' | ||
| + | |||
| + | ^Animal^RACE^TYPE^ÉTAT^LIEU^ | ||
| + | |Tic|tamia|rongeur|affamé|litière| | ||
| + | |Tac|tamia|rongeur|affamé|litière| | ||
| + | |Patrick|hamster|rongeur|affamé|litière| | ||
| + | |Totoro|ili pika|rongeur|repus|mangeoire| | ||
| + | |Pocahontas|opossum|marsupial|endormi|nid| | ||
| + | |||
| + | * le fichier | ||
| + | |||
| + | Voici en clair l' | ||
| + | ^Équipement^DISPONIBILITÉ^ | ||
| + | |litière|libre| | ||
| + | |mangeoire|occupé| | ||
| + | |roue|libre| | ||
| + | |nid|occupé| | ||
| + | |||
| + | Créez un nouveau projet. | ||
| + | * Ajoutez {{http:// | ||
| + | * Créez le module '' | ||
| + | <note important> | ||
| + | Pensez également à conserver une copie de ces fichiers dans un répertoire '' | ||
| + | </ | ||
| + | === A faire === | ||
| + | |||
| + | === 1. Lecture === | ||
| + | |||
| + | == 1.1 État == | ||
| + | Créez dans '' | ||
| + | * prend en paramètre le nom de l' | ||
| + | * consulte le fichier '' | ||
| + | * et retourne l' | ||
| + | |||
| + | <code python> | ||
| + | import json | ||
| + | |||
| + | def lit_état(animal_id): | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | * Si l' | ||
| + | * Si l' | ||
| + | * affiche un message du type '' | ||
| + | * retourne '' | ||
| + | |||
| + | <note tip> | ||
| + | * Les informations sont situées dans un fichier au format '' | ||
| + | <code python> | ||
| + | with open(' | ||
| + | animal = json.load(f) | ||
| + | </ | ||
| + | on récupère ainsi un dictionnaire '' | ||
| + | * Pour lire l' | ||
| + | <code python> | ||
| + | poca = animal[' | ||
| + | </ | ||
| + | * remarque : '' | ||
| + | <code python> | ||
| + | poca_race = poca[' | ||
| + | </ | ||
| + | * ou de façon plus synthétique, | ||
| + | <code python> | ||
| + | poca_race = animal[' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | La fonction '' | ||
| + | <code python> | ||
| + | import Modèle | ||
| + | |||
| + | def test_lit_etat(): | ||
| + | assert Modèle.lit_état(' | ||
| + | |||
| + | def test_lit_etat_nul(): | ||
| + | assert Modèle.lit_état(' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | * Le premier test vérifie que l' | ||
| + | * Le second test vérifie que l' | ||
| + | </ | ||
| + | |||
| + | == 1.2 Lieu == | ||
| + | Créez dans le Modèle une fonction '' | ||
| + | l' | ||
| + | <code python> | ||
| + | def lit_lieu(animal_id): | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | De manière analogue fonction devra passer les tests suivants: | ||
| + | <code python> | ||
| + | def test_lit_lieu(): | ||
| + | assert Modèle.lit_lieu(' | ||
| + | | ||
| + | def test_lit_lieu_nul(): | ||
| + | assert Modèle.lit_lieu(' | ||
| + | </ | ||
| + | |||
| + | == 1.3 Disponibilité == | ||
| + | Créer une fonction '' | ||
| + | |||
| + | <code python> | ||
| + | def vérifie_disponibilité(équipement_id): | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | Cette fonction devra passer les tests suivants : | ||
| + | <code python> | ||
| + | def test_vérifie_disponibilité(): | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | * Si l' | ||
| + | * affiche un message du type '' | ||
| + | * retourne '' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | def test_vérifie_disponibilité_nul(): | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | </ | ||
| + | | ||
| + | == 1.4 Cherche_occupant == | ||
| + | |||
| + | La fonction '' | ||
| + | |||
| + | <code python> | ||
| + | def cherche_occupant(lieu): | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | Elle devra passer les tests suivants: | ||
| + | <code python> | ||
| + | def test_cherche_occupant(): | ||
| + | assert Modèle.cherche_occupant(' | ||
| + | assert ' | ||
| + | assert ' | ||
| + | </ | ||
| + | |||
| + | <note tip> | ||
| + | * Si le lieu n'est pas référencé, | ||
| + | * affiche un message du type '' | ||
| + | * retourne '' | ||
| + | </ | ||
| + | |||
| + | <code python> | ||
| + | def test_cherche_occupant_nul(): | ||
| + | assert Modèle.cherche_occupant(' | ||
| + | </ | ||
| + | |||
| + | === 2. Ecriture === | ||
| + | |||
| + | == 2.1 Changement d' | ||
| + | Créez une fonction d' | ||
| + | |||
| + | <code python> | ||
| + | def change_état(id_animal, | ||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | La fonction devra passer les tests suivants : | ||
| + | <code python> | ||
| + | def test_change_état(): | ||
| + | Modèle.change_état(' | ||
| + | assert Modèle.lit_état(' | ||
| + | Modèle.change_état(' | ||
| + | assert Modèle.lit_état(' | ||
| + | Modèle.change_état(' | ||
| + | assert Modèle.lit_état(' | ||
| + | </ | ||
| + | |||
| + | Autrement dit seuls les états '' | ||
| + | |||
| + | <note tip> | ||
| + | * Pour modifier de manière effective les changements effectués, il est bien sûr nécessaire de mettre à jour le fichier avec la fonction '' | ||
| + | <code python> | ||
| + | with open(' | ||
| + | json.dump(animal, | ||
| + | </ | ||
| + | * Pour sauver un fichier '' | ||
| + | <code python> | ||
| + | json.dump(animal, | ||
| + | </ | ||
| + | </ | ||
| + | == 2.2 Changement de lieu == | ||
| + | Créez une fonction '' | ||
| + | <code python> | ||
| + | def change_lieu(id_animal, | ||
| + | . . . | ||
| + | </ | ||
| + | <note tip> | ||
| + | Attention, à l' | ||
| + | * Lorsqu' | ||
| + | * Lorsqu' | ||
| + | * Il faut bien sûr modifier l' | ||
| + | </ | ||
| + | <note important> | ||
| + | La fonction '' | ||
| + | </ | ||
| + | La fonction devra passer les tests suivants: | ||
| + | <code python> | ||
| + | def test_change_lieu(): | ||
| + | Modèle.change_lieu(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | </ | ||
| + | Si le lieu est occupé, la fonction | ||
| + | * ne change rien | ||
| + | * affiche le message '' | ||
| + | <code python> | ||
| + | def test_change_lieu_occupé(): | ||
| + | Modèle.change_lieu(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | </ | ||
| + | Si le lieu n' | ||
| + | <code python> | ||
| + | def test_change_lieu_nul_1(): | ||
| + | Modèle.change_lieu(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | </ | ||
| + | Si l' | ||
| + | <code python> | ||
| + | def test_change_lieu_nul_2(): | ||
| + | Modèle.change_lieu(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 2. Le Contrôleur ==== | ||
| + | Le contrôleur est la partie du programme qui met en œuvre l' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | En vérifiant certaines contraintes d' | ||
| + | * seul un animal affamé accepte d' | ||
| + | * seul un animal repus accepte de faire de l' | ||
| + | * seul un animal fatigué accepte de dormir | ||
| + | * seul un animal endormi peut être réveillé | ||
| + | |||
| + | Ajoutez à votre projet un nouveau module '' | ||
| + | |||
| + | === A faire === | ||
| + | == 1. Nourrir == | ||
| + | Créez une fonction '' | ||
| + | * Si la mangeoire est occupée, la fonction affiche un message du type '' | ||
| + | * Si l' | ||
| + | * Si l' | ||
| + | * L' | ||
| + | * L' | ||
| + | * L' | ||
| + | * (Sinon rien ne change) | ||
| + | |||
| + | |||
| + | |||
| + | La fonction '' | ||
| + | |||
| + | <code python> | ||
| + | import Contrôleur | ||
| + | |||
| + | def test_nourrir(): | ||
| + | if Modèle.vérifie_disponibilité(' | ||
| + | Contrôleur.nourrir(' | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | assert Modèle.lit_état(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | Contrôleur.nourrir(' | ||
| + | assert Modèle.lit_état(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | Contrôleur.nourrir(' | ||
| + | assert Modèle.lit_état(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | Contrôleur.nourrir(' | ||
| + | assert Modèle.lit_état(' | ||
| + | assert Modèle.lit_lieu(' | ||
| + | assert Modèle.vérifie_disponibilité(' | ||
| + | </ | ||
| + | * A l' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | == 2. Divertir == | ||
| + | |||
| + | Créez et testez une fonction '' | ||
| + | * Si la roue est occupée, la fonction affiche un message du type '' | ||
| + | * Si l' | ||
| + | * Si l' | ||
| + | * L' | ||
| + | * L' | ||
| + | * L' | ||
| + | * (Sinon rien ne change) | ||
| + | == 3. Coucher == | ||
| + | |||
| + | Créez et testez une fonction '' | ||
| + | * Si le nid est occupé, la fonction affiche un message du type '' | ||
| + | * Si l' | ||
| + | * Si l' | ||
| + | * L' | ||
| + | * L' | ||
| + | * L' | ||
| + | * (Sinon rien ne change) | ||
| + | == 4. Réveiller == | ||
| + | |||
| + | Créez et testez une fonction '' | ||
| + | * Si l' | ||
| + | * Si l' | ||
| + | * L' | ||
| + | * L' | ||
| + | * L' | ||
| + | * (Sinon rien ne change) | ||
| + | |||
| + | ==== 3. La Vue ==== | ||
| + | |||
| + | Cette partie sera vue dans un prochain TD! | ||