Menu
Coddy logo textTech

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 (Properties), C#'ta kapsüllemeyi (encapsulation) uygulamak için kullanılan birincil araçtır. Alanları (fields) doğrudan açığa çıkarmak yerine, onları verilerin nasıl erişildiğini ve değiştirildiğini kontrol eden özelliklerle sarmalarsınız.

Bu desen, erişimcilerinde doğrulama veya mantık içeren genel bir özellik (public property) ile özel bir alanı (private field) 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 minimumu
            else
                celsius = value;
        }
    }
}

Artık harici kod imkansız bir sıcaklık değeri ayarlayamaz. Bu özellik bir bekçi görevi görerek nesnenizin her zaman geçerli bir durumda kalmasını sağlar. Bu, iş başındaki kapsüllemedir (encapsulation); dahili veriler korunurken kontrollü bir arayüz aracılığıyla hala erişilebilir durumdadır.

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 dahili olarak 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 (encapsulation) temel bir avantajıdır.

challenge icon

Görev

Kolay

Veri bütünlüğünü korumak için özellikleri (properties) kullanan bir ürün envanter sistemi oluşturalım. Fiyatların asla negatif olamayacağı ve miktarların her zaman geçerli sınırlar içinde tutulduğu bir sınıf oluşturacaksınız - bu, özelliklerin verileriniz için nasıl bekçi görevi gördüğünü gösterecektir.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Product.cs: Inventory ad alanı (namespace) içinde, özellikler aracılığıyla doğrulama yaparak ürün bilgilerini yöneten bir Product sınıfı oluşturun. Ürününüzün şunlara ihtiyacı vardır:
    • Fiyatın asla 0'ın altına düşmemesini sağlayan, genel bir Price özelliğine sahip özel bir price alanı (decimal) - eğer birisi negatif bir fiyat ayarlamaya çalışırsa, bunun yerine 0 olarak saklanmalıdır
    • Değerleri 0 ile 1000 arasında tutan, genel bir Quantity özelliğine sahip özel bir quantity alanı (int) - 0'ın altındaki değerler 0 olur, 1000'in üzerindeki değerler 1000 olur
    • Genel bir otomatik uygulanan özellik (auto-implemented property) Name (string)
    • Price * Quantity değerini döndüren, hesaplanmış salt okunur bir özellik TotalValue
    İsim, fiyat ve miktar (bu sırayla) kabul eden ve doğrulamanın uygulanması için tüm değerleri özellikler üzerinden ayarlayan bir yapıcı (constructor) ekleyin.
  • Program.cs: Ana dosyanızda, girdi değerlerini kullanarak bir Product oluşturun. Ardından, geçersiz olabilecek ek girdi değerleriyle fiyatı ve miktarı değiştirmeye çalışın. Ö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ın.

Beş girdi alacaksınız:

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

Çıktıyı şu formatta yazdırın:

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 nasıl 0 olduğuna ve 1500 miktarının nasıl 1000 ile sınırlandırıldığına dikkat edin. Özellikleriniz nesneyi geçersiz durumlardan koruyor - işte bu kapsülleme (encapsulation) iş başında!

Kopya kağıdı

Özellikler, get ve set erişimcileri aracılığıyla kontrollü erişim sağlayarak özel alanları sarmalar; böylece doğrulama ve kapsülleme imkanı sunar:

public class Temperature
{
    private double celsius;
    
    public double Celsius
    {
        get { return celsius; }
        set
        {
            if (value < -273.15)
                celsius = -273.15;
            else
                celsius = value;
        }
    }
}

Özellikler, dahili alanlara dayalı olarak değerler hesaplayabilir:

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

Salt okunur özellikler set erişimcisini içermez, bu da yalnızca hesaplanmış veya saklanan değerlerin alınmasına izin verir.

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şturun
        
        // TODO: Oluşturulduktan sonra ürün durumunu yazdırın
        Console.WriteLine("After creation:");
        // Yazdırma formatı: {Name}: Price={Price}, Qty={Quantity}, Total={TotalValue}
        
        // TODO: Fiyatı ve miktarı yeni değerlerle değiştirin
        
        // TODO: Değişikliklerden sonra ürün durumunu yazdırın
        Console.WriteLine("After modifications:");
        // Yazdırma formatı: {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