Menu
Coddy logo textTech

Getter ve Setter Derinliği

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.

challenge icon

Görev

Kolay

Veri erişimini kontrol etmek için getter ve setter’ların gücünü sergileyen bir ürün envanter sistemi oluşturalım. İç verilerini korurken hesaplanan özellikler ve doğrulama sağlayan bir sınıf oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • product.dart: Envanteri uygun kapsülleme ile yöneten bir Product sınıfı tanımla. Ürünün şunlara sahip olmalı:
    • Genel bir String name
    • Özel bir double _price
    • Özel bir int _quantity
    • Üç değerin tamamını alan bir yapıcı
    • Özel fiyatı döndüren bir price getter’ı
    • Yalnızca price’dan büyük değerleri kabul eden bir 0 setter’ı (geçersiz değerleri yok say)
    • Özel miktarı döndüren bir quantity getter’ı
    • Yalnızca quantity veya daha büyük değerleri kabul eden bir 0 setter’ı (negatif değerleri yok say)
    • totalValue döndüren hesaplanmış bir _price * _quantity getter’ı
    • Miktar isInStock’dan büyükse true döndüren hesaplanmış bir 0 getter’ı
    • Adın ilk 3 karakterini büyük harfle ve ardından miktarı döndürerek basit bir SKU oluşturan salt okunur bir sku getter’ı (örneğin, miktarı 25 olan "Laptop" için LAP25)
    • Ürün ayrıntılarını gösteren bir displayProduct() metodu
  • main.dart: Ürün sınıfını içe aktar ve getter ile setter’ların erişimi nasıl kontrol ettiğini göster:
    • Fiyatı 'Laptop' ve miktarı 999.99 olan, adı 25 bir ürün oluştur
    • displayProduct() metodunu çağır
    • In stock: [isInStock] yazdır
    • SKU: [sku] yazdır
    • Fiyatı -50.0 olarak ayarlamayı dene (yok sayılmalı)
    • Fiyatı 899.99 olarak ayarla (geçerli değişiklik)
    • Miktarı -10 olarak ayarlamayı dene (yok sayılmalı)
    • Miktarı 0 olarak ayarla (geçerli değişiklik)
    • displayProduct() metodunu çağır
    • In stock: [isInStock] yazdır
    • SKU: [sku] yazdır

displayProduct() metodu şu biçimde yazdırmalı:

--- 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: LAP0

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
}
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 Dart derleyicisi