Introducción a los patrones de diseño
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 45 de 65.
Un patrón de diseño es una forma conocida y con nombre de organizar clases para un problema que se repite en un programa tras otro. No es una biblioteca ni código para copiar: describe qué objetos existen, de qué es responsable cada uno y cómo trabajan juntos. Tú escribes el código, adaptado a tu juego.
Los patrones también proporcionan un vocabulario común a los desarrolladores. «Los enemigos se crean en una fábrica» o «la barra de salud observa al jugador» le indica a un compañero cómo está organizado el código antes de que abra un archivo.
Aquí tienes un problema que resuelve un patrón. Iniciar un nivel implica comunicarse con tres objetos, y cada script que inicia un nivel repite estas líneas:
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)El patrón Facade coloca una clase delante de esos objetos y le proporciona un método sencillo:
# 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 3El resto del programa llama a start_level(), y cuando cambia el nivel que se va a iniciar, editas un archivo.
Los patrones se agrupan según el problema que resuelven:
- Los patrones creacionales controlan cómo se crean los objetos: Singleton, Factory.
- Los patrones estructurales combinan objetos en estructuras más grandes: Facade, Adapter, Decorator, Composite.
- Los patrones de comportamiento organizan cómo colaboran los objetos: Observer, Strategy, Command, Template Method, State.
Este capítulo y el siguiente abarcan estos patrones. Cada uno se construye a partir de lo que ya sabes: clases en sus propios archivos, herencia, polimorfismo, composición y señales.
Desafío
FácilUn juego inicia y finaliza niveles mediante tres objetos que ya están escritos: MusicPlayer (music_player.gd), LevelMap (level_map.gd) y Hud (hud.gd). Escribe la fachada GameFacade delante de ellos:
- Crea un
MusicPlayer, unLevelMapy unHuden sus variables miembro. start_level(number, hearts)reproduce la pistalevel_N.ogg(N es el número del nivel), oboss.oggcuando el número es múltiplo de5, después carga el mapa de ese nivel y, después, muestra los corazones.quit_level()oculta el HUD y, después, detiene la música.
El código proporcionado lee cuántos comandos siguen y, después, un comando por línea: start NUMBER HEARTS o quit. Para start 5 2 y quit, la salida es:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedTu código va en game_facade.gd. main.gd contiene el código de entrada y salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online