Introdução aos Padrões de Projeto
Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 45 de 65.
Um padrão de projeto é uma forma conhecida e nomeada de organizar classes para um problema que se repete em programa após programa. Não é uma biblioteca nem código para copiar: ele descreve quais objetos existem, pelo que cada um é responsável e como trabalham juntos. Você escreve o código por conta própria, adaptado ao seu jogo.
Os padrões também dão aos desenvolvedores um vocabulário compartilhado. “Os inimigos vêm de uma fábrica” ou “a barra de vida observa o jogador” explica a um colega de equipe como o código está organizado antes mesmo de abrir um arquivo.
Aqui está um problema que um padrão resolve. Iniciar um nível significa interagir com três objetos, e todo script que inicia um nível repete estas linhas:
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)O padrão Facade coloca uma classe na frente desses objetos e dá a ela um método simples:
# 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 3O restante do programa chama start_level(), e, quando a forma de iniciar um nível muda, você edita um arquivo.
Os padrões são agrupados pelo problema que resolvem:
- Padrões criacionais controlam como os objetos são criados: Singleton, Factory.
- Padrões estruturais combinam objetos em estruturas maiores: Facade, Adapter, Decorator, Composite.
- Padrões comportamentais organizam como os objetos trabalham juntos: Observer, Strategy, Command, Template Method, State.
Este capítulo e o próximo abordam esses padrões. Cada um é construído com base no que você já sabe: classes em seus próprios arquivos, herança, polimorfismo, composição e sinais.
Desafio
FácilUm jogo inicia e encerra níveis por meio de três objetos que já estão escritos: MusicPlayer (music_player.gd), LevelMap (level_map.gd) e Hud (hud.gd). Escreva a fachada GameFacade para interagir com eles:
- Ela cria um
MusicPlayer, umLevelMape umHudem suas variáveis de membro. start_level(number, hearts)reproduz a faixalevel_N.ogg(N é o número do nível) ouboss.oggquando o número é múltiplo de5, depois carrega o mapa desse nível e, em seguida, mostra os corações.quit_level()oculta o HUD e, em seguida, para a música.
O código fornecido lê quantos comandos vêm a seguir e, depois, um comando por linha: start NUMBER HEARTS ou quit. Para start 5 2 e quit, a saída é:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stoppedSeu código deve ficar em game_facade.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
extends Node
func _ready():
# Código de entrada/saída fornecido: mantenha-o 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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação orientada a objetos
1Fundamentos da POO
Arquivos externosIntrodução à POOClasses vs. objetosA palavra-chave selfMétodosPropriedadesConstrutor (_init)Revisão - Calculadora simples4Polimorfismo
Revisitando a Sobrescrita de MétodosDuck TypingClasses e Métodos AbstratosDesign de InterfacesRevisão - Calculadora de Formas7Sinais
O que é um sinal?Declarando e emitindoConectando-se a sinaisSinais com argumentosRevisão - Sistema de saúde10Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite2Propriedades de Classe
Variáveis de Instância vs. EstáticasFunções EstáticasMétodos Setters de PropriedadeMétodos Getters de PropriedadePrivado por ConvençãoRecapitulando: Gerenciador de Conta Bancária5Encapsulamento
Membros públicos e privadosValidação com settersOcultação de informaçõesPropriedades somente para leituraRevisão - Sistema de registros de alunos8Conceitos Avançados de POO
Composição vs. HerançaClasses InternasNós como ComponentesRefCounted vs. NodeEnums em Classes3Herança
Herança básicaA palavra-chave superSobrescrita de métodosCadeias de herançaVerificações de tipo com isRevisão - Hierarquia de funcionários6Métodos especiais
Introdução aos métodos virtuaisO método _to_stringIteradores personalizadosRevisão - Lista personalizada9Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de GDScript online