وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

پیاده سازی الگوی Lazy Initialization

Lazy Initialization یکی از الگوهای بسیار مفید در برنامه نویسی شئ گرا است. سناریوی استفاده از این الگو در برنامه نویسی این است که چطور میتوان یک کلاس را در سطح برنامه استفاده کرد اما نمونه سازی واقعی آن فقط در زمانی رخ دهد که واقعا از آن استفاده کرده باشیم؟
این سناریو شروعی برای پیاده سازی الگوی Lazy Initialization می باشد.خوشبختانه از دات نت 4 به بعد با معرفی کلاس Lazy این موضوع به سادگی قابل پیاده سازی است. کافی ست فقط در لحظه ی تعریف یک شئ، آن را به وسیله ی کلاس Lazy محصور کنیم و سپس در سطح کد زمانی که میخواهیم از آن شئ استفاده کنیم خصوصیت Value آن را مورد استفاده قرار دهیم.
برای مثال فرض کنید یک کلاس به اسم User دارید که خود آن شامل خصوصیت لیستی از کلاس Post است. در حالت عادی زمانی که یک User را واکشی میکنید لیست Post های آن نیز واکشی میشوند اما شاید ما در بدنه ی کلاس در چندین متد که User را واکشی کرده اند هیچ نیازی به لیست Post های آن نداشته باشیم بنابر این لیست Post ها را به صورت Lazy تعریف میکنیم.

یک مثال ساده :



class Test
{
 int[] _array;
 public Test()
 {
 Console.WriteLine("Test()");
 _array = new int[10];
 }
 public int Length
 {
 get
 {
 return _array.Length;
 }
 }
}

class Program
{
 static void Main()
 {
 // Create Lazy.
 Lazy<Test> lazy = new Lazy<Test>();

 // Show that IsValueCreated is false.
 Console.WriteLine("IsValueCreated = {0}", lazy.IsValueCreated);

 // Get the Value.
 // ... This executes Test().
 Test test = lazy.Value;

 // Show the IsValueCreated is true.
 Console.WriteLine("IsValueCreated = {0}", lazy.IsValueCreated);

 // The object can be used.
 Console.WriteLine("Length = {0}", test.Length);
 }
}

خروجی قطعه کد فوق به صورت زیر خواهد بود :



IsValueCreated = False
Test()
IsValueCreated = True
Length = 10

همانطور که مشخص است تا زمانی که از خصوصیت Value کلاس تعریف شده با Lazy استفاده نکنیم آن کلاس هیچگاه نمونه سازی نخواهد شد. این موضوع را میتوان از طریق خصوصیت IsValueCreated بررسی کرد.

نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.