Menu
CoddyTech

Privat berdasarkan konvensi

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

GDScript tidak memiliki kata kunci private: setiap property dan method dari sebuah object dapat diakses dari script lain. Konvensi Godot adalah menggunakan garis bawah di awal. _coins dan _is_valid() di bawah ini hanya ditujukan untuk kode class itu sendiri:

# wallet.gd
class_name Wallet
extends RefCounted

var _coins: int = 0

func add(amount: int) -> void:
	if _is_valid(amount):
		_coins += amount

func spend(amount: int) -> bool:
	if not _is_valid(amount) or amount > _coins:
		return false
	_coins -= amount
	return true

func get_coins() -> int:
	return _coins

func _is_valid(amount: int) -> bool:
	return amount > 0

Skrip lain menggunakan method publik, dan method tersebut memeriksa setiap perubahan: spend() menolak mengambil koin lebih banyak daripada yang dimiliki dompet, sehingga jumlah koin tidak pernah kurang dari nol.

var wallet := Wallet.new()
wallet.add(50)
wallet.add(-20)
print(wallet.spend(80)) # false
print(wallet.get_coins()) # 50

Garis bawah adalah janji, bukan pengunci: wallet._coins = -999 berjalan tanpa error. Menepati janji itu bergantung pada siapa pun yang menulis skrip lain, jadi jangan membaca atau mengubah anggota bergaris bawah dari luar class-nya.

Kamu sudah mengenal dua nama dengan garis bawah dari Godot: _ready() dan _init() dipanggil oleh engine, bukan oleh kodemu sendiri.

challenge icon

Tantangan

Mudah

Lengkapi class User di user.gd. Class ini menyimpan password-nya di property privat, _password, dan hanya kodenya sendiri yang mengaksesnya.

  • Constructor menyimpan password awal
  • check_password(attempt) mengembalikan apakah attempt cocok dengan password
  • _is_strong(candidate), helper privat, mengembalikan apakah candidate memiliki setidaknya 6 karakter
  • change_password(old_password, new_password) mengubah password dan hanya mengembalikan true jika old_password benar dan new_password kuat. Jika tidak, fungsi ini tidak mengubah apa pun dan mengembalikan false

Kode yang disediakan membaca password awal, jumlah perintah berikutnya, dan perintah check PASSWORD serta change OLD NEW. Untuk password godot4 dan perintah change godot4 abc, change wrong longenough, dan check godot4, kode akan mencetak:

Password not changed
Password not changed
Access granted

Tulis kodemu di user.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 user := User.new(OS.read_string_from_stdin())
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		if parts[0] == "check":
			print("Access granted" if user.check_password(parts[1]) else "Access denied")
		elif user.change_password(parts[1], parts[2]):
			print("Password changed")
		else:
			print("Password not changed")
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