İyi Genişletmeler Tasarlama
En iyi uygulamaları uygulayın ve tuzaklardan kaçının.
İyi Genişletmeler Tasarlama, 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.
İnsanların Severek Kullanacağı Uzantıları Tasarlama
Uzantı yöntemleri güçlüdür, ancak güç yanlış kullanıma da yol açabilir. İyi uzantılar türün doğal bir parçası gibi hissettirir, kolay bulunur ve çağıranı asla şaşırtmaz. Bu derste uygulamaya yönelik yönergeler ele alınır.
Kimliği Değil, Davranışı Genişletin
Bir işlem hattında okunaklı duran yardımcı davranışlar için uzantıları tercih edin. Bir yöntem gerçekten sahip olduğunuz bir türe aitse bunun yerine onu gerçek bir üye olarak tanımlayın.
using System;
public static class TimeExtensions
{
// A pleasant, focused helper
public static bool IsWeekend(this DayOfWeek day)
=> day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
}
public class Program
{
public static void Main()
{
Console.WriteLine(DayOfWeek.Sunday.IsWeekend());
Console.WriteLine(DayOfWeek.Monday.IsWeekend());
}
}Mümkün Olduğunda Yöntemleri Saf Tutun
Yeni bir değer döndüren ve yan etkilerden kaçınan uzantıları anlamak ve zincirlemek daha kolaydır. Girdi alıp değer döndürmeyi hedefleyin.
using System;
public static class StringExtensions
{
// Pure: depends only on input, returns a new string
public static string Truncate(this string s, int max)
=> s.Length <= max ? s : s.Substring(0, max) + "...";
}
public class Program
{
public static void Main()
{
Console.WriteLine("Extension methods are great".Truncate(10));
}
}Null Girdilere Karşı Önlem Alın
Çağıranlar bir uzantıyı null alıcı üzerinde çağırabildiği için ne olması gerektiğine bilinçli olarak karar verin. Ya null değerini uygun biçimde tolere edin ya da açık bir ArgumentNullException fırlatın.
using System;
public static class StringExtensions
{
public static string SafeUpper(this string s)
{
if (s is null) throw new ArgumentNullException(nameof(s));
return s.ToUpper();
}
}
public class Program
{
public static void Main()
{
try { ((string)null).SafeUpper(); }
catch (ArgumentNullException ex) { Console.WriteLine("Caught: " + ex.ParamName); }
Console.WriteLine("ok".SafeUpper());
}
}Kolay Bulunabilirlik İçin Adlandırın
Geliştiriciler, noktayı yazıp IntelliSense'i tarayarak uzantıları bulur. Sonucu açıklayan, fiil temelli ve açık adlar yardımcılarınızın kolay bulunmasını ve kendini açıklamasını sağlar.
using System;
using System.Collections.Generic;
public static class CollectionExtensions
{
public static bool HasItems<T>(this ICollection<T> c)
=> c != null && c.Count > 0;
}
public class Program
{
public static void Main()
{
var list = new List<int> { 1 };
Console.WriteLine(list.HasItems());
}
}İlgili Uzantıları Tutarlı Biçimde Gruplayın
Tek bir kavrama ait uzantıları iyi adlandırılmış tek bir statik sınıfta ve ad alanında toplayın. Böylece içe aktarmalar anlamlı kalır ve kullanıcılar tam olarak istedikleri yardımcıları alabilir.
using System;
using System.Collections.Generic;
public static class EnumerableExtensions
{
public static IEnumerable<T> TakeFirst<T>(this IEnumerable<T> source, int n)
{
int taken = 0;
foreach (var item in source)
{
if (taken++ >= n) yield break;
yield return item;
}
}
}
public class Program
{
public static void Main()
{
var nums = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(string.Join(",", nums.TakeFirst(2)));
}
}Şaşırtıcı Davranışları Gizlemeyin
Ucuz görünen ancak maliyetli veya durum bilgisi kullanan işler yapan bir uzantı beklentileri bozar. Maliyeti açıkça belirtin; veritabanını sorguluyor veya durumu değiştiriyorsa bunu adına yansıtın.
using System;
public static class MathExtensions
{
// Cheap and obvious: no hidden cost
public static int ClampMin(this int value, int min)
=> value < min ? min : value;
}
public class Program
{
public static void Main()
{
Console.WriteLine((-3).ClampMin(0));
Console.WriteLine(5.ClampMin(0));
}
}object Türünü Genişletmekten Kaçının
object türünü genişletmek, yönteminizi programdaki her türe ekleyerek her yerde IntelliSense'i gereksiz biçimde doldurur. Bunun yerine anlamlı olan en özel türü veya arayüzü hedefleyin.
using System;
public static class IntExtensions
{
// Specific to int, not object - far less noisy
public static string ToOrdinal(this int n)
{
if (n % 10 == 1 && n % 100 != 11) return n + "st";
if (n % 10 == 2 && n % 100 != 12) return n + "nd";
if (n % 10 == 3 && n % 100 != 13) return n + "rd";
return n + "th";
}
}
public class Program
{
public static void Main()
{
Console.WriteLine(1.ToOrdinal());
Console.WriteLine(22.ToOrdinal());
}
}Diziler İçin IEnumerable Döndürmeyi Tercih Edin
Dizi işleçlerinde IEnumerable<T> döndürün ve ertelenmiş yürütme kullanın. Bu yaklaşım iyi birleşir ve çağıranları ihtiyaç duymayabilecekleri verileri önceden oluşturmaya zorlamaz.
using System;
using System.Collections.Generic;
public static class SeqExtensions
{
public static IEnumerable<int> Doubled(this IEnumerable<int> source)
{
foreach (var n in source) yield return n * 2;
}
}
public class Program
{
public static void Main()
{
var nums = new List<int> { 1, 2, 3 };
foreach (var n in nums.Doubled()) Console.WriteLine(n);
}
}İyi Uzantılar İçin Kontrol Listesi
Bir uzantıyı yayımlamadan önce şunları sorun: Adı açık mı? Saf mı, yoksa yan etkileri belirgin mi? Null durumu ele alınıyor mu? Hedef tür belirli mi? Mantıklı biçimde gruplanmış mı? Tüm yanıtlar evetse başkalarının kullanmaktan hoşlanacağı bir yardımcınız var demektir.
using System;
public static class StringExtensions
{
public static string OrDefault(this string s, string fallback)
=> string.IsNullOrEmpty(s) ? fallback : s;
}
public class Program
{
public static void Main()
{
Console.WriteLine("".OrDefault("N/A"));
Console.WriteLine("value".OrDefault("N/A"));
}
}Kendiniz Deneyin
Kontrol listesini uygulayın: belirli bir hedef tür, açık bir ad, null toleransı ve saf bir sonuç. Bu küçük uzantı tüm yönergeleri karşılıyor.
using System;
using System.Collections.Generic;
public static class DictionaryExtensions
{
// Clear name, specific type, null-safe, pure
public static TValue GetOrDefault<TKey, TValue>(
this IReadOnlyDictionary<TKey, TValue> dict, TKey key, TValue fallback)
{
if (dict == null) return fallback;
return dict.TryGetValue(key, out var value) ? value : fallback;
}
}
public class Program
{
public static void Main()
{
var ages = new Dictionary<string, int> { ["Ann"] = 30 };
Console.WriteLine(ages.GetOrDefault("Ann", -1));
Console.WriteLine(ages.GetOrDefault("Bob", -1));
}
}Hızlı Kontrol
Tasarım yönergelerini uygulayın.
Özet
İyi tasarlanmış uzantılar doğal ve öngörülebilir hissettirir.
- İyi zincirlenen, saf ve değer döndüren yardımcıları tercih edin.
- Null davranışına karar verin ve bunu belgeleyin.
- Kolay bulunabilirlik için açık, fiil temelli adlar kullanın.
objectyerine belirli türleri veya arayüzleri hedefleyin.- İlgili yardımcıları gruplayın ve diziler için
IEnumerable<T>döndürün.
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
“İyi Genişletmeler Tasarlama” dersi ücretsiz mi?
Evet — “İyi Genişletmeler Tasarlama” 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.
“İyi Genişletmeler Tasarlama” dersinde ne öğreneceğim?
En iyi uygulamaları uygulayın ve tuzaklardan kaçının. 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.
“İyi Genişletmeler Tasarlama” 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
- Genişletme Yöntemlerini Tanımlama
- Arabirimleri ve Generics'i Genişletme
- Genişletme Yöntemi Çözümlemesi
- İyi Genişletmeler Tasarlama