Property Terhitung
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 15 dari 70.
Getter dan setter menyediakan akses ke nilai yang tersimpan, tetapi terkadang kamu memerlukan data yang tidak ada sebagai field tersimpan. Data tersebut perlu dihitung dari atribut lain. Ini disebut property terhitung.
Perhatikan sebuah persegi panjang. Kamu menyimpan lebar dan tingginya, tetapi luasnya tidak disimpan di mana pun: luas dihitung dengan mengalikan kedua nilai ini. Alih-alih menyimpan data yang redundan, kamu membuat method yang menghitung dan mengembalikan hasilnya:
local Rectangle = {}
Rectangle.__index = Rectangle
function Rectangle:new(width, height)
local instance = {}
setmetatable(instance, self)
instance.width = width
instance.height = height
return instance
end
function Rectangle:getArea()
return self.width * self.height
endmethod :getArea() tidak mengembalikan nilai yang disimpan. Method ini menghitung luas dari awal setiap kali kamu memanggilnya. Pendekatan ini memiliki keunggulan utama: jika lebar atau tinggi berubah, luas akan otomatis mencerminkan dimensi baru tanpa kamu perlu memperbarui apa pun.
local box = Rectangle:new(5, 3)
print(box:getArea()) -- Output: 15
box.width = 10
print(box:getArea()) -- Output: 30Property hasil perhitungan menjaga object-mu tetap konsisten. Daripada menyimpan nilai yang bergantung pada field lain dan berisiko menjadi usang, kamu menghitungnya saat diperlukan. Pola ini berlaku untuk semua data turunan: keliling, rata-rata, string berformat, atau nilai apa pun yang dapat ditentukan dari atribut yang ada.
Tantangan
MudahMari buat class Box yang menghitung volumenya saat diperlukan! Alih-alih menyimpan volume sebagai field, kamu akan membuat property terhitung yang menghitungnya dari dimensi box setiap kali diperlukan.
Kamu akan mengatur kodemu dalam dua file:
Box.lua: Definisikan classBoxdengan pola prototype standar. Setiap box menyimpan tiga dimensi:width,height, dandepth. Sertakan:- Constructor
:new(width, height, depth)yang menyimpan ketiga dimensi - method
:getVolume()yang menghitung dan mengembalikan volume (width × height × depth) - method
:getSurfaceArea()yang menghitung dan mengembalikan luas permukaan total
- Constructor
main.lua: Gunakan perintah require untuk memuat module Box, buat instance box, dan tunjukkan bagaimana property terhitung secara otomatis mencerminkan dimensi saat ini.
Luas permukaan box dihitung sebagai: 2 × (width×height + height×depth + width×depth)
Kamu akan menerima tiga input yang mewakili dimensi box:
- Lebar
- Tinggi
- Kedalaman
Di file utama, buat box dengan dimensi yang diberikan, lalu cetak dua baris:
- Volume menggunakan
:getVolume() - Luas permukaan menggunakan
:getSurfaceArea()
Misalnya, jika inputnya adalah 3, 4, dan 5, outputnya akan seperti berikut:
60
94Keunggulan property terhitung adalah nilainya selalu akurat. Jika nanti kamu mengubah salah satu dimensi box, memanggil :getVolume() lagi akan secara otomatis mengembalikan nilai baru yang benar, tanpa perlu pembaruan manual!
Coba sendiri
-- Muat module Box
local Box = require('Box')
-- Baca dimensi input
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())
-- TODO: Buat instance kotak dengan dimensi yang diberikan
-- TODO: Cetak volume menggunakan :getVolume()
-- TODO: Cetak luas permukaan menggunakan :getSurfaceArea()
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