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! |