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.
Görev
KolayGenel 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 birCredentialsı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
_passworddeğerini döndüren genel bir getterpassword(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) birgetMaskedPassword()metodu - Kimlik bilgilerini güvenli bir şekilde yazdıran (gerçek şifreyi değil, maskelenmiş şifreyi gösteren) bir
displayCredential()metodu
- Genel bir
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'ı kullanarakActual password length: [length]yazdırın
- Web sitesi
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: 6Kopya 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 verilirDahili 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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı