Basit Mixin'ler
Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 51 / 70.
Composition, nesneleri diğer nesnelerin içine yerleştirmenizi sağlar. Peki, ilgisiz sınıflar arasında davranış paylaşmak isterseniz ne olur?
Bir Player ve bir MenuItem her ikisi de bir :describe() yöntemine ihtiyaç duyabilir, ancak ortak bir üst sınıfı paylaşmazlar. mixins işte bu noktada devreye girer.
Mixin, işlevler içeren bir tablodur. Bu işlevleri kopyalayarak bir sınıfa “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 işlevi 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'ın :describe() ve :log() metodları varMixin uygulandıktan sonra, herhangi bir Player örneği bu metotları sanki doğrudan sınıfta tanımlanmışlar gibi çağırabilir:
local p = setmetatable({}, Player)
p:log("Player created") -- [LOG] Player oluşturulduKalıtımın aksine, mixin'ler bir ebeveyn-çocuk ilişkisi oluşturmaz. Yalnızca bir tablodaki fonksiyonları başka bir tabloya kopyalarsın.
Bu, mixin'leri, başka hiçbir ortak özelliği olmayan sınıflar arasında günlük kaydı, serileştirme veya açıklama yöntemleri gibi yardımcı program davranışlarını paylaşmak için mükemmel hâle getirir.
Görev
KolayMixin'leri kullanarak bir etiketleme sistemi oluşturalım! Herhangi bir sınıfa uygulanabilen ve nesnelere öğeleri, gönderileri veya etiketlere ihtiyaç duyan herhangi bir varlığı kategorilere ayırmak için yararlı olan bir etiket koleksiyonunu yönetme yeteneği kazandıran bir Taggable mixin'i oluşturacaksın.
Kodunu üç dosya arasında düzenleyeceksin:
Taggable.lua: İki yöntem içeren bir mixin tablosu oluştur::addTag(tag):self.tags'e bir etiket ekler (tablonun mevcut olduğunu varsayar):listTags(): tüm etiketleriTags: tag1, tag2, tag3biçiminde yazdırır (boşsaTags: none)
Article.lua: Başlığı saklayan ve boş bir:new(title)tablosu başlatantagskurucusuna sahip bir Article sınıfı oluştur. Article örneklerine etiketleme yetenekleri kazandırmak için Taggable mixin'ini uygula. Makalenin başlığını döndüren bir:getTitle()yöntemi ekle.main.lua:applyMixinyardımcı işlevini burada yaz (bunu Article.lua içinde require aracılığıyla kullanacaksın). Ardından bir makale başlığı ve iki etiket için girdileri oku. Bir Article oluştur, her iki etiketi ona ekle, başlığı yazdır ve tüm etiketleri listele.
Üç girdi alacaksın:
- Makale başlığı (bir string)
- Eklenecek ilk etiket (bir string)
- Eklenecek ikinci etiket (bir string)
Çıktın 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ı şu şekilde olmalıdır:
Title: Lua Basics
Tags: programming, tutorialUnutma: mixin yöntemleri, Article örneklerinde mixin yöntemlerinin üzerinde işlem yapabileceği bir tags tablosu bulunduğu için çalışır. Mixin bu tabloyu oluşturmaz. Bunu Article kurucun oluşturur. Mixin yalnızca ortak 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ü yap ve her metodu target'a 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 article'a 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ştirmeKendi başına pratik yap: Online Lua derleyicisi