Ö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.
Görev
KolayBireysel 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:GameSessionad alanında (namespace) birPlayersınıfı tanımlayın. Her oyuncunun kendine ait birUsername(string) veScore(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 olanGameName(string) ve kaç oyuncunun katıldığını sayan statik bir alan olanTotalPlayers(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 birSetGameName(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: 2Hangi 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}
}
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları