Variabel Instans
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 12 dari 70.
Selamat datang di bab baru yang berfokus pada cara object mengelola data internalnya. Kamu telah belajar membuat class dan instance: sekarang saatnya menjelajahi cara setiap instance menyimpan dan mengelola state uniknya sendiri.
Variabel instans adalah field yang hanya dimiliki oleh satu object. Saat kamu menetapkan nilai ke self.something di dalam method atau constructor, data itu hanya ada di instans tersebut. Object lain dari class yang sama memiliki salinannya sendiri secara terpisah.
Hal ini menjadi sangat penting saat menyimpan data kompleks seperti tabel. Pertimbangkan sistem inventaris yang setiap karakternya membawa item yang berbeda:
local Inventory = {}
Inventory.__index = Inventory
function Inventory:new()
local instance = {}
setmetatable(instance, self)
instance.items = {} -- Setiap instance memiliki tabel kosongnya sendiri
return instance
end
function Inventory:addItem(item)
table.insert(self.items, item)
endBaris kuncinya adalah instance.items = {}. Dengan membuat tabel kosong baru di dalam constructor, setiap object inventaris menerima list tersendiri yang berbeda. Jika kamu justru mendefinisikan items di tabel class itu sendiri, semua instance akan tanpa sengaja berbagi tabel yang sama: menambahkan pedang ke satu karakter akan memberikannya kepada semua orang!
local bag1 = Inventory:new()
local bag2 = Inventory:new()
bag1:addItem("Sword")
bag2:addItem("Potion")
print(#bag1.items) -- output: 1
print(#bag2.items) -- output: 1Setiap inventaris memiliki koleksinya sendiri. Pola ini berlaku setiap kali sebuah instance perlu melacak data yang berubah secara mandiri: list, penghitung, atau status yang dapat diubah dan unik untuk object tersebut.
Tantangan
MudahMari kita buat sistem ShoppingCart yang setiap cart-nya memiliki list produk tersendiri. Ini akan menunjukkan bagaimana variabel instance menjaga data tetap terpisah di antara object: menambahkan item ke satu cart tidak akan memengaruhi cart lainnya!
Kamu akan menyusun kodemu dalam dua file:
ShoppingCart.lua: Definisikan classShoppingCartyang setiap instance-nya memiliki tabelproductssendiri. Sertakan:- Constructor
:new()yang menginisialisasi list produk kosong untuk setiap cart - Method
:addProduct(productName)yang menambahkan produk ke list cart ini - Method
:listProducts()yang mencetak setiap produk pada baris terpisah
- Constructor
main.lua: Muat module ShoppingCart dan buat dua cart terpisah. Tambahkan produk yang berbeda ke setiap cart untuk membuktikan bahwa keduanya memiliki inventaris yang terpisah.
Kamu akan menerima empat input:
- Produk pertama yang ditambahkan ke cart A
- Produk kedua yang ditambahkan ke cart A
- Produk pertama yang ditambahkan ke cart B
- Produk kedua yang ditambahkan ke cart B
Di file utamamu:
- Buat dua cart belanja:
cartAdancartB - Tambahkan dua produk pertama ke
cartA - Tambahkan dua produk terakhir ke
cartB - Cetak
Cart A:, lalu tampilkan list produk cart A - Cetak
Cart B:, lalu tampilkan list produk cart B
Misalnya, jika input-nya adalah Apple, Bread, Milk, dan Eggs, output-nya seharusnya:
Cart A:
Apple
Bread
Cart B:
Milk
EggsIngat: kuncinya adalah menginisialisasi products sebagai tabel kosong baru di dalam constructor. Ini memastikan setiap instance cart memiliki list tersendiri, alih-alih berbagi satu tabel di antara semua cart.
Coba sendiri
-- Muat module ShoppingCart dengan require
local ShoppingCart = require('ShoppingCart')
-- Baca input
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()
-- TODO: Buat dua keranjang belanja: cartA dan cartB
-- TODO: Tambahkan product1 dan product2 ke cartA
-- TODO: Tambahkan product3 dan product4 ke cartB
-- TODO: Cetak "Cart A:", lalu tampilkan produk dalam cartA
-- TODO: Cetak "Cart B:", lalu tampilkan produk dalam cartB
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