Menu
CoddyTech

Pola Adapter

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

Pola Adapter memungkinkan sebuah object bekerja dengan kode yang mengharapkan method berbeda. Adapter membungkus object tersebut dan mengubah setiap pemanggilan yang diharapkan menjadi pemanggilan yang dimengerti oleh object tersebut.

Sebuah class lama dari proyek terdahulu menyimpan health sebagai dua angka:

# old_monster.gd
class_name OldMonster
extends RefCounted

var life := 30
var max_life := 120

HUD-mu menampilkan apa pun yang memiliki get_label() dan get_hp_percent(). Knight sudah memiliki keduanya (mengembalikan "Knight" dan 80), tetapi OldMonster tidak memiliki keduanya:

# health_display.gd
class_name HealthDisplay
extends RefCounted

func show_health(target) -> void:
	print(target.get_label(), ": ", target.get_hp_percent(), "%")

Adapter menyimpan OldMonster dan menyediakan dua method yang dipanggil oleh tampilan:

# monster_adapter.gd
class_name MonsterAdapter
extends RefCounted

var monster: OldMonster

func _init(wrapped: OldMonster) -> void:
	monster = wrapped

func get_label() -> String:
	return "Monster"

func get_hp_percent() -> int:
	return monster.life * 100 / monster.max_life
# main.gd
var display := HealthDisplay.new()
display.show_health(Knight.new())
display.show_health(MonsterAdapter.new(OldMonster.new()))
Knight: 80%
Monster: 25%

Baik OldMonster maupun HealthDisplay tidak berubah. Hal itu penting saat kamu tidak bisa atau sebaiknya tidak mengedit class: class tersebut berasal dari plugin, dimiliki tim lain, atau namanya digunakan oleh banyak skrip.

Adapter meneruskan setiap pemanggilan dan mengonversi data selama prosesnya, di sini dua angka menjadi satu persentase. Kalikan sebelum membagi: dengan bilangan bulat, 30 / 120 * 100 menghasilkan 0, sedangkan 30 * 100 / 120 menghasilkan 25.

challenge icon

Tantangan

Mudah

Papan cuaca menampilkan sensor yang memiliki get_sensor_name() dan get_celsius(), seperti ModernSensor (modern_sensor.gd). Papan tersebut berada di weather_board.gd. Termometer lama (legacy_thermometer.gd) hanya menyediakan read_fahrenheit() dan get_code(). Tulis adapter ThermometerAdapter:

  • Konstruktor menyimpan LegacyThermometer yang dibungkus.
  • get_sensor_name() mengembalikan Thermometer, sebuah spasi, dan kode termometer tersebut, seperti Thermometer TH-4.
  • get_celsius() mengembalikan suhu dalam Celsius: (fahrenheit - 32) * 5 / 9, sebagai float.

Jangan ubah class lainnya. Kode yang disediakan membaca jumlah sensor berikutnya, lalu satu sensor per baris: legacy ID FAHRENHEIT atau modern NAME CELSIUS. Kode tersebut membungkus setiap termometer lama dengan adapter-mu dan menampilkan semua sensor. Untuk legacy 4 98.6 dan modern Garden 21.5, outputnya adalah:

Thermometer TH-4: 37.0 C
Garden: 21.5 C
Warmest: Thermometer TH-4

Tuliskan kodemu di thermometer_adapter.gd. main.gd berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	var board := WeatherBoard.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "legacy":
			var old := LegacyThermometer.new(int(parts[1]), float(parts[2]))
			board.add_sensor(ThermometerAdapter.new(old))
		else:
			board.add_sensor(ModernSensor.new(parts[1], float(parts[2])))
	board.show_all()
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