Menu
Coddy logo textTech

Public ve Private Üyeler

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 30 / 110.

Kapsülleme (Encapsulation), nesne yönelimli programlamanın temel ilkelerinden biridir. Bir sınıfın dahili verilerine erişimi kontrol etmek, neyin dış dünyaya görünür olması gerektiğine ve neyin gizli kalması gerektiğine karar vermekle ilgilidir.

Dart'ta, sınıf üyeleri (alanlar ve metotlar) varsayılan olarak public'tir. Bu, herhangi bir kodun onlara doğrudan erişebileceği anlamına gelir:

class BankAccount {
  String owner;
  double balance;
  
  BankAccount(this.owner, this.balance);
}

var account = BankAccount('Alice', 1000);
account.balance = -500;  // Herkes bunu doğrudan değiştirebilir!

Bu durum sorun teşkil eder. Geçersiz bir bakiye ayarlanmasını hiçbir şey engellemez.

Dahili verileri korumak için Dart, özel üyeler kullanır. Bir üyenin adı alt çizgi _ ile başladığında o üye özel hale gelir:

class BankAccount {
  String owner;
  double _balance;  // Gizli - alt çizgi ile başlar
  
  BankAccount(this.owner, this._balance);
  
  double get balance => _balance;  // Kontrollü erişim
}

Artık _balance değişkenine sınıfın tanımlandığı kütüphanenin dışından doğrudan erişilemez. Dış kodun bunun yerine genel (public) getter'ı kullanması gerekir. Bu, verilerin nasıl okunduğunu ve değiştirildiğini kontrol etmenizi sağlayarak nesnelerinizin her zaman geçerli bir durumda kalmasını sağlar.

challenge icon

Görev

Kolay

Genel ve özel üyeler arasındaki farkı gösteren basit bir şifre yöneticisi oluşturalım. Alt çizgi önekinin, hassas verilerin sınıfın kütüphanesi dışından doğrudan erişilmesini nasıl koruduğunu göreceksiniz.

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

  • credential.dart: Bir web sitesi için giriş bilgilerini saklayan bir Credential sınıfı tanımlayın. Sınıf şunlara sahip olmalıdır:
    • Genel bir String website - bu bilginin hangi web sitesi için olduğunu herkesin görmesinde bir sakınca yoktur
    • Genel bir String username - kullanıcı adı görünür olabilir
    • Özel bir String _password - gerçek şifre korunmalıdır
    • Her üç değeri de alan bir yapıcı (constructor)
    • Özel _password değerini döndüren genel bir getter password (kontrollü erişim)
    • Tüm karakterleri yıldız işareti * ile değiştirilmiş şifreyi döndüren (gerçek şifre ile aynı uzunlukta) bir getMaskedPassword() metodu
    • Kimlik bilgilerini güvenli bir şekilde yazdıran (gerçek şifreyi değil, maskelenmiş şifreyi gösteren) bir displayCredential() metodu
  • main.dart: Kimlik bilgisi sınıfınızı içe aktarın ve kapsüllemenin (encapsulation) şifreyi nasıl koruduğunu gösterin:
    • Web sitesi 'github.com', kullanıcı adı 'dev_user' ve şifresi 'secret123' olan bir kimlik bilgisi oluşturun
    • Web sitesi 'email.com', kullanıcı adı 'john_doe' ve şifresi 'myP@ss' olan başka bir kimlik bilgisi oluşturun
    • Her bir kimlik bilgisi için displayCredential() metodunu çağırın, ardından şifrenin uzunluğuna erişmek için genel getter'ı kullanarak Actual password length: [length] yazdırın

displayCredential() metodu şu formatta yazdırmalıdır:

--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]

Beklenen çıktı:

--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6

Kopya kağıdı

Kapsülleme (Encapsulation), nelerin görünür olması gerektiğine ve nelerin gizli kalması gerektiğine karar vererek bir sınıfın dahili verilerine erişimi kontrol eder.

Dart'ta, sınıf üyeleri varsayılan olarak geneldir (public):

class BankAccount {
  String owner;
  double balance;  // Public - doğrudan erişilebilir
  
  BankAccount(this.owner, this.balance);
}

var account = BankAccount('Alice', 1000);
account.balance = -500;  // Doğrudan değişikliğe izin verilir

Dahili verileri korumak için, ismin başına alt çizgi _ ekleyerek özel üyeler (private members) kullanın:

class BankAccount {
  String owner;
  double _balance;  // Private - alt çizgi ile başlar
  
  BankAccount(this.owner, this._balance);
  
  double get balance => _balance;  // Getter aracılığıyla kontrollü erişim
}

Özel üyelere, sınıfın tanımlandığı kütüphanenin dışından doğrudan erişilemez. Özel verilere kontrollü erişim sağlamak ve nesnelerin geçerli bir durumda kalmasını sağlamak için genel alıcılar (getters) ve yöntemler kullanın.

Kendin dene

import 'credential.dart';

void main() {
  // TODO: github.com için bir kimlik bilgisi oluşturun
  // website: 'github.com', username: 'dev_user', password: 'secret123'
  
  // TODO: İlk kimlik bilgisi üzerinde displayCredential() metodunu çağırın
  
  // TODO: Genel (public) getter'ı kullanarak gerçek parola uzunluğunu yazdırın
  // Format: "Actual password length: [length]"
  
  // TODO: email.com için bir kimlik bilgisi oluşturun
  // website: 'email.com', username: 'john_doe', password: 'myP@ss'
  
  // TODO: İkinci kimlik bilgisi üzerinde displayCredential() metodunu çağırın
  
  // TODO: Genel (public) getter'ı kullanarak gerçek parola uzunluğunu 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