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ı: 30Hesaplanan ö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.
Görev
KolayHacmini 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 kullanarakBoxsınıfını tanımla. Her box üç boyut depolar:width,heightvedepth. Ş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
- Tüm üç boyutu depolayan bir
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:
- Width
- Height
- Depth
main dosyanda, verilen boyutlarla bir box oluştur, ardından iki satır Print et:
:getVolume()kullanarak volume:getSurfaceArea()kullanarak surface alanı
Örneğin inputlar 3, 4 ve 5 ise Output şöyle olmalıdır:
60
94Hesaplanmış ö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
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
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şisiKendi başına pratik yap: Online Lua derleyicisi