‫کاربردهای جذاب Extension Methods

‫یک نمونه Extension Method برای تبدیل تاریخ میلادی به هجریهمیشه فکر می‌کردم اگر Object Oriented را به طور کامل در برنامه‌ها رعایت کرده و برای ارتباط با دیتابیس از یک ORM خوب مثل NHibernate استفاده کنیم می‌توان به راحتی از امکانات دنیای رویایی شی گرا در کار با آبجکت‌های اطلاعاتی استفاده کرد. یعنی آبجکت‌های اطلاعاتی مثل اطلاعات شخص، سند حسابداری، حواله انبارداری و… هم حاوی اطلاعات و فیلدهای مربوطه باشند هم حاوی متودهای انجام عملیات مثل ذخیره، محاسبه و… باشند (Encapsulation). اما گذشت زمان به من ثابت کرد نباید خیلی امیدوار باشم. چون خیلی از شرکت‌ها و گروه‌های تولید نرم‌افزار از معماری‌های SOA استفاده می‌کنند. بعضی از این معماری‌ها برای دسترسی به دستیابی الزام به استفاده از DMS و DAO دارند. آنها همین طور Business Entityها را در کلاس‌های مجزا نگه‌داری می‌کنند. همه این‌ها یعنی این که فیلدهای نگهداری اطلاعات، متودهای به روز رسانی اطلاعات در دیتابیس و متودهای پردازش اطلاعات هر کدام در یک کلاس (آبجکت) جداگانه قرار دارند.

با همه این حرف‌ها با ارائه‌ی Extension Methodها در C# 2008 روزنه امیدی برای رفع این مشکل باز شد (نظر شخصی من). با کمک Extension Methodها می‌توان تعدادی متود استاتیک دلخواه را در یک کلاس کمکی ایجاد کرده و آنها را به فهرست متودهای یک کلاس دیگر اضافه کرد بدون آن که مجبور به دستکاری کلاس اصلی شویم. مثلا فرض کنید کلاس اصلی شما (u1) صرفاً دارای دو متود m1()‎ و m2()‎ باشد. حال می‌توان در کلاس کمکی (h1) متود s1()‎ را طوری تعریف کرد که متود s1()‎ به کلاس u1()‎ اضافه شود. یعنی کلاس u1 از دید کاربر دارای سه متود m1()‎ و m2()‎ و s1()‎ باشد. به این ترتیب برای رفع مشکل فوق‌الذکر می‌توان یک سری Extension Methods ایجاد کرد که متودهای به روز رسانی اطلاعات دیتابیسی و متودهای پردازش اطلاعات را به کلاس‌های Business Entity اضافه کند.

یکی دیگر از کاربردهای جذاب Extension Methodها خواناسازی کد از طریق افزودن متودهای مورد نظر شما به کلاس‌های پایه دات‌نت است. مثلاً فرض کنید یک متود طولانی به اسم MyClass.Instance.ExceptionLogger.GetLongMessage()‎ دارید. این متود یک آبجکت از نوع System.Exception گرفته و پیغام‌های خودش و همه Inner Exceptionهای داخلی آن را برمی‌گرداند. حال با کمک یک Extension Method ساده می‌توان این قابلیت را با یک اسم کوتا‌ه‌تر مثل GetLongMessage()‎ به کلاس System.Exception افزود. یعنی از این به بعد در برخورد با یک آبجکت از نوع System.Exception مثل ex می‌توان با استفاده از کد ex.GetLongMessage()‎ متود اصلی MyClass.Instance.ExceptionLogger.GetLongMessage()‎ را بدون تایپ اسم طولانی آن صدا زد.

در همین راستا خواندن مطالب زیر نیز توصیه می‌شود:

۱- وبلاگ مهدی ولیخانی: معرفی “Extension Method” ها در C# 3.0

۲- انجمن برنامه‌نویس: C#‎ 2008 Language Features – Extension Methods

۳- سایت PersiaDevelopers: ويژگی های سی شارپ 3.0

۴- وبلاگ وحید نصیری: معرفی سایت ExtensionMethod.NET