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.

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

Bu 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 sahip

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

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

challenge icon

Görev

Kolay

Mixin'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.tags tablosuna bir etiket ekler (tablonun var olduğunu varsayar)
    • :listTags() — tüm etiketleri Tags: tag1, tag2, tag3 formatında yazdırır (boşsa Tags: none yazdırır)
  • Article.lua: Başlığı saklayan ve boş bir tags tablosu 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: applyMixin yardı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:

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

Unutmayı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
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