Veri Gizleme Uygulaması
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 33 / 70.
Veri gizleme, sadece private alanları kullanmanın ötesine geçer. Sınıfınızı, iç uygulama ayrıntıları dış kod için tamamen görünmez olacak ve temiz bir genel arayüz aracılığıyla yalnızca gerekli olanı sunacak şekilde tasarlamakla ilgilidir.
Bir kullanıcının parolasını takip eden bir sınıf düşünün. Ham parolaya kimsenin erişmesini istemezsiniz - okumak için bile olsa:
public class UserAccount
{
private string passwordHash;
public void SetPassword(string password)
{
passwordHash = HashPassword(password);
}
public bool VerifyPassword(string password)
{
return HashPassword(password) == passwordHash;
}
private string HashPassword(string password)
{
return password.GetHashCode().ToString();
}
}Parolayı ve hatta hash değerini geri almanın bir yolu olmadığına dikkat edin. Harici kod yalnızca bir parola belirleyebilir veya bir parolayı doğrulayabilir - dahili depolama mekanizması tamamen gizlidir. HashPassword yöntemi de özeldir (private), çünkü sınıfın nasıl kullanıldığını etkilemeden değişebilecek bir uygulama detayıdır.
Bu yaklaşım, sınıfınızı yanlış kullanımdan korur ve size daha sonra dahili bileşenleri değiştirme özgürlüğü verir. Farklı bir karma (hashing) algoritması kullanmaya karar verirseniz, hiçbir harici kod bozulmaz çünkü hiçbir şey parolanın nasıl saklandığına bağlı değildir.
Görev
KolayGerçek veri gizlemeyi gösteren güvenli bir cüzdan sistemi oluşturalım. Bakiyenin doğrudan erişime karşı tamamen korunduğu dijital bir cüzdan oluşturacaksınız; harici kodlar yalnızca para yatırabilir, para çekebilir ve işlemlerin mümkün olup olmadığını kontrol edebilir, ancak gerçek bakiyeyi asla doğrudan göremez veya değiştiremez.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
Wallet.cs:Financead alanı (namespace) içinde, bakiyesini tamamen gizli tutan birWalletsınıfı oluşturun. Cüzdan şunlara sahip olmalıdır:- Bakiyeyi saklamak için özel (private) bir alan (decimal)
- Bakiyeyi
"$123.45"gibi bir para birimi dizesi olarak biçimlendirilmiş şekilde döndüren özel birFormatBalance()yöntemi - bu, dışarıya açılmaması gereken dahili bir yardımcıdır - Yalnızca miktar pozitifse bakiyeye ekleme yapan, başarılı olursa
true, aksi takdirdefalsedöndüren genel (public) birDeposit(decimal amount)yöntemi - Yalnızca miktar pozitifse ve mevcut bakiyeyi aşmıyorsa bakiyeden çıkarma yapan, başarılı olursa
true, aksi takdirdefalsedöndüren genel birWithdraw(decimal amount)yöntemi - Bakiye miktardan büyük veya eşitse
true, aksi takdirdefalsedöndüren genel birCanAfford(decimal amount)yöntemi - Dahili olarak özel
FormatBalance()yöntemini kullanan ve"Current balance: {formatted balance}"döndüren genel birGetStatement()yöntemi
Program.cs: Ana dosyanızda birWalletoluşturun ve giriş değerlerini kullanarak bir dizi işlem gerçekleştirin. Cüzdanın genel arayüzü aracılığıyla yararlı işlevler sağlarken dahili durumunu nasıl koruduğunu gösterin.
Üç giriş alacaksınız:
- İlk para yatırma miktarı (decimal)
- Denenecek para çekme miktarı (decimal)
- Ödeme gücünün kontrol edileceği miktar (decimal)
Çıktıyı şu formatta yazdırın:
Deposit {amount}: {True/False}
{GetStatement() result}
Withdraw {amount}: {True/False}
{GetStatement() result}
Can afford {amount}: {True/False}Örneğin, girişler 100.50, 30.25 ve 80.00 ise çıktı şöyle olmalıdır:
Deposit 100.50: True
Current balance: $100.50
Withdraw 30.25: True
Current balance: $70.25
Can afford 80.00: FalseBuradaki temel fikir, harici kodun bakiye alanına asla doğrudan dokunmamasıdır. Biçimlendirilmiş bakiye dizesi bile, dahili olarak özel bir yardımcıyı kullanan genel bir yöntem aracılığıyla gelir. Bu veri gizlemedir (data hiding) - uygulama ayrıntıları tamamen görünmezdir ve cüzdanınızı kullanan hiçbir kodu bozmadan bakiyenin nasıl saklandığını veya biçimlendirildiğini değiştirme özgürlüğüne sahipsiniz!
Kopya kağıdı
Veri gizleme, sınıfların iç uygulama ayrıntılarının dış kod için tamamen görünmez olacağı şekilde tasarlanması ve yalnızca gerekli olanın temiz bir genel arayüz aracılığıyla sunulması anlamına gelir.
Hassas verileri depolamak için private alanlar kullanın ve public metotlar aracılığıyla kontrollü erişim sağlayın:
public class UserAccount
{
private string passwordHash;
public void SetPassword(string password)
{
passwordHash = HashPassword(password);
}
public bool VerifyPassword(string password)
{
return HashPassword(password) == passwordHash;
}
private string HashPassword(string password)
{
return password.GetHashCode().ToString();
}
}Temel ilkeler:
- Dahili verilere doğrudan erişim yok (hassas alanlar için getter yok)
- Uygulama ayrıntıları için özel (private) yardımcı metotlar
- Genel (public) metotlar yalnızca kontrollü işlemler sağlar
- Dahili depolama mekanizması tamamen gizlidir
Bu, sınıfı yanlış kullanımdan korur ve dış kodu bozmadan dahili uygulamayı değiştirmeye olanak tanır.
Kendin dene
using System;
using Finance;
class Program
{
public static void Main(string[] args)
{
// Girdi değerlerini oku
decimal depositAmount = Convert.ToDecimal(Console.ReadLine());
decimal withdrawAmount = Convert.ToDecimal(Console.ReadLine());
decimal checkAmount = Convert.ToDecimal(Console.ReadLine());
// TODO: Bir Wallet örneği oluşturun
// TODO: Para yatırma işlemini gerçekleştirin ve sonucu şu formatta yazdırın: "Deposit {amount}: {True/False}"
// TODO: GetStatement() kullanarak ekstreyi yazdırın
// TODO: Para çekme işlemini gerçekleştirin ve sonucu şu formatta yazdırın: "Withdraw {amount}: {True/False}"
// TODO: GetStatement() kullanarak ekstreyi yazdırın
// TODO: Ödeme gücünü kontrol edin ve sonucu şu formatta yazdırın: "Can afford {amount}: {True/False}"
}
}
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 Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarı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ı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları