Menu
CoddyTech

Kapsülleme için Özellikler

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 32 / 70.

Özellikler, C#'ta kapsüllemeyi uygulamanın temel aracıdır. Alanları doğrudan açığa çıkarmak yerine, verilere nasıl erişileceğini ve verilerin nasıl değiştirileceğini denetleyen özelliklerle onları sarmalarsınız.

Bu kalıp, erişim belirteçlerinde doğrulama veya mantık içeren bir genel özellik ile özel bir alanı birleştirir:

public class Temperature
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set
        {
            if (value < -273.15)
                celsius = -273.15;  // Mutlak sıfır alt sınırı
            else
                celsius = value;
        }
    }
}

Artık harici kod imkânsız bir sıcaklık değeri ayarlayamaz. Özellik, nesnenizin her zaman geçerli bir durumda kalmasını sağlayan bir denetçi görevi görür. Bu, kapsüllemenin iş başındaki hâlidir: iç veriler korunurken kontrollü bir arayüz üzerinden erişilebilir olmaya devam eder.

Değerleri hesaplamak veya yan etkileri tetiklemek için özellikleri de kullanabilirsiniz:

public double Fahrenheit
{
    get { return celsius * 9 / 5 + 32; }
    set { celsius = (value - 32) * 5 / 9; }
}

Dış dünya iki özellik görür, ancak içeride yalnızca bir alan vardır. Özellikler, sınıfınızı kullanan kodu bozmadan uygulama ayrıntılarını değiştirmenize olanak tanır; bu, doğru kapsüllemenin önemli bir avantajıdır.

challenge icon

Görev

Kolay

Veri bütünlüğünü korumak için özellikleri kullanan bir ürün envanter sistemi oluşturalım. Fiyatların hiçbir zaman negatif olamayacağı ve miktarların her zaman geçerli sınırlar içinde tutulacağı bir sınıf oluşturacaksın; böylece özelliklerin verilerin için nasıl birer bekçi görevi gördüğünü göstereceksin.

Kodunu iki dosyaya ayıracaksın:

  • Product.cs: Özellikler aracılığıyla doğrulama yaparak ürün bilgilerini yöneten, Inventory ad alanında bir Product sınıfı oluştur. Ürünün şunlara sahip olmalı:
    • Ondalık türünde özel bir price alanı ve fiyatın hiçbir zaman 0 değerinin altına düşmemesini sağlayan herkese açık bir Price özelliği; biri negatif bir fiyat ayarlamaya çalışırsa bunun yerine 0 olarak saklanmalı
    • Tam sayı türünde özel bir quantity alanı ve değerleri 0 ile 1000 arasında tutan herkese açık bir Quantity özelliği; 0'ın altındaki değerler 0, 1000'in üzerindeki değerler 1000 olmalı
    • Herkese açık, otomatik olarak uygulanan bir Name özelliği (string)
    • Price * Quantity değerini döndüren, hesaplanan ve salt okunur bir TotalValue özelliği
    Adı, fiyatı ve miktarı (bu sırayla) alan ve doğrulamanın uygulanması için tüm değerleri özellikler aracılığıyla ayarlayan bir kurucu ekle.
  • Program.cs: Ana dosyanda, girdi değerlerini kullanarak bir Product oluştur. Ardından fiyatı ve miktarı geçersiz olabilecek ek girdi değerleriyle değiştirmeyi dene. Özelliklerin verileri nasıl koruduğunu görmek için ürünün durumunu oluşturulduktan sonra ve her değişiklikten sonra yazdır.

Beş girdi alacaksın:

  • Ürün adı
  • Başlangıç fiyatı (ondalık)
  • Başlangıç miktarı (tam sayı)
  • Ayarlanacak yeni fiyat (ondalık, negatif olabilir)
  • Ayarlanacak yeni miktar (tam sayı, aralık dışında olabilir)

Çıktıyı şu biçimde yazdır:

After creation:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
After modifications:
{Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}

Örneğin girdiler Laptop, 999.99, 50, -100 ve 1500 ise çıktı şöyle olmalıdır:

After creation:
Laptop: Price=999.99, Qty=50, Total=49999.50
After modifications:
Laptop: Price=0, Qty=1000, Total=0

Negatif fiyatın 0 değerine dönüştüğüne ve 1500 miktarının 1000 ile sınırlandırıldığına dikkat et. Özelliklerin nesneyi geçersiz durumlardan koruyor; kapsülleme işte böyle çalışır!

Kendin dene

using System;
using Inventory;

class Program
{
    public static void Main(string[] args)
    {
        // Girdileri oku
        string name = Console.ReadLine();
        decimal initialPrice = Convert.ToDecimal(Console.ReadLine());
        int initialQuantity = Convert.ToInt32(Console.ReadLine());
        decimal newPrice = Convert.ToDecimal(Console.ReadLine());
        int newQuantity = Convert.ToInt32(Console.ReadLine());

        // TODO: Başlangıç değerlerini kullanarak bir Product oluştur
        
        // TODO: Oluşturulduktan sonra ürünün durumunu yazdır
        Console.WriteLine("After creation:");
        // Yazdırma biçimi: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
        
        // TODO: Fiyatı ve miktarı yeni değerlerle değiştir
        
        // TODO: Değişikliklerden sonra ürünün durumunu yazdır
        Console.WriteLine("After modifications:");
        // Yazdırma biçimi: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
    }
}
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