Menu
Coddy logo textTech

Hesaplanmış Özellikler

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

Getter ve setter'lar saklanan değerlere erişim sağlar, ancak bazen saklanan bir alan olarak mevcut olmayan verilere ihtiyaç duyarsınız; bu verilerin diğer özniteliklerden hesaplanması gerekir. Bunlara hesaplanmış özellikler denir.

Bir dikdörtgen düşünün. Genişliğini ve yüksekliğini saklarsınız, ancak alan hiçbir yerde saklanmaz; bu iki değerin birbiriyle çarpılmasıyla hesaplanır. Gereksiz verileri saklamak yerine, sonucu hesaplayan ve döndüren bir metot oluşturursunuz:

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

:getArea() metodu saklanan bir değer döndürmez; her çağırdığınızda alanı yeniden hesaplar. Bu yaklaşımın önemli bir avantajı vardır: Genişlik veya yükseklik değişirse, alan herhangi bir şeyi güncellemenize gerek kalmadan yeni boyutları otomatik olarak yansıtır.

local box = Rectangle:new(5, 3)
print(box:getArea())  -- Çıktı: 15

box.width = 10
print(box:getArea())  -- Çıktı: 30

Hesaplanmış özellikler nesnelerinizin tutarlı kalmasını sağlar. Diğer alanlara bağlı olan değerleri saklamak (ve güncelliğini yitirme riskini almak) yerine, onları talep edildiğinde hesaplarsınız. Bu desen, türetilmiş her türlü veri için geçerlidir; çevre uzunlukları, ortalamalar, biçimlendirilmiş dizeler veya mevcut özniteliklerden belirlenebilen herhangi bir değer.

challenge icon

Görev

Kolay

İsteğe bağlı olarak hacmini hesaplayan bir Box sınıfı oluşturalım! Hacmi bir alan (field) olarak saklamak yerine, ihtiyaç duyulduğunda kutunun boyutlarından hesaplayan bir hesaplanmış özellik (calculated property) oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Box.lua: Standart prototip deseniyle Box sınıfınızı tanımlayın. Her kutu üç boyut saklar: width, height ve depth. Şunları içermelidir:
    • Her üç boyutu da saklayan bir :new(width, height, depth) yapıcı metodu (constructor)
    • Hacmi (width × height × depth) hesaplayan ve döndüren bir :getVolume() metodu
    • Toplam yüzey alanını hesaplayan ve döndüren bir :getSurfaceArea() metodu
  • main.lua: Box modülünüzü dahil edin (require), bir kutu örneği oluşturun ve hesaplanmış özelliklerin mevcut boyutları nasıl otomatik olarak yansıttığını gösterin.

Bir kutunun yüzey alanı şu şekilde hesaplanır: 2 × (width×height + height×depth + width×depth)

Kutunun boyutlarını temsil eden üç girdi alacaksınız:

  1. Genişlik (Width)
  2. Yükseklik (Height)
  3. Derinlik (Depth)

Ana dosyanızda, verilen boyutlarla bir kutu oluşturun ve ardından iki satır yazdırın:

  1. :getVolume() kullanarak hacim
  2. :getSurfaceArea() kullanarak yüzey alanı

Örneğin, girdiler 3, 4 ve 5 ise, çıktı şöyle olmalıdır:

60
94

Hesaplanmış özelliklerin güzelliği, her zaman doğru kalmalarıdır. Daha sonra kutunun boyutlarından birini değiştirirseniz, :getVolume() metodunu tekrar çağırmak otomatik olarak doğru yeni değeri döndürecektir; manuel güncellemeye gerek yoktur!

Kopya kağıdı

Hesaplanmış özellikler (calculated properties), değerleri doğrudan saklamak yerine diğer özniteliklere dayanarak hesaplayan ve döndüren metotlardır. Bu, veri tutarlılığını sağlar ve gereksiz veri tekrarını ortadan kaldırır.

Alan için hesaplanmış bir özellik örneği:

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

:getArea() metodu, her çağrıldığında alanı hesaplar ve genişlik veya yükseklikteki her türlü değişikliği otomatik olarak yansıtır:

local box = Rectangle:new(5, 3)
print(box:getArea())  -- Output: 15

box.width = 10
print(box:getArea())  -- Output: 30

Hesaplanmış özellikler; çevre uzunlukları, hacimler, ortalamalar veya mevcut özniteliklerden belirlenebilen biçimlendirilmiş dizeler gibi türetilmiş tüm veriler için kullanışlıdır.

Kendin dene

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

-- Giriş boyutlarını oku
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())

-- TODO: Verilen boyutlarla bir kutu örneği oluşturun

-- TODO: :getVolume() kullanarak hacmi yazdırın

-- TODO: :getSurfaceArea() kullanarak yüzey alanını yazdırın
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