Introduction aux patrons de conception
Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 45 sur 65.
Un patron de conception est une manière connue et nommée d’organiser des classes pour résoudre un problème qui se répète d’un programme à l’autre. Ce n’est ni une bibliothèque ni du code à copier : il décrit quels objets existent, de quoi chacun est responsable et comment ils fonctionnent ensemble. Tu écris le code toi-même, en l’adaptant à ton jeu.
Les modèles fournissent aussi aux développeurs un vocabulaire commun. « Les ennemis proviennent d’une fabrique » ou « la barre de santé observe le joueur » indique à un coéquipier comment le code est organisé avant même qu’il ouvre un fichier.
Voici un problème qu’un motif permet de résoudre. Démarrer un niveau signifie communiquer avec trois objets, et chaque script qui démarre un niveau répète ces lignes :
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
music.play("forest.ogg")
level_map.load_map(1)
hud.show_hearts(3)Le modèle Facade place une classe devant ces objets et lui fournit une méthode simple :
# game_facade.gd
class_name GameFacade
extends RefCounted
var music := MusicPlayer.new()
var level_map := LevelMap.new()
var hud := Hud.new()
func start_level(number: int) -> void:
music.play("forest.ogg")
level_map.load_map(number)
hud.show_hearts(3)# main.gd
var game := GameFacade.new()
game.start_level(1)Music: playing forest.ogg
Map: level 1 loaded
HUD: hearts 3Le reste du programme appelle start_level(), et lorsque le démarrage d’un niveau change, tu modifies un seul fichier.
Les patrons sont regroupés selon le problème qu’ils résolvent :
- Les patrons de création contrôlent la manière dont les objets sont créés : Singleton, Factory.
- Les patrons structurels combinent des objets en structures plus grandes : Facade, Adapter, Decorator, Composite.
- Les patrons comportementaux organisent la manière dont les objets collaborent : Observer, Strategy, Command, Template Method, State.
Ce chapitre et le suivant abordent ces modèles. Chacun d’eux s’appuie sur ce que tu connais déjà : les classes dans leurs propres fichiers, l’héritage, le polymorphisme, la composition et les signaux.
Défi
FacileUn jeu démarre et quitte des niveaux à l’aide de trois objets déjà écrits : MusicPlayer (music_player.gd), LevelMap (level_map.gd) et Hud (hud.gd). Écris la façade GameFacade devant eux :
- Elle crée une instance de
MusicPlayer, une deLevelMapet une deHuddans ses variables membres. start_level(number, hearts)joue la pistelevel_N.ogg(N est le numéro du niveau), ouboss.ogglorsque le numéro est un multiple de5, puis charge la carte de ce niveau, puis affiche les cœurs.quit_level()masque le HUD, puis arrête la musique.
Le code fourni lit le nombre de commandes qui suivent, puis une commande par ligne : start NUMBER HEARTS ou quit. Pour start 5 2 et quit, la sortie est :
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedTon code va dans game_facade.gd. main.gd contient le code d’entrée/sortie fourni et ne peut pas être modifié.
Essayez vous-même
extends Node
func _ready():
# Code d'entrée/sortie fourni : conservez-le tel quel
var game := GameFacade.new()
var count := int(OS.read_string_from_stdin())
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
if parts[0] == "start":
game.start_level(int(parts[1]), int(parts[2]))
elif parts[0] == "quit":
game.quit_level()
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation orientée objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé selfMéthodesPropriétésConstructeur (_init)Récapitulatif - Calculatrice simple4Polymorphisme
Retour sur la redéfinition des méthodesTypage canardClasses et méthodes abstraitesConception d’interfacesRécapitulatif – Calculateur de formes7Signaux
Qu’est-ce qu’un signal ?Déclarer et émettreSe connecter aux signauxSignaux avec argumentsRécapitulatif - système de santé10Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron Composite2Propriétés de classe
Variables d’instance et variables statiquesFonctions statiquesSetters de propriétésGetters de propriétésPrivé par conventionRécapitulatif - Gestionnaire de comptes bancaires5Encapsulation
Membres publics et privésValidation avec les méthodes setterMasquage de l’informationPropriétés en lecture seuleRécapitulatif - Système de dossiers étudiants8Concepts avancés de la POO
Composition ou héritageClasses internesLes nœuds comme composantsRefCounted ou NodeEnums dans les classes3Héritage
Héritage de baseLe mot-clé superRedéfinition de méthodesChaînes d’héritageVérifier les types avec isRécapitulatif – Hiérarchie des employés6Méthodes spéciales
Introduction aux méthodes virtuellesLa méthode _to_stringItérateurs personnalisésRécapitulatif – Liste personnalisée9Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur GDScript en ligne