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 herkese açıktır. Bu, herhangi bir kodun bunlara 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 sınıfın tanımlandığı kütüphanenin dışından doğrudan erişilemez. Harici kod bunun yerine herkese açık getter'ı kullanmalıdır. Bu, verilerin nasıl okunduğunu ve değiştirildiğini kontrol etmenizi sağlar; böylece nesnelerinizin her zaman geçerli bir durumda kalmasını garanti edersiniz.

challenge icon

Görev

Kolay

Bir public ve private üyeler arasındaki farkı gösteren basit bir parola yöneticisi oluşturalım. Alt çizgi ön ekinin, hassas verilerin sınıfın kütüphanesinin dışından doğrudan erişilmesine karşı nasıl koruma sağladığını göreceksin.

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

  • credential.dart: Bir web sitesine ait giriş bilgilerini depolayan bir Credential sınıfı tanımla. Sınıf şunlara sahip olmalı:
    • Genel bir String website — bunun hangi web sitesi olduğunu herkesin görmesinde sakınca yoktur
    • Genel bir String username — kullanıcı adı görünür olabilir
    • Özel bir String _password — gerçek parola korunmalıdır
    • Üç değerin tamamını alan bir kurucu
    • Özel password değerini döndüren genel bir alıcı _password (kontrollü erişim)
    • Paroladaki tüm karakterleri yıldızlarla getMaskedPassword() değiştirerek döndüren bir * metodu (gerçek parolayla aynı uzunlukta)
    • Kimlik bilgilerini güvenli bir şekilde yazdıran bir displayCredential() metodu (gerçek parola yerine maskelenmiş parolayı gösterir)
  • main.dart: Kimlik bilgisi sınıfını içe aktar ve kapsüllemenin parolayı nasıl koruduğunu göster:
    • 'github.com' web sitesi, 'dev_user' kullanıcı adı ve 'secret123' parolası için bir kimlik bilgisi oluştur
    • 'email.com' web sitesi, 'john_doe' kullanıcı adı ve 'myP@ss' parolası için başka bir kimlik bilgisi oluştur
    • Her kimlik bilgisi için displayCredential() metodunu çağır, ardından parolanın uzunluğuna erişmek için genel alıcıyı kullanarak Actual password length: [length] yazdır

displayCredential() metodu şu biçimde 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

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

Kendi başına pratik yap: Online Dart derleyicisi