Menu
CoddyTech

Mixins Sederhana

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 51 dari 70.

Komposisi memungkinkan kamu menempatkan object di dalam object lain. Namun, bagaimana jika kamu ingin berbagi perilaku di antara class yang tidak berhubungan?

Player dan MenuItem mungkin sama-sama membutuhkan method :describe(), tetapi keduanya tidak memiliki parent class 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)
end

Untuk menerapkan mixin ini ke class, salin setiap fungsi dari tabel mixin ke 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 method tersebut seolah-olah method itu didefinisikan langsung pada class:

local p = setmetatable({}, Player)
p:log("Player created")  -- [LOG] Player dibuat

Tidak seperti pewarisan, mixin tidak membuat hubungan induk-anak. Kamu hanya menyalin fungsi dari satu tabel ke tabel lain.

Hal ini membuat mixin cocok untuk berbagi perilaku utilitas, seperti logging, serialisasi, atau method deskripsi, di antara class yang sebenarnya tidak memiliki kesamaan.

challenge icon

Tantangan

Mudah

Mari kita buat sistem tagging menggunakan mixin! Kamu akan membuat mixin Taggable yang dapat diterapkan ke class apa pun, sehingga object bisa mengelola kumpulan tag untuk mengategorikan item, postingan, atau entitas apa pun yang memerlukan label.

Kamu akan mengatur kodemu dalam tiga file:

  • Taggable.lua: Buat tabel mixin yang berisi dua method:
    • :addTag(tag): menambahkan tag ke self.tags (mengasumsikan tabelnya sudah ada)
    • :listTags(): mencetak semua tag dalam format Tags: tag1, tag2, tag3 (atau Tags: none jika kosong)
  • Article.lua: Buat class Article dengan konstruktor :new(title) yang menyimpan judul dan menginisialisasi tabel tags yang kosong. Terapkan mixin Taggable agar instance Article memiliki kemampuan tagging. Sertakan method :getTitle() yang mengembalikan judul artikel.
  • main.lua: Tulis fungsi helper applyMixin di sini (kamu akan menggunakannya di Article.lua melalui require). Lalu 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:

  1. Judul artikel (sebuah string)
  2. Tag pertama yang akan ditambahkan (sebuah string)
  3. Tag kedua yang akan ditambahkan (sebuah string)

Output harus menampilkan judul artikel diikuti tag-tag-nya:

Title: {title}
Tags: {tag1}, {tag2}

Misalnya, jika inputnya adalah Lua Basics, programming, dan tutorial, outputnya akan seperti berikut:

Title: Lua Basics
Tags: programming, tutorial

Ingat: 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: Lakukan perulangan pada mixin dan salin setiap method ke target
end

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