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ı: 30Hesaplanmış ö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.
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 deseniyleBoxsınıfınızı tanımlayın. Her kutu üç boyut saklar:width,heightvedepth. Ş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
- Her üç boyutu da saklayan bir
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:
- Genişlik (Width)
- Yükseklik (Height)
- Derinlik (Depth)
Ana dosyanızda, verilen boyutlarla bir kutu oluşturun ve ardından iki satır yazdırın:
:getVolume()kullanarak hacim:getSurfaceArea()kullanarak yüzey alanı
Örneğin, girdiler 3, 4 ve 5 ise, çıktı şöyle olmalıdır:
60
94Hesaplanmış ö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: 30Hesaplanmış ö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
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
1'Self' Kavramı
Fonksiyonlu TablolarAçık 'self'İki Nokta SözdizimiNokta vs İki NoktaÖzet - Hareket Eden Nokta4Proje: Dijital Banka
Proje KurulumuPara Yatırma Metodu7Çok Biçimlilik ve Geçersiz Kılma
Metotları Geçersiz KılmaÜst Sınıf Metotlarını ÇağırmaDuck TypingOrtak ArayüzTür KontrolüÖzet - Çalışan Rolleri2Sınıf Prototip Kalıbı
Prototip Kavramı__index ile Bağlama:new() KurucusuÖznitelikleri BaşlatmaBağımsız ÖrneklerÖzet - Araba Fabrikası5OOP'de Operatör Aşırı Yükleme
Nesneleri ToplamaNesneleri ÇıkarmaNesneleri BirleştirmeNesneleri Karşılaştırma (<, >)Özet - Cüzdan Matematiği8Kapsülleme
Adlandırma KurallarıGizlilik için Closure'larClosure'lar Aracılığıyla ErişimSalt Okunur TablolarDoğrulama MantığıÖzet - Güvenli Kasa11Tasarım Kalıpları (Lite)
Fabrika FonksiyonlarıSingleton TablosuIterator KalıbıObserver (Dinleyici)Özet - Logger Fabrikası3Nesne Durumu ve Davranışı
Örnek DeğişkenleriGetter MetotlarıSetter MetotlarıHesaplanmış ÖzelliklerString BiçimlendirmeEşitlik KontrolleriÖzet - Öğrenci Notu6Kalıtımın Temelleri
Kalıtım KurulumuMetot KalıtımıConstructor'ı GenişletmeAlt Sınıf Metotları EklemePaylaşılan ve BenzersizÖzet - Şekil Hiyerarşisi