Menu
Coddy logo textTech

Adlandırma Kuralları

Coddy'nin Lua Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 43 / 70.

Lua'da, tüm tablo alanları varsayılan olarak herkese açık bir şekilde erişilebilirdir. Herkes self.health değerini doğrudan okuyabilir veya değiştirebilir. Lua gizliliği zorunlu kılmasa da, programcılar niyetlerini belirtmek için isimlendirme kuralları kullanırlar; bu, hangi alanların dahili uygulama detayları olarak ele alınması gerektiğini işaret eder.

Standart kural, özel alanların önüne bir alt çizgi getirmektir:

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Public: doğrudan erişmekte sorun yok
        _health = 100,    -- Private: bunun yerine metotları kullanın
        _score = 0        -- Private: dahili takip
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

function Player:takeDamage(amount)
    self._health = self._health - amount
end

Alt çizgi Lua'nın çalışma şeklini değiştirmez—player._health teknik olarak hala erişilebilirdir. Ancak, diğer programcılara (ve gelecekteki kendinize) açık bir uyarı niteliği taşır: "Bu alanın özel olması amaçlanmıştır. Bunun yerine metotlar aracılığıyla erişin."

Bu kural önemlidir çünkü arayüzü (başkalarının kullanması gerekenleri) uygulamadan (dahili olarak nasıl çalıştığından) ayırır. Daha sonra doğrulama eklemeniz veya sağlığın nasıl saklandığını değiştirmeniz gerekirse, yalnızca metotları değiştirirsiniz; :getHealth() kullanan kod değişmeden çalışmaya devam eder.

challenge icon

Görev

Kolay

Alt çizgi adlandırma kuralını kullanarak hangi alanların özel (private) olması gerektiğini düzgün bir şekilde belirten bir BankAccount sınıfı oluşturalım!

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • BankAccount.lua: Hesap bilgilerini yöneten bir sınıf oluşturun. Yapıcı metot (constructor) :new(ownerName, initialBalance), sahibin adını genel bir alan (owner) olarak ve bakiyeyi özel bir alan (_balance) olarak saklamalıdır. Üç metot ekleyin:
    • :getBalance() — mevcut bakiyeyi döndürür
    • :deposit(amount) — miktarı _balance alanına ekler
    • :getOwner() — sahibin adını döndürür
  • main.lua: BankAccount modülünüzü dahil edin (require), girdiden sahibin adını, başlangıç bakiyesini ve para yatırma miktarını okuyun. Bir hesap oluşturun, para yatırma işlemini gerçekleştirin, ardından sahibini ve son bakiyeyi yazdırın.

Üç girdi alacaksınız:

  1. Sahibin adı
  2. Başlangıç bakiyesi (bir sayı)
  3. Yatırılacak miktar (bir sayı)

Çıktınız, para yatırma işleminden sonra sahibini ve son bakiyeyi gösteren iki satır olmalıdır:

Owner: {ownerName}
Balance: {finalBalance}

Örneğin, girdiler Maria, 500 ve 150 ise çıktı şu şekilde olmalıdır:

Owner: Maria
Balance: 650

Unutmayın: _balance üzerindeki alt çizgi öneki, diğer programcılara bu alana doğrudan değil, :getBalance() ve :deposit() gibi metotlar aracılığıyla erişilmesi gerektiğini belirtir. Alt çizgi içermeyen owner alanı, genel olarak erişilmesinde bir sakınca olmadığını gösterir.

Kopya kağıdı

Lua'da, tüm tablo alanları varsayılan olarak herkese açıktır. Hangi alanların dahili uygulama ayrıntıları olarak ele alınması gerektiğini belirtmek için, özel (private) alanların önüne bir alt çizgi (_) ekleyerek alt çizgi adlandırma kuralını kullanın.

Alt çizgi gizliliği zorunlu kılmaz; diğer programcılara, alana doğrudan erişmek yerine metotlar aracılığıyla erişilmesi gerektiğine dair bir sinyaldir.

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Genel: doğrudan erişilebilir
        _health = 100,    -- Özel: bunun yerine metotları kullanın
        _score = 0        -- Özel: dahili takip
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

function Player:takeDamage(amount)
    self._health = self._health - amount
end

Bu kural, arayüzü (başkalarının ne kullanması gerektiğini) uygulamadan (dahili olarak nasıl çalıştığını) ayırarak, değişiklikler gerektiğinde kodun daha sürdürülebilir olmasını sağlar.

Kendin dene

-- BankAccount modülünü dahil et
local BankAccount = require('BankAccount')

-- Girdileri oku
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- YAPILACAK: ownerName ve initialBalance ile yeni bir BankAccount oluşturun

-- YAPILACAK: depositAmount kullanarak bir para yatırma işlemi gerçekleştirin

-- YAPILACAK: Sahibi ve son bakiyeyi istenen formatta yazdırın
-- Format:
-- Sahibi: {ownerName}
-- Bakiye: {finalBalance}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler