Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Gerç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 bir Wallet sınıfını Finance ad 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âlde true döndüren bir genel false yöntemi
    • Yalnızca miktar pozitifse ve mevcut bakiyeyi aşmıyorsa bakiyeden çıkarma yapan ve başarılıysa Withdraw(decimal amount), aksi hâlde true döndüren bir genel false yöntemi
    • Bakiye miktara büyük veya eşitse CanAfford(decimal amount), aksi hâlde true döndüren bir genel false yöntemi
    • Dahili olarak özel GetStatement() yöntemini kullanan ve FormatBalance() döndüren bir genel "Current balance: {formatted balance}" yöntemi
    Bakiyeyi doğrudan okumanın veya ayarlamanın hiçbir yolu olmadığını fark et - onunla yalnızca kontrollü yöntemler aracılığıyla etkileşime girebilirsin!
  • Program.cs: Ana dosyanda bir Wallet oluş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: False

Buradaki 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}"
    }
}
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 C# derleyicisi