Mixins Sederhana
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 51 dari 70.
Komposisi memungkinkanmu menempatkan objek di dalam objek lain. Namun, bagaimana jika kamu ingin berbagi perilaku di antara class yang tidak terkait?
Player dan MenuItem mungkin sama-sama membutuhkan method :describe(), tetapi keduanya tidak memiliki class induk yang sama. Di sinilah mixin berperan.
Mixin adalah tabel yang berisi fungsi. Kamu “mencampurkan” fungsi-fungsi ini ke dalam class dengan menyalinnya:
local Printable = {}
function Printable:describe()
print("Object: " .. tostring(self))
end
function Printable:log(message)
print("[LOG] " .. message)
endUntuk menerapkan mixin ini ke class, salin setiap fungsi dari tabel mixin ke dalam tabel class:
local function applyMixin(class, mixin)
for key, value in pairs(mixin) do
class[key] = value
end
end
local Player = {}
Player.__index = Player
applyMixin(Player, Printable) -- Sekarang Player memiliki :describe() dan :log()Setelah menerapkan mixin, setiap instance Player dapat memanggil metode tersebut seolah-olah didefinisikan langsung di class:
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] Player dibuatTidak seperti pewarisan, mixin tidak membuat hubungan orang tua dan anak. Kamu hanya menyalin fungsi dari satu tabel ke tabel lainnya.
Ini membuat mixin cocok untuk berbagi perilaku utilitas, seperti metode pencatatan log, serialisasi, atau deskripsi, di antara class yang tidak memiliki kesamaan lain.
Tantangan
MudahMari buat sistem penandaan menggunakan mixin! Kamu akan membuat mixin Taggable yang dapat diterapkan ke class apa pun, sehingga object dapat mengelola kumpulan tag. Ini berguna untuk mengategorikan item, postingan, atau entitas apa pun yang membutuhkan label.
Kamu akan menyusun kodemu dalam tiga file:
Taggable.lua: Buat tabel mixin yang berisi dua method::addTag(tag): menambahkan tag keself.tags(mengasumsikan tabelnya sudah ada):listTags(): mencetak semua tag dengan formatTags: tag1, tag2, tag3(atauTags: nonejika kosong)
Article.lua: Buat class Article dengan konstruktor:new(title)yang menyimpan judul dan menginisialisasi tabeltagskosong. Sertakan method:getTitle()yang mengembalikan judul artikel.main.lua: Tulis fungsi pembantuapplyMixindi sini, lalu terapkan mixin denganapplyMixin(Article, Taggable)agar instance Article memiliki kemampuan untuk menggunakan tag. Kemudian baca input untuk judul artikel dan dua tag. Buat Article, tambahkan kedua tag ke dalamnya, cetak judulnya, lalu tampilkan semua tag.
Kamu akan menerima tiga input:
- Judul artikel (sebuah string)
- Tag pertama yang akan ditambahkan (sebuah string)
- Tag kedua yang akan ditambahkan (sebuah string)
Output-mu harus menampilkan judul artikel diikuti tag-tag-nya:
Title: {title}
Tags: {tag1}, {tag2}Contohnya, jika input-nya adalah Lua Basics, programming, dan tutorial, output-nya akan menjadi:
Title: Lua Basics
Tags: programming, tutorialIngat: method mixin berfungsi karena instance Article memiliki tabel tags yang dapat digunakan oleh method mixin. Mixin tidak membuat tabel ini. Konstruktor Article-mu yang membuatnya. Mixin hanya menyediakan perilaku bersama!
Coba sendiri
-- File utama untuk sistem penandaan
local Taggable = require('Taggable')
local Article = require('Article')
-- TODO: Implementasikan fungsi applyMixin
-- Fungsi ini harus menyalin semua method dari tabel mixin ke tabel target
function applyMixin(target, mixin)
-- TODO: Telusuri mixin dan salin setiap method ke target
end
-- TODO: Terapkan mixin Taggable ke Article menggunakan applyMixin
-- Baca input
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()
-- TODO: Buat Article dengan judul yang diberikan
-- TODO: Tambahkan kedua tag ke artikel
-- TODO: Cetak judul dengan format: Title: {title}
-- TODO: Tampilkan semua tag menggunakan method listTags
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 Bentuk9Komposisi & Mixins
Hubungan Has-ADelegasiMixins SederhanaMenerapkan Beberapa MixinsMixins vs PewarisanRangkuman: Perakitan RobotLatihan sendiri: Compiler Lua online