디자인 패턴 소개
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 45번째.
디자인 패턴은 프로그램마다 반복해서 나타나는 문제를 해결하기 위해 클래스를 구성하는, 널리 알려진 방식입니다. 디자인 패턴은 라이브러리도, 복사해서 사용할 코드도 아닙니다. 어떤 객체가 존재하고, 각 객체가 무엇을 담당하며, 서로 어떻게 협력하는지를 설명합니다. 게임에 맞게 직접 코드를 작성하면 됩니다.
패턴은 개발자들이 공통으로 사용하는 용어도 제공합니다. "적은 팩토리에서 생성된다" 또는 "체력 바가 플레이어를 관찰한다"라는 말은 팀원이 파일을 열어 보기 전에 코드가 어떻게 구성되어 있는지 알려 줍니다.
레벨을 시작할 때 반복되는 문제를 해결하는 패턴이 있습니다. 레벨을 시작한다는 것은 세 개의 객체와 상호작용하는 것을 의미하며, 레벨을 시작하는 모든 스크립트에 다음 줄이 반복됩니다:
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)파사드 패턴은 이러한 객체들 앞에 클래스 하나를 두고, 그 클래스에 간단한 메서드 하나를 제공합니다:
# 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 3프로그램의 나머지 부분에서는 start_level()을 호출하며, 레벨을 시작하는 방식이 바뀌면 파일 하나만 수정하면 됩니다.
패턴은 해결하는 문제에 따라 분류됩니다:
- 생성 패턴은 객체가 생성되는 방식을 제어합니다: Singleton, Factory.
- 구조 패턴은 객체를 더 큰 구조로 결합합니다: Facade, Adapter, Decorator, Composite.
- 행동 패턴은 객체가 함께 작동하는 방식을 구성합니다: Observer, Strategy, Command, Template Method, State.
이 장과 다음 장에서는 이러한 패턴을 다룹니다. 각 패턴은 별도의 파일에 정의된 클래스, 상속, 다형성, 컴포지션 및 시그널 등 이미 알고 있는 내용을 바탕으로 구성됩니다.
챌린지
쉬움게임은 이미 작성된 세 객체를 통해 레벨을 시작하고 종료합니다: MusicPlayer(music_player.gd), LevelMap(level_map.gd), Hud(hud.gd). 이 객체들을 감싸는 퍼사드 GameFacade를 작성하세요:
- 멤버 변수로
MusicPlayer하나,LevelMap하나,Hud하나를 생성합니다. start_level(number, hearts)는 트랙level_N.ogg(N은 레벨 번호)을 재생하거나, 번호가5의 배수일 때boss.ogg를 재생한 다음 해당 레벨의 맵을 불러오고 하트를 표시합니다.quit_level()은 HUD를 숨긴 다음 음악을 중지합니다.
제공된 코드는 이어지는 명령의 개수를 읽은 다음, 한 줄에 하나씩 명령을 읽습니다: start NUMBER HEARTS 또는 quit. start 5 2와 quit의 출력은 다음과 같습니다:
Music: playing boss.ogg
Map: level 5 loaded
HUD: hearts 2
HUD: hidden
Music: stopped코드는 game_facade.gd에 작성하세요. main.gd에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
extends Node
func _ready():
# 제공된 입출력 코드: 그대로 유지하세요
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()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러