Basit Mixin'ler
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 51 / 70.
Kompozisyon, nesneleri diğer nesnelerin içine yerleştirmenize olanak tanır. Peki ya davranışı ilişkisiz sınıflar arasında paylaşmak isterseniz?
Bir Player ve bir MenuItem'ın her ikisinin de bir :describe() metoduna ihtiyacı olabilir, ancak ortak bir üst sınıfa sahip değillerdir. İşte burada mixin'ler devreye girer.
Bir mixin, basitçe fonksiyonlar içeren bir tablodur. Bu fonksiyonları bir sınıfa kopyalayarak "karıştırırsınız":
local Printable = {}
function Printable:describe()
print("Object: " .. tostring(self))
end
function Printable:log(message)
print("[LOG] " .. message)
endBu mixin'i bir sınıfa uygulamak için, mixin tablosundaki her bir fonksiyonu sınıf tablosuna kopyalarsınız:
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) -- Artık Player :describe() ve :log() metodlarına sahipMixin uygulandıktan sonra, herhangi bir Player örneği bu metotları sanki doğrudan sınıf üzerinde tanımlanmışlar gibi çağırabilir:
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] Oyuncu oluşturulduKalıtımın aksine, mixin'ler bir ebeveyn-çocuk ilişkisi oluşturmaz. Sadece fonksiyonları bir tablodan diğerine kopyalıyorsunuz.
Bu, mixin'leri, aksi takdirde ortak hiçbir yanı olmayan sınıflar arasında günlükleme (logging), serileştirme (serialization) veya açıklama (description) yöntemleri gibi yardımcı davranışları paylaşmak için mükemmel kılar.
Görev
KolayMixin'leri kullanarak bir etiketleme sistemi oluşturalım! Herhangi bir sınıfa uygulanabilen, nesnelere bir etiket koleksiyonunu yönetme yeteneği veren bir Taggable mixin'i oluşturacaksınız; bu, öğeleri, gönderileri veya etiket gerektiren herhangi bir varlığı kategorize etmek için kullanışlıdır.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
Taggable.lua: İki metot içeren bir mixin tablosu oluşturun::addTag(tag)—self.tagstablosuna bir etiket ekler (tablonun var olduğunu varsayar):listTags()— tüm etiketleriTags: tag1, tag2, tag3formatında yazdırır (boşsaTags: noneyazdırır)
Article.lua: Başlığı saklayan ve boş birtagstablosu başlatan:new(title)kurucusuna sahip bir Article sınıfı oluşturun. Article örneklerine etiketleme yetenekleri kazandırmak için Taggable mixin'ini uygulayın. Makalenin başlığını döndüren bir:getTitle()metodu ekleyin.main.lua:applyMixinyardımcı fonksiyonunu burada yazın (bunu Article.lua içinde require aracılığıyla kullanacaksınız). Ardından bir makale başlığı ve iki etiket için girdileri okuyun. Bir Article oluşturun, her iki etiketi de ona ekleyin, başlığı yazdırın ve tüm etiketleri listeleyin.
Üç girdi alacaksınız:
- Makale başlığı (bir dize)
- Eklenecek ilk etiket (bir dize)
- Eklenecek ikinci etiket (bir dize)
Çıktınız, makalenin başlığını ve ardından etiketlerini göstermelidir:
Title: {title}
Tags: {tag1}, {tag2}Örneğin, girdiler Lua Basics, programming ve tutorial ise çıktı şöyle olmalıdır:
Title: Lua Basics
Tags: programming, tutorialUnutmayın: mixin metotları çalışır çünkü Article örnekleri, mixin metotlarının üzerinde işlem yapabileceği bir tags tablosuna sahiptir. Mixin bu tabloyu oluşturmaz; bunu Article kurucunuz yapar. Mixin sadece paylaşılan davranışı sağlar!
Kendin dene
-- Etiketleme sistemi için ana dosya
local Taggable = require('Taggable')
local Article = require('Article')
-- TODO: applyMixin fonksiyonunu uygula
-- Bu fonksiyon, bir mixin tablosundaki tüm metotları bir hedef tabloya kopyalamalıdır
function applyMixin(target, mixin)
-- TODO: mixin üzerinde döngü kur ve her metodu hedefe kopyala
end
-- Girdileri oku
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()
-- TODO: Verilen başlıkla bir Article oluştur
-- TODO: Her iki etiketi de makaleye ekle
-- TODO: Başlığı şu formatta yazdır: Title: {title}
-- TODO: listTags metodunu kullanarak tüm etiketleri listele
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi9Kompozisyon ve Mixin'ler
Has-A İlişkisiDelegasyonBasit Mixin'lerBirden Fazla Mixin UygulamaMixin'ler ve KalıtımÖzet - Robot Birleştirme