Statik ve Örnek Tasarımı
Statik durumun ne zaman uygun olduğuna karar verin.
Statik ve Örnek Tasarımı, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Bir Tasarım Kararı
statik ile örnek arasında seçim yapmak bir tasarım kararıdır. Temel soru şudur: Davranış her nesneye özgü duruma mı bağlı, yoksa yalnızca girdilerine mi?
using System;
class Program
{
// Depends only on inputs -> good static method
static int Max(int a, int b) => a > b ? a : b;
static void Main()
{
Console.WriteLine(Max(3, 8));
}
}Durumsuz Mantık için Statik Kullanın
Bir yöntem örnek alanlarına ihtiyaç duymuyor ve yalnızca girdileri dönüştürüyorsa onu static yapın. Matematik yardımcıları ve biçimlendiriciler buna iyi örnektir.
using System;
static class Convert2
{
public static double MilesToKm(double miles) => miles * 1.60934;
}
class Program
{
static void Main()
{
Console.WriteLine(Convert2.MilesToKm(10).ToString("0.0") + " km");
}
}Durum için Örnek Kullanın
Davranış nesneye göre değişen verilere bağlıysa bir örnek kullanın. Her nesne kendi durumunu taşır.
using System;
class Counter
{
private int _count;
public void Increment() => _count++;
public int Value => _count;
}
class Program
{
static void Main()
{
var a = new Counter();
var b = new Counter();
a.Increment();
a.Increment();
b.Increment();
Console.WriteLine("a=" + a.Value + ", b=" + b.Value);
}
}Paylaşılan Durum Genel Durumdur
Statik bir alan fiilen geneldir. Bir programın birçok bölümü bu alana okuyup yazdığında fark edilmesi zor hatalara yol açabilir. Her kullanıcının kendi kopyasına ihtiyaç duyduğu durumlarda örnek durumunu tercih edin.
using System;
class BadCart
{
public static int Items; // shared by EVERYONE -> usually wrong for a cart
}
class Program
{
static void Main()
{
BadCart.Items++;
BadCart.Items++;
Console.WriteLine("All carts share: " + BadCart.Items);
}
}Sınanabilirlik
Saf statik yöntemleri sınamak kolaydır: aynı girdi, aynı çıktı. Ancak değiştirilebilir statik durum, sınamalar arasında sızar ve bunları kırılgan hâle getirir.
using System;
static class Calc
{
public static int Add(int a, int b) => a + b; // trivially testable
}
class Program
{
static void Main()
{
Console.WriteLine(Calc.Add(2, 2) == 4 ? "pass" : "fail");
}
}Fabrika Yardımcıları için Statik Kullanım
Statik fabrika yöntemleri, açıklayıcı bir adla yapılandırılmış örnekler oluşturmanın temiz bir yoludur.
using System;
class Color
{
public int R, G, B;
private Color(int r, int g, int b) { R = r; G = g; B = b; }
public static Color Red() => new Color(255, 0, 0);
public static Color White() => new Color(255, 255, 255);
}
class Program
{
static void Main()
{
var c = Color.Red();
Console.WriteLine(c.R + "," + c.G + "," + c.B);
}
}new'den Kaçınmak için Statiği Kullanmayın
Nesne oluşturmaktan kaçınmak için her şeyi statik yapmayın. Bir tür durum taşıyan bir şeyi modelliyorsa, örnekler bu durumu birbirinden yalıtılmış ve güvenli tutar.
using System;
class Player
{
public string Name;
public int Health = 100;
public void TakeDamage(int d) => Health -= d;
}
class Program
{
static void Main()
{
var p1 = new Player { Name = "A" };
var p2 = new Player { Name = "B" };
p1.TakeDamage(30);
Console.WriteLine(p1.Name + ": " + p1.Health + ", " + p2.Name + ": " + p2.Health);
}
}İkisini Uygun Şekilde Birleştirmek
Birçok sınıf, paylaşılan sabitler veya sayaçlar için statik üyeler, nesneye özgü veriler içinse örnek üyeleri kullanır. Bu birleşim tamamen yerleşik bir kullanımdır.
using System;
class Invoice
{
private static int _seq = 1000;
public readonly int Number;
public decimal Amount;
public Invoice(decimal amount)
{
Number = _seq++;
Amount = amount;
}
}
class Program
{
static void Main()
{
var i1 = new Invoice(50m);
var i2 = new Invoice(75m);
Console.WriteLine(i1.Number + " / " + i2.Number);
}
}Eşzamanlılık Konusu
Paylaşılan statik duruma aynı anda birden fazla iş parçacığı erişebilir ve bu da yarış durumları riski doğurur. Tek bir iş parçacığıyla sınırlandırılmış örnek durumu varsayılan olarak daha güvenlidir.
using System;
class SafeCalc
{
// No shared mutable state -> naturally thread-safe
public static long Factorial(int n)
{
long result = 1;
for (int i = 2; i <= n; i++) result *= i;
return result;
}
}
class Program
{
static void Main()
{
Console.WriteLine(SafeCalc.Factorial(5));
}
}Basit Bir Pratik Kural
Statik = türe ait olan ve nesneye özgü durum kullanmayan davranış. Örnek = belirli bir nesneyi okuyan veya değiştiren davranış. Emin değilseniz durum taşıyan her şey için örneği tercih edin.
using System;
class Temperature
{
public double Celsius; // instance state
public static double ToF(double c) => c * 9 / 5 + 32; // stateless helper
}
class Program
{
static void Main()
{
var t = new Temperature { Celsius = 30 };
Console.WriteLine(Temperature.ToF(t.Celsius));
}
}Birleştirelim
İyi tasarım, durumsuz yardımcıları (statik) durum taşıyan modellerden (örnek) ayırır ve paylaşılan değiştirilebilir durumu bilinçli olarak en aza indirir.
using System;
static class TaxRules
{
public static decimal Apply(decimal amount, decimal rate) => amount + amount * rate;
}
class Sale
{
public decimal Subtotal;
public decimal Total(decimal rate) => TaxRules.Apply(Subtotal, rate);
}
class Program
{
static void Main()
{
var s = new Sale { Subtotal = 100m };
Console.WriteLine(s.Total(0.2m));
}
}Kısa Kontrol
Statik ile örnek tasarımı arasındaki farkı anlayıp anlamadığınızı sınayın.
Özet
Yalnızca girdilere bağlı olan durumsuz mantık için statik (yardımcılar, fabrikalar, sabitler), nesneye özgü duruma bağlı davranış içinse örnek seçin. Statik değiştirilebilir durum fiilen geneldir, sınanması daha zordur ve eşzamanlılık hataları riski taşır; bu nedenle kullanımını en aza indirin ve bilinçli karar verin.
using System;
static class Util { public static int Sq(int n) => n * n; }
class Box { public int Size; public int Area() => Util.Sq(Size); }
class Program
{
static void Main()
{
var box = new Box { Size = 4 };
Console.WriteLine(box.Area());
}
}Sıkça Sorulan Sorular
“Statik ve Örnek Tasarımı” dersi ücretsiz mi?
Evet — “Statik ve Örnek Tasarımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Statik ve Örnek Tasarımı” dersinde ne öğreneceğim?
Statik durumun ne zaman uygun olduğuna karar verin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Statik ve Örnek Tasarımı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Statik Yöntemler ve Alanlar
- Yardımcı Programlar için Statik Sınıflar
- Sabitler ve readonly Alanları
- Statik ve Örnek Tasarımı