Getter ve Setter Detayları
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 33 / 110.
Getter ve setter'lar, özel alanlarla (private fields) birleştirildiğinde kapsülleme için güçlü araçlar haline gelir. Verilerin nasıl erişildiği ve değiştirildiği üzerinde tam kontrol sahibi olmanızı sağlarken, temiz bir genel arayüz sunmanıza olanak tanırlar.
Yaygın bir model, özel bir alanı (private field), doğrulama içeren genel bir alıcı (getter) ve ayarlayıcı (setter) ile eşleştirmektir:
class Temperature {
double _celsius = 0;
double get celsius => _celsius;
set celsius(double value) {
if (value < -273.15) {
_celsius = -273.15; // Mutlak sıfır minimumu
} else {
_celsius = value;
}
}
}Setter'lar, nesnenizin asla geçersiz bir duruma girmemesini sağlayarak iş kurallarını uygulayabilir.
Ayrıca özel verilerden değerler türeten hesaplanmış getter'lar oluşturabilirsiniz:
class Rectangle {
double _width;
double _height;
Rectangle(this._width, this._height);
double get area => _width * _height; // Hesaplanmış
double get perimeter => 2 * (_width + _height);
double get width => _width;
set width(double value) {
if (value > 0) _width = value;
}
}Bazen salt okunur erişim istersiniz. Sadece bir setter olmadan bir getter sağlayın:
class Order {
final DateTime _createdAt = DateTime.now();
DateTime get createdAt => _createdAt; // Salt okunur
}Bu desen, herhangi bir değişikliği önlerken dış kodun verilere görünürlük kazanmasını sağlar - yalnızca bir getter ile birleştirilen private field, gerçek salt okunur erişim oluşturur.
Görev
KolayVeri erişimini kontrol etmek için getter ve setter'ların gücünü sergileyen bir ürün envanter sistemi oluşturalım. Dahili verilerini korurken hesaplanmış özellikler ve doğrulama sağlayan bir sınıf oluşturacaksınız.
Kodunuzu iki dosyada düzenleyeceksiniz:
product.dart: Uygun kapsülleme (encapsulation) ile envanteri yöneten birProductsınıfı tanımlayın. Ürününüz şunlara sahip olmalıdır:- Genel (public) bir
String name - Özel (private) bir
double _price - Özel (private) bir
int _quantity - Her üç değeri de alan bir yapıcı (constructor)
- Özel fiyatı döndüren bir getter
price - Yalnızca
0'dan büyük değerleri kabul eden bir setterprice(geçersiz değerleri yoksayın) - Özel miktarı döndüren bir getter
quantity - Yalnızca
0veya daha büyük değerleri kabul eden bir setterquantity(negatif değerleri yoksayın) _price * _quantitydeğerini döndüren hesaplanmış bir gettertotalValue- Miktar
0'dan büyüksetruedöndüren hesaplanmış bir getterisInStock - İsmin ilk 3 karakterini büyük harfle ve ardından miktarı döndürerek basit bir SKU oluşturan salt okunur bir getter
sku(örneğin, 25 adet "Laptop" içinLAP25) - Ürün ayrıntılarını gösteren bir
displayProduct()metodu
- Genel (public) bir
main.dart: Ürün sınıfınızı içe aktarın ve getter ile setter'ların erişimi nasıl kontrol ettiğini gösterin:999.99fiyatında ve25miktarında'Laptop'adında bir ürün oluşturundisplayProduct()metodunu çağırınIn stock: [isInStock]yazdırınSKU: [sku]yazdırın- Fiyatı
-50.0olarak ayarlamaya çalışın (yoksayılmalıdır) - Fiyatı
899.99olarak ayarlayın (geçerli değişiklik) - Miktarı
-10olarak ayarlamaya çalışın (yoksayılmalıdır) - Miktarı
0olarak ayarlayın (geçerli değişiklik) displayProduct()metodunu çağırınIn stock: [isInStock]yazdırınSKU: [sku]yazdırın
displayProduct() metodu şu formatta yazdırmalıdır:
--- Product Info ---
Name: [name]
Price: $[price]
Quantity: [quantity]
Total Value: $[totalValue]Beklenen çıktı:
--- Product Info ---
Name: Laptop
Price: $999.99
Quantity: 25
Total Value: $24999.75
In stock: true
SKU: LAP25
--- Product Info ---
Name: Laptop
Price: $899.99
Quantity: 0
Total Value: $0.0
In stock: false
SKU: LAP0Kopya kağıdı
Getter ve setter'lar, özel alanlarla (private fields) birleştirildiğinde kapsülleme (encapsulation) ve veri erişimi üzerinde kontrol sağlar.
Getter ve Setter ile Özel Alan
class Temperature {
double _celsius = 0;
double get celsius => _celsius;
set celsius(double value) {
if (value < -273.15) {
_celsius = -273.15;
} else {
_celsius = value;
}
}
}Hesaplanmış Getter'lar
Getter'lar, özel verilerden değerler türetebilir:
class Rectangle {
double _width;
double _height;
Rectangle(this._width, this._height);
double get area => _width * _height;
double get perimeter => 2 * (_width + _height);
double get width => _width;
set width(double value) {
if (value > 0) _width = value;
}
}Salt Okunur Erişim
Salt okunur özellikler için setter içermeyen bir getter sağlayın:
class Order {
final DateTime _createdAt = DateTime.now();
DateTime get createdAt => _createdAt;
}Kendin dene
import 'product.dart';
void main() {
// TODO: 999.99 fiyatında ve 25 miktarında 'Laptop' adında bir ürün oluşturun
// TODO: displayProduct() fonksiyonunu çağırın
// TODO: "In stock: [isInStock]" yazdırın
// TODO: "SKU: [sku]" yazdırın
// TODO: Fiyatı -50.0 olarak ayarlamaya çalışın (yok sayılmalıdır)
// TODO: Fiyatı 899.99 olarak ayarlayın (geçerli değişiklik)
// TODO: Miktarı -10 olarak ayarlamaya çalışın (yok sayılmalıdır)
// TODO: Miktarı 0 olarak ayarlayın (geçerli değişiklik)
// TODO: displayProduct() fonksiyonunu çağırın
// TODO: "In stock: [isInStock]" yazdırın
// TODO: "SKU: [sku]" yazdırın
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı