Menu
Coddy logo textTech

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

Bu 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ı var

Mixin 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şturuldu

Kalı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.

challenge icon

Görev

Kolay

Mixin'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 etiketleri Tags: tag1, tag2, tag3 biçiminde yazdırır (boşsa Tags: none)
  • Article.lua: Başlığı saklayan ve boş bir :new(title) tablosu başlatan tags kurucusuna 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: applyMixin yardı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:

  1. Makale başlığı (bir string)
  2. Eklenecek ilk etiket (bir string)
  3. 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, tutorial

Unutma: 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
quiz iconKendini test et

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

Kendi başına pratik yap: Online Lua derleyicisi