Menu
CoddyTech

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
end

Saat 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.

challenge icon

Tantangan

Mudah

Mari 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, _health bernilai 100, dan _level bernilai 1. 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, cetak Error: Health must be between 0 and 100 dan jangan ubah nilainya.
    • :setLevel(value): memperbarui level hanya jika nilainya 1 atau lebih. Jika tidak valid, cetak Error: Level must be at least 1 dan 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:

  1. Nama pemain
  2. Nilai health yang akan dicoba untuk diatur (angka, bisa valid atau tidak valid)
  3. 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: 5

Setter 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: 1

Coba 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}
quiz iconUji dirimu

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

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler Lua online