Menu
Coddy logo textTech

Örnek vs Statik Veri

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

Artık statik üyeleri anladığınıza göre, örnek verisi (instance data) ile statik verinin (static data) ne zaman kullanılacağını netleştirelim. Bu karar, sınıfınızın bilgiyi nasıl sakladığını ve paylaştığını şekillendirir.

Örnek verisi her bir nesneye bireysel olarak aittir. Her nesne kendi kopyasını alır ve bir nesne üzerindeki değişiklikler diğerlerini etkilemez:

public class BankAccount
{
    public string Owner { get; set; }      // Örnek - her hesap için benzersiz
    public decimal Balance { get; set; }   // Örnek - her hesap için benzersiz
}

Her bir BankAccount kendi sahibine ve bakiyesine sahiptir. Bu mantıklıdır çünkü farklı hesaplar farklı kişiler için farklı tutarlar tutar.

Statik veriler sınıfın kendisine aittir ve tüm örnekler arasında paylaşılır:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // Statik - tümü için aynı
    public static int TotalAccounts = 0;         // Statik - tüm hesapları takip eder
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

Faiz oranı her hesap için eşit şekilde uygulanır, bu nedenle statik olması mantıklıdır. Toplam hesap sayacı, bireysel hesap verilerini değil, sınıf genelindeki bilgileri takip eder.

Basit bir kural: Eğer veri belirli bir nesneyi tanımlıyorsa, onu instance yapın. Eğer sınıfın tamamını tanımlıyorsa veya paylaşılması gerekiyorsa, onu static yapın. Bunları yanlış bir şekilde karıştırmak, verilerin nesneler arasında beklenmedik şekilde değiştiği veya ihtiyaç duyulduğunda erişilemediği hatalara yol açar.

challenge icon

Görev

Kolay

Bireysel oyunculara ait veriler ile tüm oyun genelinde paylaşılan veriler arasındaki farkı gösteren bir oyun oturumu takipçisi oluşturalım.

Kodunuzu düzenlemek için iki dosya oluşturacaksınız:

  • Player.cs: GameSession ad alanında (namespace) bir Player sınıfı tanımlayın. Her oyuncunun kendine ait bir Username (string) ve Score (int) değeri vardır; bunlar her oyuncu için benzersizdir. Sınıf ayrıca tüm oyuncular için geçerli olan bilgileri de takip etmelidir: herkesin oynadığı oyunun adını saklayan statik bir alan olan GameName (string) ve kaç oyuncunun katıldığını sayan statik bir alan olan TotalPlayers (int). Kullanıcı adını ve başlangıç puanını alan ve toplam oyuncu sayısını otomatik olarak artıran bir yapıcı (constructor) ekleyin. Oyun adını yapılandırmak için statik bir SetGameName(string name) yöntemi ekleyin.
  • Program.cs: Ana dosyanızda oyunu kurun ve girdilere göre oyuncuları oluşturun. Önce oyun adını ayarlayın, ardından iki oyuncu oluşturun ve paylaşılan oyun verileriyle birlikte bireysel bilgilerini görüntüleyin.

Beş girdi alacaksınız:

  • Oyun adı
  • Birinci oyuncunun kullanıcı adı
  • Birinci oyuncunun başlangıç puanı
  • İkinci oyuncunun kullanıcı adı
  • İkinci oyuncunun başlangıç puanı

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

Game: {GameName}
Player: {Username}, Score: {Score}
Player: {Username}, Score: {Score}
Total Players: {TotalPlayers}

Örneğin, girdiler BattleArena, DragonSlayer, 1500, ShadowNinja ve 2200 ise çıktı şöyle olmalıdır:

Game: BattleArena
Player: DragonSlayer, Score: 1500
Player: ShadowNinja, Score: 2200
Total Players: 2

Hangi verilerin örnek tabanlı (her oyuncu için farklı) ve hangilerinin statik (tüm oyuncular arasında paylaşılan) olması gerektiğini dikkatlice düşünün. Oyun adı ve toplam oyuncu sayısı oturumun tamamını tanımlarken, kullanıcı adı ve puan her bireye özeldir.

Kopya kağıdı

Her nesneye özgü olan özellikler için örnek verilerini (instance data) kullanın:

public class BankAccount
{
    public string Owner { get; set; }      // Her hesabın kendi sahibi vardır
    public decimal Balance { get; set; }   // Her hesabın kendi bakiyesi vardır
}

Bir sınıfın tüm örnekleri arasında paylaşılan özellikler için statik verileri (static data) kullanın:

public class BankAccount
{
    public static decimal InterestRate = 0.05m;  // Tüm hesaplar için aynıdır
    public static int TotalAccounts = 0;         // Tüm hesapları takip eder
    
    public string Owner { get; set; }
    public decimal Balance { get; set; }
}

Karar kuralı: Veri belirli bir nesneyi tanımlıyorsa örnek verilerini kullanın. Sınıfın tamamını tanımlıyorsa veya paylaşılması gerekiyorsa statik verileri kullanın.

Kendin dene

using System;

namespace GameSession
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Girdileri oku
            string gameName = Console.ReadLine();
            string username1 = Console.ReadLine();
            int score1 = Convert.ToInt32(Console.ReadLine());
            string username2 = Console.ReadLine();
            int score2 = Convert.ToInt32(Console.ReadLine());

            // TODO: Statik yöntemi kullanarak oyun adını ayarla

            // TODO: Giriş verileriyle iki Player nesnesi oluşturun

            // TODO: Çıktıyı istenen formatta yazdırın
            // Game: {GameName}
            // Player: {Username}, Score: {Score}
            // Player: {Username}, Score: {Score}
            // Total Players: {TotalPlayers}
        }
    }
}
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