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ı 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.

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 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: Finance ad alanı (namespace) içinde, bakiyesini tamamen gizli tutan bir Wallet sı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 bir FormatBalance() 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 takdirde false döndüren genel (public) bir Deposit(decimal amount) yöntemi
    • Yalnızca miktar pozitifse ve mevcut bakiyeyi aşmıyorsa bakiyeden çıkarma yapan, başarılı olursa true, aksi takdirde false döndüren genel bir Withdraw(decimal amount) yöntemi
    • Bakiye miktardan büyük veya eşitse true, aksi takdirde false döndüren genel bir CanAfford(decimal amount) yöntemi
    • Dahili olarak özel FormatBalance() yöntemini kullanan ve "Current balance: {formatted balance}" döndüren genel bir GetStatement() yöntemi
    Bakiyeyi doğrudan okumanın veya ayarlamanın bir yolu olmadığına dikkat edin - onunla yalnızca kontrollü yöntemler aracılığıyla etkileşime girebilirsiniz!
  • Program.cs: Ana dosyanızda bir Wallet oluş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: False

Buradaki 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}"
    }
}
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