overload چیست و چگونه Overload بنویسیم

خیلی وقتها کدهایی می‌بینیم که دعا می‌کنیم ای کاش هیچ وقت با آنها روبرو نمی‌شدیم. چند روز پیش با یکی از این کدها روبرو شدم و به همین دلیل این مطلب را می‌نویسم، امیدوارم شخص ثالث هم این نوشته را ببیند و در کدنویسی از این روش یا روش‌های بهتر استفاده کند.

—————————————————————-

این مطلب زیر نظر مجوز GFDL منتشر می‌شود. و کلیه حقوق آن برای همگان آزاد است، بدین شرط که به کلیه شرایط موجود در مجوز GFDL ( که یک نسخه از متن انگلیسی مجوز GFDL در این محل و یک ترجمه غیر رسمی (فارسی) از متن مجوز GFDL که در مرداد ۱۳۸۳ توسط کاوه رنجبر تهیه شده است در این محل ) قرار دارد پایبند باشد.

GNU Logo

GNU Logo

عنوان مطلب : overload چیست و چگونه Overload بنویسیم

بخش ثانی : ندارد

تاریخ انتشار : 17/06/1388 مطابق با 08/09/2009

شماره نسخه : نسخه یک

نویسنده : ناصر حاجلو

ای-میل نویسنده : n.hajloo@gmail.com

Copyright (c) 2009 Nasser Hajloo.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation;

with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.

—————————————————————-

 Overload چیست ؟ اورلود، یک متد هم نام با متد اصلی است که پارامترهای متفاوتی از آنچه که متد اصلی دارد، می‌گیرد. از آنجا که این متدها در نام شبیه به هم هستند پس باید در عمل هم کار یکسانی را انجام دهند، اما بسته به اینکه کاربر ( بخوانید برنامه‌نویس سطح بعدی ) چه مقادیری را در دسترس داشته باشد، از اورلودهای مختلف برای انجام عمل دلخواهش استفاده می‌کند.

برای مثال فرض کنید که می‌خواهید یک متد save برای یک آبجکت Person بنویسید. در حالت عادی شما باید یک متد بصورت زیر داشته باشید.

 Public void Save(Person p)
{
 // در این قسمت این ابجکت را در پایگاه داده باید ذخیره کنید
}

اما فرض کنید که کلاس Person حداقل دو صفت نام و نام خانوادگی را برای ایجاد یک آبجکت نیاز دارد پس برای ذخیره کردن این person باید یک overload هم برای ذخیره این دو صفت داشته باشیم برای نمونه فرض کنید.

public void Save(string name, string lastName)
 {
 Person p = new Person(name,lastName);
 Save(p);
}

توجه کنید که متد save در آبجکت person قرار ندارد و در لایه business قرار گرفته از این رو p.save در این مثال وجود ندارد. اما در یک روال پیاده سازی بهتر باید همه متدهای save برای person در کلاس person قرار گرفته باشد ( که بخاطر کوتاهی نگارش مطلب، در اینجا از آن صرف نظر کردم ) اما یک overload مناسب دیگر برای متد save می‌تواند متد زیر باشد.

 public Save(List<Person> people)
{
 foreach ( Person p in people)
                  Save(p);
}

همانطور که ملاحظه می‌کنید می‌توان overload های بسیار دیگری را نیز به این کلاس اضافه کرد تا در لایه‌های مختلف عملیات save ( یا هر عملیات دلخواه دیگری ) راحت‌تر و با معناتر انجام شود. هرچه طراح سیستم overload های بیشتری را برای پیاده‌سازی در نظر بگیرد کار با آن کلاس خاص راحت‌تر و با معناتر خواهد بود.
توجه کنید که در مثال‌های بالا همه overload ها فقط و تنها فقط یک متد اجرایی دارند و سایر overload ها برای انجام دادن کار خودشان به نوعی از آن متد استفاده می‌کنند. در این مثال سعی کردم با حداقل میزان کدنویسی نشان دهم که برای overload نویسی باید فقط و تنها فقط از یک نقطه تغییرات را اعمال کنیم تا هم کدنویسی معنایی را حفظ کنیم و هم تغییرات آینده را براحتی و از یک جا کنترل کنیم که این در بهره‌وری و کارآیی و خوانایی کد تاثیر چشم‌گیری دارد.

توجه داشته باشید که در یک طراحی خوب متد save باید در خود کلاس person پیاده‌سازی شود و در اینجا صرفا قصد نشان دادن چگونگی مقداردهی به overload های مختلف را داشتم. اگر شما راه بهتری برای نوشتن overload ها سراغ دارید، لطفا آن را با من در میان بگذارید.

2 Responses to overload چیست و چگونه Overload بنویسیم

  1. محمدآزاد says:

    سلام رفیق مطلب خوبی بود

  2. Hamid says:

    تکرار بديهيات منطقی نيست ، کلاً مطالب پيش پا افتاده اي مينويسيد.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: