Logika Validasi
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 47 dari 70.
Sejauh ini, kita telah mempelajari berbagai cara untuk melindungi data: konvensi penamaan menunjukkan maksud, closure menyembunyikan variabel sepenuhnya, dan tabel hanya-baca mencegah semua perubahan. Namun, sering kali kamu membutuhkan sesuatu di antaranya: mengizinkan perubahan, tetapi hanya perubahan yang valid.
Di sinilah method setter menjadi berguna. Alih-alih hanya menetapkan nilai, setter dapat memeriksa apakah nilai baru masuk akal sebelum menerimanya:
local Person = {}
Person.__index = Person
function Person:new(name, age)
local obj = {
_name = name,
_age = age
}
setmetatable(obj, Person)
return obj
end
function Person:setAge(newAge)
if newAge < 0 then
print("Error: Age cannot be negative")
return
end
self._age = newAge
endSaat seseorang memanggil person:setAge(-5), method tersebut menangani input yang tidak valid dan menolak memperbaruinya. State object tetap konsisten. Tanpa perlindungan ini, data yang buruk bisa diam-diam merusak programmu: bayangkan menghitung tunjangan pensiun dengan usia negatif.
Validasi bisa sesederhana atau serumit yang diperlukan. Kamu bisa memeriksa rentang, memverifikasi tipe, atau memastikan nilai sesuai dengan format yang diharapkan. Prinsip utamanya adalah setter bertindak sebagai penjaga gerbang, memastikan hanya data yang masuk akal yang masuk ke object-mu.
Tantangan
MudahMari buat class Player yang melindungi atribut health dan level menggunakan logika validasi dalam method setter! Dengan begitu, karakter game tidak akan pernah memiliki statistik yang mustahil.
Kamu akan mengatur kodemu dalam dua file:
Player.lua: Buat class yang mengelola statistik pemain dengan validasi yang tepat. Constructor:new(name)harus menginisialisasi pemain dengan nama,_healthbernilai100, dan_levelbernilai1. Sertakan method berikut::getName(): mengembalikan nama pemain:getHealth(): mengembalikan health saat ini:getLevel(): mengembalikan level saat ini:setHealth(value): memperbarui health hanya jika nilainya berada di antara 0 dan 100 (inklusif). Jika tidak valid, cetakError: Health must be between 0 and 100dan jangan ubah nilainya.:setLevel(value): memperbarui level hanya jika nilainya 1 atau lebih. Jika tidak valid, cetakError: Level must be at least 1dan jangan ubah nilainya.
main.lua: Wajibkan module Player-mu dan baca nama pemain, lalu dua nilai untuk menguji setter. Buat pemain, coba atur health-nya ke nilai pertama, coba atur level-nya ke nilai kedua, lalu cetak statistik akhir pemain.
Kamu akan menerima tiga input:
- Nama pemain
- Nilai health yang akan dicoba untuk diatur (angka, bisa valid atau tidak valid)
- Nilai level yang akan dicoba untuk diatur (angka, bisa valid atau tidak valid)
Output-mu harus menampilkan pesan error dari percobaan yang tidak valid, diikuti statistik akhir pemain:
Name: {name}
Health: {finalHealth}
Level: {finalLevel}Misalnya, jika input-nya adalah Hero, -20, dan 5, output-nya harus seperti berikut:
Error: Health must be between 0 and 100
Name: Hero
Health: 100
Level: 5Setter health menolak -20 (health tetap 100), sedangkan setter level menerima 5 sebagai nilai yang valid.
Jika input-nya adalah Warrior, 75, dan 0, output-nya harus seperti berikut:
Error: Level must be at least 1
Name: Warrior
Health: 75
Level: 1Coba sendiri
-- Muat module Player dengan require
local Player = require('Player')
-- Baca input
local name = io.read()
local healthValue = tonumber(io.read())
local levelValue = tonumber(io.read())
-- TODO: Buat pemain baru dengan nama yang diberikan
-- TODO: Coba atur kesehatan pemain ke healthValue
-- TODO: Coba atur level pemain ke levelValue
-- TODO: Cetak statistik akhir pemain dalam format berikut:
-- Name: {name}
-- Health: {finalHealth}
-- Level: {finalLevel}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online