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
endMobil 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 HPDelegasi 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.
Tantangan
MudahMari 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:
- Volume speaker (angka)
- Merek pemutar musik (string)
- Nama lagu yang akan diputar (string)
Outputmu harus menunjukkan pemutar musik berkoordinasi dengan speakernya:
{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stoppedMisalnya, jika inputnya adalah 75, SoundMax, dan Summer Vibes, outputnya harus seperti berikut:
SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stoppedPerhatikan 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
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