Menu
Coddy logo textTech

Private Alanlar

Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 10 / 61.

Önceki derste her şeyi herkese açık yaptın: yapıyı, alanlarını ve yöntemlerini. Ancak gerçek kapsülleme, verilerine nasıl erişilebileceğini kontrol etmek anlamına gelir. Rust'ta alanlarını gizli tutarken bir yapıyı herkese açık yapabilirsin.

Negatif bir bakiyeye asla sahip olmaması gereken bir Wallet düşünün. Alan herkese açıksa herkes onu herhangi bir değere ayarlayabilir:

// wallet.rs
pub struct Wallet {
    balance: f64,  // pub yok = private!
}

impl Wallet {
    pub fn new(initial: f64) -> Wallet {
        Wallet { balance: initial }
    }
}

Wallet'ın herkese açık olduğuna, ancak balance'ın pub anahtar sözcüğüne sahip olmadığına dikkat edin. Bu, modülün dışındaki kodun oluşturucuyu kullanarak bir Wallet oluşturabileceği, ancak balance alanını doğrudan okuyamayacağı veya değiştiremeyeceği anlamına gelir:

// main.rs
mod wallet;
use wallet::Wallet;

fn main() {
    let w = Wallet::new(100.0);
    // println!("{}", w.balance);  // Hata! alan özel
    // w.balance = -50.0;          // Hata! özel alana erişilemez
}

Bu, kapsüllemenin temelidir: struct kendi verilerini kontrol eder. Harici kod, sağladığınız metotlar üzerinden ilerlemelidir; bu da doğrulama, günlük kaydı veya başka herhangi bir mantık ekleyebileceğiniz anlamına gelir. Veriler geçersiz durumlardan korunur.

Yaklaşan derslerde, getter ve setter yöntemleri aracılığıyla bu özel verilere kontrollü erişim sağlamayı öğreneceksin.

challenge icon

Görev

Kolay

Hassas verileri bir modül içinde koruyarak kapsüllemeyi gösteren bir sıcaklık sensörü sistemi oluşturalım.

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

  • sensor.rs: İki alana sahip bir TemperatureSensor yapısı tanımlayın: location (String) ve reading (f64). Yapı, diğer dosyalardan kullanılabilmesi için herkese açık olmalı; ancak her iki alanı da özel tutun: dış kod, sensörün verilerine doğrudan erişememeli veya bu verileri değiştirememelidir. Bir konum adı ve başlangıç sıcaklık değerini alan herkese açık bir new oluşturucusu ekleyin.
  • main.rs: Sensör modülünü içeri aktarın ve oluşturucuyu kullanarak bir TemperatureSensor oluşturun. Alanlar özel olduğundan bunları doğrudan yazdıramayacaksınız; bunun yerine sensörün başarıyla oluşturulduğunu gösteren bir onay mesajı yazdırın.

Bu görev, özel alanların temel kavramına odaklanır: yapıya erişilebilir, ancak iç verileri korunur. Dış kod, sensörle yalnızca sağladığınız yöntemler aracılığıyla etkileşime girebilir (bu durumda yalnızca oluşturucu aracılığıyla).

Çıktınız tam olarak şu biçimi izlemelidir:

Sensor created for: {location}

Konumu yazdırmak için new işlevinizin sensörü döndürmeden önce bu mesajı yazdırması gerekir; çünkü alanın kendisi özeldir.

Örneğin, konumu "Kitchen" ve değeri 22.5 olan bir sensör oluşturursanız çıktı şöyle olur:

Sensor created for: Kitchen

İki girdi alacaksınız: konum adı ve başlangıç sıcaklık değeri.

Kendin dene

mod sensor;

use sensor::TemperatureSensor;

fn main() {
    // Girişi oku
    let mut location = String::new();
    std::io::stdin().read_line(&mut location).expect("Failed to read line");
    let location = location.trim().to_string();
    
    let mut reading_str = String::new();
    std::io::stdin().read_line(&mut reading_str).expect("Failed to read line");
    let reading: f64 = reading_str.trim().parse().expect("Failed to parse reading");
    
    // TODO: Kurucuyu kullanarak bir TemperatureSensor oluştur
    // new fonksiyonu onay mesajını yazdırmayı halledecek
    
}
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 Rust derleyicisi