Menu
CoddyTech

Delegasi

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

Menyimpan object di dalam object lain hanyalah langkah pertama. Kekuatan sebenarnya dari komposisi berasal dari delegasi, saat object luar meneruskan pemanggilan method ke komponen di dalamnya.

Bayangkan saat menyalakan mobil. Kamu tidak menggapai bagian bawah kap mesin dan memutar mesin secara manual. Sebaliknya, kamu memutar kunci, lalu mobil menangani sisanya secara internal.

Di dalam kode, ini berarti class Car menyediakan method :start() sederhana yang menyerahkan pekerjaan sebenarnya kepada mesin:

function Car:start()
    print("Turning the key...")
    self.engine:run()  -- Serahkan tugas ke object di dalamnya
end

Mobil tidak perlu tahu bagaimana mesin bekerja. Mobil hanya memberi tahu mesin untuk menjalankan tugasnya. Ini memisahkan tanggung jawab. class Engine menangani logika mesin, sedangkan Car mengoordinasikan bagian-bagiannya:

function Engine:run()
    print("Engine running at " .. self.horsepower .. " HP")
end

local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- output:
-- Memutar kunci...
-- Engine berjalan pada 250 HP

Delegasi menciptakan antarmuka yang rapi bagi pengguna class-mu. Mereka berinteraksi dengan mobil, bukan bagian-bagian internalnya. Jika nanti kamu mengganti implementasi mesin dengan yang berbeda, antarmuka publik mobil tetap sama: hanya delegasi internalnya yang berubah.

challenge icon

Tantangan

Mudah

Mari buat sistem pemutar musik yang menunjukkan delegasi! Kamu akan membuat komponen Speaker dan MusicPlayer yang memuat komponen tersebut. Pemutar musik tidak akan menangani keluaran suara secara langsung. Sebaliknya, pemutar musik akan mendelegasikan tanggung jawab itu kepada speaker internalnya.

Kamu akan mengatur kodemu dalam tiga file:

  • Speaker.lua: Buat class Speaker dengan constructor :new(volume) yang menyimpan tingkat volume. Sertakan method :playSound(trackName) yang mencetak: Playing "{trackName}" at volume {volume}
  • MusicPlayer.lua: Buat class MusicPlayer yang constructornya :new(brand, speaker) menerima nama merek dan object Speaker. Pemutar musik menyimpan speaker di dalam dirinya. Sertakan method berikut:
    • :play(trackName): mencetak {brand} player starting... lalu mendelegasikan tugas ke method :playSound() milik speaker
    • :stop(): mencetak {brand} player stopped
  • main.lua: Satukan semuanya! Baca input untuk volume speaker, merek pemutar musik, dan nama lagu. Buat Speaker terlebih dahulu, lalu berikan kepada constructor MusicPlayer. Panggil method :play() milik pemutar musik dengan nama lagu, lalu panggil :stop().

Kamu akan menerima tiga input:

  1. Volume speaker (angka)
  2. Merek pemutar musik (string)
  3. Nama lagu yang akan diputar (string)

Outputmu harus menunjukkan pemutar musik berkoordinasi dengan speakernya:

{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stopped

Misalnya, jika inputnya adalah 75, SoundMax, dan Summer Vibes, outputnya harus seperti berikut:

SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stopped

Perhatikan bahwa MusicPlayer tidak tahu bagaimana cara menghasilkan suara. MusicPlayer hanya meminta speakernya menangani bagian itu. Inilah delegasi: object luar menyediakan antarmuka yang rapi, sementara komponen di dalamnya melakukan tugas khusus!

Coba sendiri

-- main.lua
-- Satukan semuanya!

local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')

-- Baca input
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()

-- TODO: Buat Speaker dengan volume yang diberikan

-- TODO: Buat MusicPlayer dengan brand dan speaker

-- TODO: Panggil method play milik pemutar dengan nama lagu

-- TODO: Panggil method stop milik pemutar
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