Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi
C# 6'da etiket enum'u ve küçük sınıflar kullanarak ayrıştırılmış bir birleşim modelleyin, fabrika yöntemleri oluşturun ve varyantları varsayılan istisna fırlatmayla birlikte switch üzerinden işleyin.
Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 3. 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 3 dersten oluşur.
C# 6'da DU fikri
Amaç: C# 6'da küçük bir ayırt edilmiş birleşim oluşturmak.
- Etkin durumu belirten etiket enum'u
- Verileri taşıyan küçük durum sınıfları
- Geçerli durumları oluşturmak için Factory yöntemleri
- Tüm varyantları işlemek için seçim + varsayılan fırlatma
Etiket + oluşturucular
Yalnızca geçerli durumları oluşturmak için bir etiket enum'u ve oluşturucu yöntemleri kullanınız; diğer durumlara ait alanlar kullanılmadan kalır.
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
// per-case data (only one is meaningful per instance)
public string CardLast4; // for Card
public string Iban; // for Wire
private Payment() { }
// factories keep invariants
public static Payment Cash()
{
Payment p = new Payment();
p.Kind = PaymentKind.Cash;
return p;
}
public static Payment Card(string last4)
{
if (string.IsNullOrEmpty(last4) || last4.Length != 4)
throw new ArgumentException("last4 must be 4 digits", "last4");
Payment p = new Payment();
p.Kind = PaymentKind.Card;
p.CardLast4 = last4;
return p;
}
public static Payment Wire(string iban)
{
if (string.IsNullOrEmpty(iban))
throw new ArgumentException("iban must not be empty", "iban");
Payment p = new Payment();
p.Kind = PaymentKind.Wire;
p.Iban = iban;
return p;
}
}
public class Program
{
public static void Main(string[] args)
{
Payment a = Payment.Cash();
Payment b = Payment.Card("1234");
Payment c = Payment.Wire("TR00BANKIBAN");
Console.WriteLine(a.Kind + ", " + b.Kind + ", " + c.Kind);
}
}
Varyantları işleme
Etiket üzerindeki klasik seçim deyimi, işlemenin açıkça görülmesini sağlar. Varsayılan fırlatma, işlenmemiş varyantları sınamalar sırasında görünür kılar.
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
public string CardLast4;
public string Iban;
public static Payment Cash()
{
Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p;
}
public static Payment Card(string last4)
{
if (string.IsNullOrEmpty(last4) || last4.Length != 4) throw new ArgumentException("last4");
Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p;
}
public static Payment Wire(string iban)
{
if (string.IsNullOrEmpty(iban)) throw new ArgumentException("iban");
Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p;
}
}
public static class Exhaustive
{
public static Exception Unhandled(object x)
{
return new InvalidOperationException("Unhandled case: " + x);
}
}
public class Program
{
static string Describe(Payment p)
{
switch (p.Kind)
{
case PaymentKind.Cash: return "Cash";
case PaymentKind.Card: return "Card ****" + p.CardLast4;
case PaymentKind.Wire: return "Wire " + p.Iban;
default: throw Exhaustive.Unhandled(p.Kind);
}
}
public static void Main(string[] args)
{
Console.WriteLine(Describe(Payment.Card("9876")));
}
}
Match yardımcısı (ziyaretçi benzeri)
Küçük bir Match yardımcısı seçimi merkezileştirir ve bir değer döndürerek çağrı noktalarını temiz tutar.
using System;
public enum PaymentKind { Cash, Card, Wire }
public sealed class Payment
{
public PaymentKind Kind;
public string CardLast4;
public string Iban;
public static Payment Cash() { Payment p = new Payment(); p.Kind = PaymentKind.Cash; return p; }
public static Payment Card(string last4) { Payment p = new Payment(); p.Kind = PaymentKind.Card; p.CardLast4 = last4; return p; }
public static Payment Wire(string iban) { Payment p = new Payment(); p.Kind = PaymentKind.Wire; p.Iban = iban; return p; }
}
public static class PaymentMatch
{
public static T Match<T>(
Payment p,
Func<T> onCash,
Func<string, T> onCard,
Func<string, T> onWire)
{
switch (p.Kind)
{
case PaymentKind.Cash: return onCash();
case PaymentKind.Card: return onCard(p.CardLast4);
case PaymentKind.Wire: return onWire(p.Iban);
default: throw new InvalidOperationException("Unhandled: " + p.Kind);
}
}
}
public class Program
{
public static void Main(string[] args)
{
Payment p = Payment.Card("1234");
string summary = PaymentMatch.Match(
p,
delegate { return "Cash"; },
delegate(string last4) { return "Card ****" + last4; },
delegate(string iban) { return "Wire " + iban; }
);
Console.WriteLine(summary);
}
}
Oluşturucularla değişmezler
Oluşturucular değişmezleri güvence altına alır: her durum yalnızca anlamlı alanlarını başlatır; geçersiz girişler erkenden reddedilir.
using System;
public enum ResultKind { Ok, Error }
public sealed class Result
{
public ResultKind Kind;
public string Message; // only for Error
public int Value; // only for Ok
private Result() { }
public static Result Ok(int value)
{
Result r = new Result();
r.Kind = ResultKind.Ok;
r.Value = value;
r.Message = null;
return r;
}
public static Result Error(string message)
{
if (string.IsNullOrEmpty(message)) throw new ArgumentException("message");
Result r = new Result();
r.Kind = ResultKind.Error;
r.Message = message;
r.Value = 0;
return r;
}
}
public class Program
{
static string Show(Result r)
{
switch (r.Kind)
{
case ResultKind.Ok: return "OK: " + r.Value;
case ResultKind.Error: return "ERROR: " + r.Message;
default: throw new InvalidOperationException("Unhandled: " + r.Kind);
}
}
public static void Main(string[] args)
{
Console.WriteLine(Show(Result.Ok(5)));
Console.WriteLine(Show(Result.Error("Boom")));
}
}
İpuçları ve ödünler
İpuçları:
- Küçük, odaklanmış durumları ve oluşturucuları tercih ediniz.
- Kodu DRY tutmak için varyantları tek bir yerde (seçim yardımcısında) işleyiniz.
- Sınamalarda eksik durumları ortaya çıkarmak için varsayılan fırlatmayı koruyunuz.
Ödünler: Modern kayıt türlerine göre daha fazla tekrar eden kod içerir, ancak açıktır ve C# 6 ile uyumludur.
DU taklidi yaklaşımı
Özet
Özet: Varyantları bir etiket enum'uyla modelleyiniz, geçerli durumları oluşturucularla kurunuz ve çalışma zamanında kapsamlılığı sağlamak için işlemeyi bir seçimde (varsayılan durum fırlatır) merkezileştiriniz.
Yapay zeka eğitmeniyle C# öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 93
- Dersler
- 346
Sıkça Sorulan Sorular
“Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi” dersi ücretsiz mi?
Evet — “Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi” 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 3 dersten oluşur.
“Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi” dersinde ne öğreneceğim?
C# 6'da etiket enum'u ve küçük sınıflar kullanarak ayrıştırılmış bir birleşim modelleyin, fabrika yöntemleri oluşturun ve varyantları varsayılan istisna fırlatmayla birlikte switch üzerinden işleyin. 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, 3 dersinin 3. dersidir.
“Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi” 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
- is kalıpları; ilişkisel ve mantıksal kalıplar (C# 6 öykünmesi)
- switch ifadeleri; when ile tüm durumların denetlenmesi (C# 6 öykünmesi)
- Ayrıştırılmış birleşimlerle alan modelleme (kayıtlar) — C# 6 öykünmesi