কম্পিউটার টিউটোরিয়াল

C#-এ IDisposable ডিজাইন প্যাটার্ন বাস্তবায়ন

আমাদেরকে IDisposable ডিজাইন প্যাটার্ন (বা Dispose Pattern) ব্যবহার করা উচিত যখন আমাদের অনম্যানেজড অবজেক্ট ডিসপোজ করতে হয়।

IDisposable ডিজাইন প্যাটার্ন ইমপ্লিমেন্ট করতে, যে ক্লাসটি অনম্যানেজড অবজেক্টের সাথে সরাসরি বা পরোক্ষভাবে কাজ করে সেটি IDisposable ইন্টারফেস ইমপ্লিমেন্ট করবে। এবং IDisposable ইন্টারফেসের মধ্যে ঘোষিত Dispose মেথড ইমপ্লিমেন্ট করবে। আমরা সরাসরি অনম্যানেজড অবজেক্টের সাথে কাজ করি না। কিন্তু আমরা ম্যানেজড ক্লাসের সাথে কাজ করি, যা সরাসরি অনম্যানেজড অবজেক্টের সাথে কাজ করে। উদাহরণ: ফাইল হ্যান্ডলার, কানেকশন স্ট্রিং, HTTP স্ট্রিম ইত্যাদি।

এই প্যাটার্নের গুরুত্বপূর্ণ দিক হলো এটি ইনহেরিট করা ক্লাসগুলোর জন্য IDisposable প্যাটার্ন ফলো করা সহজ করে দেয়। এর কারণ হলো ওভাররাইডযোগ্য Dispose মেথডের ইমপ্লিমেন্টেশন। এই প্যাটার্ন ফাইনালাইজার মেথড (অথবা C#-এ ডেস্ট্রাক্টর) ব্যবহারের পরামর্শ দেয়। তবে, ফাইনালাইজার ব্যবহার করলে তার পারফরম্যান্স ইমপ্লিকেশনস সঠিকভাবে ম্যানেজ করতে হয়।

উদাহরণ

static class Program
{
    static void Main(string[] args)
    {
        using var serviceProxy = new ServiceProxy(null);
        serviceProxy.Get();
        serviceProxy.Post("");
        Console.ReadLine();
    }
}
public class ServiceProxy : System.IDisposable
{
    private readonly HttpClient httpClient;
    private bool disposed;
    public ServiceProxy(IHttpClientFactory httpClientFactory)
    {
        httpClient = httpClientFactory.CreateClient();
    }
    ~ServiceProxy() { Dispose(false); }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposed) return;
        if (disposing)
        {
            // Dispose managed objects
            httpClient.Dispose();
        }
        // Dispose unmanaged objects
        disposed = true;
    }
    public void Get() { var response = httpClient.GetAsync(""); }
    public void Post(string request) { var response = httpClient.PostAsync("", new StringContent(request)); }
}

ব্যাখ্যা: এই প্যাটার্নে Dispose(bool disposing) ওভাররাইডযোগ্য মেথড থাকে। disposing == true মানে ম্যানেজড রিসোর্স ডিসপোজ করতে হবে (যা ব্যবহারকারী কল করল)। disposing == false মানে ফাইনালাইজার থেকে কল হয়েছে, শুধু অনম্যানেজড রিসোর্স ডিসপোজ করবে। GC.SuppressFinalize(this) ফাইনালাইজার কল না হয় তার জন্য।

  1. অ্যান্ড্রয়েড TextInputLayout বাস্তবায়নের পদ্ধতি

  2. অ্যান্ড্রয়েডে Pull-to-Refresh বাস্তবায়নের পদ্ধতি

  3. C++-এ কম্পোজিট ডিজাইন প্যাটার্ন (Composite Design Pattern)

  4. পাইথনে প্যাটার্ন প্রিন্ট করার পদ্ধতি