C# अकादमी · पाठ

अच्छे एक्सटेंशन डिज़ाइन करना

सर्वोत्तम प्रथाएँ अपनाएँ और समस्याओं से बचें।

पाठ 4, कुल 4 में से13 चरण

अच्छे एक्सटेंशन डिज़ाइन करना, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

पसंद आने वाले एक्सटेंशन की रूप-रचना

एक्सटेंशन विधियाँ शक्तिशाली होती हैं, लेकिन शक्ति के साथ दुरुपयोग का जोखिम भी आता है। अच्छे एक्सटेंशन प्रकार के स्वाभाविक हिस्से जैसे लगते हैं, आसानी से खोजे जा सकते हैं और कॉल करने वाले को कभी चौंकाते नहीं हैं। इस पाठ में व्यावहारिक दिशानिर्देश शामिल हैं।

पहचान नहीं, व्यवहार का विस्तार करें

ऐसे उपयोगी व्यवहारों के लिए एक्सटेंशन को प्राथमिकता दें, जो प्रसंस्करण-श्रृंखला में स्वाभाविक लगते हों। यदि कोई विधि वास्तव में आपके स्वामित्व वाले प्रकार से संबंधित है, तो उसे वास्तविक सदस्य बनाएँ।

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

जहाँ संभव हो, विधियों को शुद्ध रखें

नया मान लौटाने वाले और दुष्प्रभावों से बचने वाले एक्सटेंशन को समझना और एक-दूसरे से जोड़ना सबसे आसान होता है। लक्ष्य रखें: आगत लें और मान लौटाएँ।

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 रिसीवर पर एक्सटेंशन कॉल कर सकते हैं, इसलिए सोच-समझकर तय करें कि क्या होना चाहिए। या तो शून्य मान को सहजता से स्वीकार करें या स्पष्ट ArgumentNullException उत्पन्न करें।

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

आसानी से खोजे जाने योग्य नाम दें

डेवलपर डॉट टाइप करके और IntelliSense में विकल्प देखकर एक्सटेंशन खोजते हैं। परिणाम का वर्णन करने वाले स्पष्ट, क्रिया-आधारित नाम आपके सहायक तरीकों को आसानी से खोजने योग्य और स्वयं-व्याख्यात्मक बनाते हैं।

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

संबंधित एक्सटेंशन को एक साथ समूहित करें

एक ही अवधारणा से जुड़े एक्सटेंशन को एक अच्छे नाम वाले स्थिर वर्ग और नामस्थान में रखें। इससे आयात सार्थक रहते हैं और उपयोगकर्ता ठीक वही सहायक विधियाँ ला पाते हैं, जिनकी उन्हें आवश्यकता है।

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

चौंकाने वाला व्यवहार न छिपाएँ

जो एक्सटेंशन देखने में सरल लगे, लेकिन महँगा या स्थिति बदलने वाला काम करे, वह अपेक्षाओं का उल्लंघन करता है। लागत स्पष्ट रखें; यदि वह डेटाबेस से पूछताछ करता है या स्थिति बदलता है, तो उसके नाम में इसका संकेत दें।

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 का विस्तार करने से बचें

object का विस्तार करने से आपके तरीके प्रोग्राम के हर प्रकार में पहुँच जाते हैं और हर जगह IntelliSense अस्त-व्यस्त हो जाता है। इसके बजाय सबसे विशिष्ट उपयुक्त प्रकार या इंटरफ़ेस को लक्ष्य बनाएँ।

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

अनुक्रमों के लिए IEnumerable लौटाने को प्राथमिकता दें

अनुक्रम ऑपरेटरों के लिए IEnumerable<T> लौटाएँ और विलंबित निष्पादन का उपयोग करें। इससे संयोजन अच्छी तरह होता है और कॉल करने वालों को ऐसा डेटा तुरंत संग्रह में बदलने के लिए बाध्य नहीं होना पड़ता, जिसकी उन्हें आवश्यकता भी न हो।

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

अच्छे एक्सटेंशन की जाँच-सूची

एक्सटेंशन जारी करने से पहले पूछें: क्या नाम स्पष्ट है? क्या यह शुद्ध है या इसके दुष्प्रभाव स्पष्ट हैं? क्या शून्य मान संभाला गया है? क्या लक्ष्य प्रकार विशिष्ट है? क्या इसे उचित ढंग से समूहित किया गया है? यदि सभी उत्तर हाँ हैं, तो आपके पास ऐसा सहायक तरीका है जिसे दूसरे लोग इस्तेमाल करना पसंद करेंगे।

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

स्वयं करके देखें

जाँच-सूची लागू करें: विशिष्ट लक्ष्य प्रकार, स्पष्ट नाम, शून्य मान की सहनशीलता और शुद्ध परिणाम। यह छोटा एक्सटेंशन हर दिशानिर्देश पर खरा उतरता है।

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

त्वरित जाँच

रूप-रचना के दिशानिर्देश लागू करें।

पुनरावलोकन

अच्छी तरह बनाए गए एक्सटेंशन स्वाभाविक और पूर्वानुमेय लगते हैं।

  • ऐसे शुद्ध, मान लौटाने वाले सहायक तरीकों को प्राथमिकता दें, जिन्हें आसानी से जोड़ा जा सके।
  • शून्य मान के व्यवहार का निर्णय लें और उसका दस्तावेज़ बनाएँ।
  • आसानी से खोजे जाने के लिए स्पष्ट, क्रिया-आधारित नामों का उपयोग करें।
  • object के बजाय विशिष्ट प्रकारों या इंटरफ़ेस को लक्ष्य बनाएँ।
  • संबंधित सहायक तरीकों को समूहित करें और अनुक्रमों के लिए IEnumerable<T> लौटाएँ।
शुरुआत निःशुल्क

एआई शिक्षक के साथ C# सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
93
पाठ
346

अक्सर पूछे जाने वाले प्रश्न

क्या “अच्छे एक्सटेंशन डिज़ाइन करना” पाठ निःशुल्क है?

हाँ—“अच्छे एक्सटेंशन डिज़ाइन करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“अच्छे एक्सटेंशन डिज़ाइन करना” में मैं क्या सीखूँगा?

सर्वोत्तम प्रथाएँ अपनाएँ और समस्याओं से बचें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“अच्छे एक्सटेंशन डिज़ाइन करना” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. एक्सटेंशन मेथड परिभाषित करना
  2. इंटरफ़ेस और जेनेरिक का विस्तार
  3. एक्सटेंशन मेथड का समाधान
  4. अच्छे एक्सटेंशन डिज़ाइन करना
← C# अकादमी पर वापस जाएँ