Menu
CoddyTech

Pola Template Method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 53 dari 65.

Pola Template Method menetapkan urutan langkah algoritma di class induk dan memungkinkan setiap subclass mengisi beberapa langkah. Method induk yang menjalankan langkah-langkah tersebut adalah template method.

# level.gd
@abstract
class_name Level
extends RefCounted

func play() -> void:
	print("Loading ", get_level_name())
	spawn_enemies()
	print("Level complete!")

@abstract func get_level_name() -> String
@abstract func spawn_enemies() -> void

play() adalah templat: setiap level dimuat, memunculkan musuhnya, lalu selesai, dalam urutan ini. Langkah-langkah yang berbeda bersifat abstrak, jadi setiap subclass harus menuliskannya:

# forest_level.gd
class_name ForestLevel
extends Level

func get_level_name() -> String:
	return "Forest"

func spawn_enemies() -> void:
	print("3 wolves appear")

CaveLevel ditulis dengan cara yang sama, dengan nama "Cave" dan 5 bats appear.

# main.gd
var levels: Array[Level] = [ForestLevel.new(), CaveLevel.new()]
for level in levels:
	level.play()
Loading Forest
3 wolves appear
Level complete!
Loading Cave
5 bats appear
Level complete!

Sebuah langkah juga dapat memiliki nilai default di parent yang dapat ditimpa oleh subclass. Langkah opsional seperti ini disebut hook:

# level.gd
func play() -> void:
	print("Loading ", get_level_name())
	spawn_enemies()
	if has_boss():
		print("The boss arrives")
	print("Level complete!")

func has_boss() -> bool:
	return false

Hanya level yang mengganti has_boss() agar mengembalikan true yang mendapatkan baris bos. Subclass menulis langkah-langkah, lalu parent menentukan kapan langkah-langkah itu dijalankan, jadi subclass membiarkan play() apa adanya dan setiap level mengikuti urutan yang sama.

challenge icon

Tantangan

Sedang

Sebuah game mengekspor skornya dalam dua format dengan langkah yang sama. Baris berupa dictionary dengan "name" dan "score".

  • Di exporter.gd, tulis template method export_rows(rows): fungsi ini mencetak header(), lalu format_row(row) untuk setiap baris, kemudian footer(rows). Header atau footer yang berupa string kosong tidak dicetak. Hook header() dan footer() mengembalikan "" secara default, dan format_row() bersifat abstrak.
  • CsvExporter: header-nya adalah name,score, dan satu baris adalah Ada,12. Tanpa footer.
  • ListExporter: tanpa header, satu baris adalah * Ada scored 12, dan footer-nya adalah Players: N dengan jumlah baris.

Kode yang disediakan membaca format (csv atau list), jumlah baris berikutnya, lalu satu baris NAME SCORE per baris. Untuk list dengan Ada 12 dan Bo 7, output-nya adalah:

* Ada scored 12
* Bo scored 7
Players: 2

Kodemu ditulis di exporter.gd, csv_exporter.gd, dan list_exporter.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan tetap seperti ini
	var style := OS.read_string_from_stdin()
	var rows: Array = []
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		rows.append({"name": parts[0], "score": int(parts[1])})
	var exporter: Exporter = CsvExporter.new()
	if style == "list":
		exporter = ListExporter.new()
	exporter.export_rows(rows)
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online