Menu
Coddy logo textTech

Hesaplanmış Özellikler

Coddy'nin Lua Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 70.

Getter'lar ve setter'lar depolanan değerlere erişim sağlar, ancak bazen depolanan bir alan olarak mevcut olmayan verilere ihtiyaç duyarsın. Bu verilerin diğer özniteliklerden hesaplanması gerekir. Bunlara hesaplanan ö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ğer birbiriyle çarpılarak hesaplanır. Gereksiz verileri saklamak yerine, sonucu hesaplayıp döndüren bir yöntem 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 depolanmış 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, sizin 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

Hesaplanan özellikler nesnelerinizin tutarlı kalmasını sağlar. Diğer alanlara bağlı değerleri depolamak (ve bunların güncelliğini yitirme riskini almak) yerine, bu değerleri gerektiğinde hesaplarsınız. Bu model, türetilmiş tüm veriler için geçerlidir: çevreler, ortalamalar, biçimlendirilmiş dizeler veya mevcut özniteliklerden belirlenebilen herhangi bir değer.

challenge icon

Görev

Kolay

Hacmini isteğe bağlı olarak hesaplayan bir Box sınıfı oluşturalım! Hacmi bir alan olarak depolamak yerine, gerektiğinde kutunun boyutlarından hesaplayan bir hesaplanmış özellik oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • Box.lua: Standart prototype pattern kullanarak Box sınıfını tanımla. Her box üç boyut depolar: width, height ve depth. Şunları ekle:
    • Tüm üç boyutu depolayan bir :new(width, height, depth) Constructor
    • Hacmi (width × height × depth) hesaplayıp döndüren bir :getVolume() metodu
    • Toplam surface alanını hesaplayıp döndüren bir :getSurfaceArea() metodu
  • main.lua: Box module'ünü Require et, bir box instance oluştur ve hesaplanmış özelliklerin güncel boyutları nasıl otomatik olarak yansıttığını göster.

Bir box'ın surface alanı şu şekilde hesaplanır: 2 × (width×height + height×depth + width×depth)

Box'ın boyutlarını temsil eden üç input alacaksın:

  1. Width
  2. Height
  3. Depth

main dosyanda, verilen boyutlarla bir box oluştur, ardından iki satır Print et:

  1. :getVolume() kullanarak volume
  2. :getSurfaceArea() kullanarak surface alanı

Örneğin inputlar 3, 4 ve 5 ise Output şöyle olmalıdır:

60
94

Hesaplanmış özelliklerin güzelliği, her zaman doğru kalmalarıdır. Daha sonra box'ın boyutlarından birini değiştirirsen, :getVolume() çağrısı otomatik olarak doğru yeni değeri döndürür: manuel güncelleme gerekmez!

Kendin dene

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

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

-- TODO: Verilen boyutlarla bir box örneği oluştur

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

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