0Pricing
C# Academy · Pelajaran

Merancang Ekstensi yang Baik

Terapkan praktik terbaik dan hindari jebakan umum.

Merancang Ekstensi yang Baik adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Merancang Ekstensi yang Disukai Pengguna

Metode ekstensi memang kuat, tetapi kekuatan dapat mengundang penyalahgunaan. Ekstensi yang baik terasa seperti bagian alami dari tipe, mudah ditemukan, dan tidak pernah mengejutkan pemanggil. Pelajaran ini membahas pedoman praktis.

Perluas Perilaku, Bukan Identitas

Utamakan ekstensi untuk perilaku utilitas yang nyaman dibaca dalam alur pemrosesan. Jika sebuah metode benar-benar menjadi bagian dari tipe yang Anda miliki, jadikan metode tersebut anggota nyata.

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());
    }
}

Jaga Metode Tetap Murni Jika Memungkinkan

Ekstensi yang mengembalikan nilai baru dan menghindari efek samping paling mudah dipahami dan dirangkai. Usahakan masukan masuk dan nilai keluar.

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));
    }
}

Lindungi dari Masukan Null

Karena pemanggil dapat memanggil ekstensi pada penerima null, tentukan dengan sengaja apa yang harus terjadi. Toleransi null dengan baik atau lempar ArgumentNullException yang jelas.

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());
    }
}

Pilih Nama agar Mudah Ditemukan

Pengembang menemukan ekstensi dengan mengetik titik dan memindai IntelliSense. Nama yang jelas, berbentuk kata kerja, dan menjelaskan hasil membuat pembantu Anda mudah ditemukan serta mampu mendokumentasikan dirinya sendiri.

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());
    }
}

Kelompokkan Ekstensi Terkait Secara Padu

Tempatkan ekstensi untuk satu konsep dalam satu kelas statis dan ruang nama yang memiliki nama baik. Dengan begitu, impor tetap bermakna dan pengguna dapat mengambil tepat pembantu yang mereka inginkan.

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)));
    }
}

Jangan Sembunyikan Perilaku yang Mengejutkan

Ekstensi yang tampak ringan tetapi melakukan pekerjaan mahal atau bergantung pada keadaan akan melanggar ekspektasi. Buat biayanya terlihat; jika ekstensi tersebut mengueri basis data atau mengubah keadaan, berikan nama yang sesuai.

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));
    }
}

Hindari Memperluas object

Memperluas object mencemari setiap tipe dalam program dengan metode Anda dan memenuhi IntelliSense di mana-mana. Sebagai gantinya, targetkan tipe atau antarmuka paling spesifik yang masuk akal.

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());
    }
}

Utamakan Pengembalian IEnumerable untuk Urutan

Untuk operator urutan, kembalikan IEnumerable<T> dan gunakan eksekusi tertunda. Cara ini mudah dikomposisikan dan mencegah Anda memaksa pemanggil membuat data menjadi koleksi nyata yang mungkin tidak diperlukan.

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);
    }
}

Daftar Periksa Ekstensi yang Baik

Sebelum merilis ekstensi, tanyakan: Apakah namanya jelas? Apakah ekstensi itu murni atau efek sampingnya terlihat? Apakah null ditangani? Apakah tipe targetnya spesifik? Apakah pengelompokannya masuk akal? Jika semua jawabannya ya, Anda memiliki pembantu yang akan senang digunakan orang lain.

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"));
    }
}

Coba Sendiri

Terapkan daftar periksa: tipe target yang spesifik, nama yang jelas, toleransi terhadap null, dan hasil yang murni. Ekstensi kecil ini memenuhi setiap pedoman.

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));
    }
}

Pemeriksaan Singkat

Terapkan pedoman perancangan.

Ringkasan

Ekstensi yang dirancang dengan baik terasa alami dan dapat diprediksi.

  • Utamakan pembantu murni yang mengembalikan nilai dan mudah dirangkai.
  • Tentukan dan dokumentasikan perilaku terhadap null.
  • Gunakan nama yang jelas dan berbentuk kata kerja agar mudah ditemukan.
  • Targetkan tipe atau antarmuka yang spesifik, bukan object.
  • Kelompokkan pembantu yang terkait dan kembalikan IEnumerable<T> untuk urutan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Merancang Ekstensi yang Baik” gratis?

Ya — teks lengkap “Merancang Ekstensi yang Baik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Merancang Ekstensi yang Baik”?

Terapkan praktik terbaik dan hindari jebakan umum. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Merancang Ekstensi yang Baik” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mendefinisikan Metode Ekstensi
  2. Memperluas Antarmuka dan Generik
  3. Resolusi Metode Ekstensi
  4. Merancang Ekstensi yang Baik
← Kembali ke C# Academy