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ı veya hash değerini almanın hiçbir yolu olmadığını fark edin. Harici kod yalnızca bir parola belirleyebilir ya da parolayı doğrulayabilir; dahili depolama mekanizması tamamen gizlidir. HashPassword yöntemi de özeldir, çünkü sınıfın kullanım biçimini etkilemeden değişebilecek bir uygulama ayrıntısı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 bir dijital cüzdan oluşturacaksın - harici kod yalnızca para yatırabilir, para çekebilir ve işlemlerin mümkün olup olmadığını kontrol edebilir; ancak gerçek bakiyeyi doğrudan göremez veya değiştiremez.
Kodunu iki dosyaya ayıracaksın:
Wallet.cs: Bakiyesini tamamen gizli tutan birWalletsınıfınıFinancead alanında oluştur. Cüzdan şunlara sahip olmalıdır:- Bakiyeyi depolamak için özel bir alan (decimal)
- Bakiyeyi
FormatBalance()gibi para birimi biçiminde bir dize olarak döndüren özel bir"$123.45"yöntemi - bu, dışarıya açılmaması gereken dahili bir yardımcıdır - Yalnızca miktar pozitifse bakiyeye ekleme yapan ve başarılıysa
Deposit(decimal amount), aksi hâldetruedöndüren bir genelfalseyöntemi - Yalnızca miktar pozitifse ve mevcut bakiyeyi aşmıyorsa bakiyeden çıkarma yapan ve başarılıysa
Withdraw(decimal amount), aksi hâldetruedöndüren bir genelfalseyöntemi - Bakiye miktara büyük veya eşitse
CanAfford(decimal amount), aksi hâldetruedöndüren bir genelfalseyöntemi - Dahili olarak özel
GetStatement()yöntemini kullanan veFormatBalance()döndüren bir genel"Current balance: {formatted balance}"yöntemi
Program.cs: Ana dosyanda birWalletoluştur ve girdi değerlerini kullanarak bir dizi işlem gerçekleştir. Genel arayüzü aracılığıyla hâlâ yararlı işlevler sunarken cüzdanın dahili durumunu nasıl koruduğunu göster.
Üç girdi alacaksın:
- Başlangıç para yatırma miktarı (decimal)
- Denenecek para çekme miktarı (decimal)
- Ödenebilirliği kontrol edilecek miktar (decimal)
Çıktıyı şu biçimde yazdır:
Deposit {amount}: {True/False}
{GetStatement() result}
Withdraw {amount}: {True/False}
{GetStatement() result}
Can afford {amount}: {True/False}Örneğin girdiler 100.50, 30.25 ve 80.00 ise çıktı şu şekilde 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 çıkarım, harici kodun bakiye alanına hiçbir zaman doğrudan dokunmamasıdır. Biçimlendirilmiş bakiye dizesi bile dahili olarak özel bir yardımcı kullanan genel bir yöntem aracılığıyla elde edilir. Bu veri gizlemedir - uygulama ayrıntıları tamamen görünmezdir ve cüzdanını kullanan hiçbir kodu bozmadan bakiyenin nasıl depolandığını veya biçimlendirildiğini değiştirmekte özgürsün!
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ıKendi başına pratik yap: Online C# derleyicisi