Menu
Coddy logo textTech

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.

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. 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 bir Product sı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 setter price (geçersiz değerleri yoksayın)
    • Özel miktarı döndüren bir getter quantity
    • Yalnızca 0 veya daha büyük değerleri kabul eden bir setter quantity (negatif değerleri yoksayın)
    • _price * _quantity değerini döndüren hesaplanmış bir getter totalValue
    • Miktar 0'dan büyükse true döndüren hesaplanmış bir getter isInStock
    • İ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çin LAP25)
    • Ürün ayrıntılarını gösteren bir displayProduct() metodu
  • 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.99 fiyatında ve 25 miktarında 'Laptop' adında bir ürün oluşturun
    • displayProduct() metodunu çağırın
    • In stock: [isInStock] yazdırın
    • SKU: [sku] yazdırın
    • Fiyatı -50.0 olarak ayarlamaya çalışın (yoksayılmalıdır)
    • Fiyatı 899.99 olarak ayarlayın (geçerli değişiklik)
    • Miktarı -10 olarak ayarlamaya çalışın (yoksayılmalıdır)
    • Miktarı 0 olarak ayarlayın (geçerli değişiklik)
    • displayProduct() metodunu çağırın
    • In stock: [isInStock] yazdırın
    • SKU: [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: LAP0

Kopya 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
}
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