Menu
Coddy logo textTech

Setter'lar

Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 12 / 61.

Getter'lar, harici kodun özel verileri okumasına olanak tanır. Peki ya bu verileri değiştirmelerine izin vermeniz gerekirse? İşte burada setter metotları devreye girer; bunlar, özel alanları kontrollü bir şekilde değiştiren genel metotlardır.

Temel bir ayarlayıcı (setter), &mut self ve yeni bir değer alır:

// wallet.rs
pub struct Wallet {
    balance: f64,
}

impl Wallet {
    pub fn new(initial: f64) -> Wallet {
        Self { balance: initial }
    }
    
    pub fn balance(&self) -> f64 {
        self.balance
    }
    
    pub fn set_balance(&mut self, amount: f64) {
        self.balance = amount;
    }
}

Getter'ların aksine, Rust setter'ları veriyi değiştirdiklerini açıkça belirtmek için genellikle set_ önekini kullanır. &mut self parametresi temeldir; metoda, yapının (struct) alanlarını değiştirme izni verir.

Setter'ların gerçek gücü doğrulamadır. Herhangi bir değeri körü körüne kabul etmek yerine, kurallar uygulayabilirsiniz:

pub fn set_balance(&mut self, amount: f64) {
    if amount >= 0.0 {
        self.balance = amount;
    }
    // Negatif değerler sessizce yoksayılır
}

Artık cüzdan kendini koruyor; dış kod hangi değeri atamaya çalışırsa çalışsın, bakiye asla negatife düşemez. Bu, kapsüllemenin (encapsulation) iş başındaki halidir: struct kendi sabitlerini (invariants) kontrol eder ve dış kod onu basitçe geçersiz bir duruma sokamaz.

challenge icon

Görev

Kolay

Verilerin geçerli kalmasını sağlamak için ayarlayıcıların (setters) kuralları nasıl uygulayabileceğini gösteren bir termostat sistemi kuralım. Termostatınız, yalnızca güvenli bir aralıkta ayarlanabilen bir sıcaklık ayarına sahip olacak.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • thermostat.rs: Özel (private) bir temperature alanına (i32) sahip bir Thermostat yapısı (struct) tanımlayın. Yapı genel (public) olmalı, ancak alan geçersiz değerlerden korunmak için özel kalmalıdır. Şunları uygulayın:
    • Başlangıç sıcaklığını alan bir new yapıcı metodu (constructor)
    • Mevcut sıcaklığı döndüren bir temperature alıcı metodu (getter)
    • Yalnızca 10 ile 30 (dahil) arasındaki değerleri kabul eden bir set_temperature ayarlayıcı metodu (setter). Değer bu aralığın dışındaysa, sıcaklık değişmeden kalmalıdır.
  • main.rs: Termostat modülünüzü dahil edin, bir termostat oluşturun ve çeşitli sıcaklıkları ayarlamaya çalışarak ve her denemeden sonra sonucu yazdırarak ayarlayıcının doğrulamasını gösterin.

Ayarlayıcı, geçersiz değerleri sessizce görmezden gelmelidir; hata mesajı vermemeli, birisi geçerli aralığın dışında bir değer ayarlamaya çalıştığında mevcut sıcaklığı değiştirmemelidir.

Çıktınız tam olarak şu formatı izlemelidir:

Initial: {temperature}
After setting to {attempted_value}: {temperature}
After setting to {attempted_value}: {temperature}

Örneğin, 20 derecede bir termostat oluşturursanız, ardından 25 (geçerli) ve sonra 50 (geçersiz) olarak ayarlamaya çalışırsanız, çıktı şöyle olacaktır:

Initial: 20
After setting to 25: 25
After setting to 50: 25

Üç girdi alacaksınız: başlangıç sıcaklığı, denenecek ilk sıcaklık ve denenecek ikinci sıcaklık.

Kopya kağıdı

Setter metotları, harici kodun özel (private) alanları kontrollü bir şekilde değiştirmesine olanak tanır. Yapının (struct) verilerini değiştirme izni almak için &mut self alırlar.

Temel setter sözdizimi:

pub fn set_balance(&mut self, amount: f64) {
    self.balance = amount;
}

Rust setter'ları, verileri değiştirdiklerini açıkça belirtmek için genellikle set_ önekini kullanır.

Setter'lar, kuralları uygulamak ve veri bütünlüğünü korumak için doğrulamayı (validation) mümkün kılar:

pub fn set_balance(&mut self, amount: f64) {
    if amount >= 0.0 {
        self.balance = amount;
    }
    // Geçersiz değerler sessizce yoksayılır
}

Bu, iş başındaki kapsülleme (encapsulation) örneğidir: yapı kendi değişmezlerini (invariants) kontrol eder ve harici kodun onu geçersiz bir duruma sokmasını engeller.

Kendin dene

mod thermostat;

use thermostat::Thermostat;

fn main() {
    // Girdileri oku
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let initial_temp: i32 = input1.trim().parse().expect("Invalid number");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let first_attempt: i32 = input2.trim().parse().expect("Invalid number");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let second_attempt: i32 = input3.trim().parse().expect("Invalid number");

    // TODO: Başlangıç sıcaklığı ile bir thermostat oluşturun

    // TODO: Başlangıç sıcaklığını yazdırın
    // Format: "Initial: {temperature}"

    // TODO: İlk sıcaklığı ayarlamayı deneyin ve sonucu yazdırın
    // Format: "After setting to {attempted_value}: {temperature}"

    // TODO: İkinci sıcaklığı ayarlamayı deneyin ve sonucu yazdırın
    // Format: "After setting to {attempted_value}: {temperature}"
}
quiz iconKendini test et

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