استفاده صحیح از قواعد شی‌گرایی [Polymorphism]

استفاده صحیح از قواعد شی‌گرایی [Polymorphism]

نوشته شده توسط: علیرضا ارومند
تاریخ انتشار: ۰۴ اسفند ۱۳۹۴
آخرین بروزرسانی: ۱۷ تیر ۱۴۰۳
زمان مطالعه: 7 دقیقه
۰
(۰)

مقدمه

یکی از دغدغه های هر برنامه نویسی نوشتن کدهای تمیز و خوانا با قابلیت نگهداری بالاست. خیلی ها میگن OOP برای این کار به وجود آمده و به کمک OOP میشه به این هدف رسید. اما در محیطی مثل .NET که همه چیز از اول کار با کلاس ها شروع میشه و خارج از دنیای کلاس دنیایی وجود نداره خیلی وقت ها مشاهده میکنیم که شاید جاهایی اصول OOP در حاشیه مونده و کسی از آنها استفاده نمی کنند. و اصولا در شرایطی که باید از این اصول استفاده بشه استفاده صحیح از این اصول مورد توجه نیست.

یکی از این اصول Polymorphism یا چندریختی هست. شما وقتی کلاس هایی داری که ذاتا یکی هستن ولی عملکردهای مختلفی دارن، خوب مسلما باید یک کلاس والد داشته باشی و برای عملکردهای خاص و مختلف ارث بری های مختلف داشته باشید. اجازه بدید با یه مثال ادامه بدیم که موضوع کامل مشخص باشه.
کلاس و کد زیر رو رد نظر بگیرید.
public enum MessageType
{
Success,
Failure
}
public class Message
{
public string MessageText { get; set; }
public MessageType Type { get; set; }
}
class Program
{
static void Main(string[] args)
{
Message msg = new Message(){MessageText="Success",Type =MessageType.Success }
ShowMessage(msg);
}
private static void ShowMessage(Message msg)
{
switch (msg.Type)
{
case MessageType.Success:
ShowGreenMessage();
break;
case MessageType.Failure:
ShowRedMessage();
break;
default:
break;
}
}
private static void ShowGreenMessage()
{
throw new NotImplementedException();
}
private static void ShowRedMessage()
{
throw new NotImplementedException();
}
}

 در این تکه کد ما کلاسی داریم به اسم Message که میتونه از نوع Success و یا Failure باشه. حالا در برنامه و موقع نمایش تصمیم میگیریم که با توجه به اینکه این کلاس از چه جنسی هست به چه رنگی نمایش داده شود.

اینجا مشکلاتی وجود داره. اولا که هرجا بخایم نمایش داشته باشیم باید تصمیم گیری رو انجام بدیم، شاید بگید که میشه یه تابع تعریف کنیم و اونو صدا بزنیم. اما هنوز یه مشکل دیگه هست. اصل encapsulation که زیر سوال رفته را چه کنیم؟! قسمتی از عملکرد کلاس ما که باید داخل کلاس انجام بشه به بیرون نشت کرده. یه مشکل دیگه هم هست. من وقتی دارم کد شما را review میکنم برام مهم نیست که موقع نمایش پیام چه رنگی را نمایش میدهید. صرفا دانستن اینکه پیام نمایش میدهید برای من کافی است، الباقی ماجرا جزئیاتی است که به شما و کدتان مربوط است. میبینید قابلیت خوانایی هم پایین اومده و با ادامه این روند خوانایی و نگهداری کد پایین و پایین تر می آید.
حالا وقت کمی refactor هست. پس ساختار کلاسمان را به شکل زیر تغییر میدهیم.
class Program
{
static void Main(string[] args)
{
MessageRefactor msg = new SuccessMessage() { MessageText="Success"};
msg.ShowMessage();
}
}
public abstract class MessageRefactor
{
public string MessageText { get; set; }
public abstract void ShowMessage();
}
public class SuccessMessage : MessageRefactor
{
public override void ShowMessage()
{
ShowGreenMessage();
}
private void ShowGreenMessage()
{
throw new NotImplementedException();
}
}
public class FailureMessage : MessageRefactor
{
public override void ShowMessage()
{
ShowRedMessage();
}
private void ShowRedMessage()
{
throw new NotImplementedException();
}
}
در کد جدید ما کماکان با کلاس والد کار داریم و هرجایی که نیاز هست کلاس والد را ارسال میکنیم اما برای نمونه سازی از کلاس هی فرزند استفاده میکنیم. همانطور که مشاهده میکنید عملکرد کلاس دقیقا داخل خودش پیاده سازی شده و چیزی به خارج نشت نکرده است. خوانایی کد هم بسیار بالاتر رفته. من میتوانم مشاهده کنم که پیامی ایجاد و نمایش داده میشود. اینکه چگونه و چطور را مهم نیست و نمیدانم.
پ.ن: نظر شخصی من این نیست که نباید از روالهای کنترلی استفاده شود، فقط باید جای درست انتخاب و استفاده شود. و به اصول موقع طراحی بیشتر دقت کنیم و در آخر اینکه این مثال بسیار ساده شده است و صرفا جهت نمایش عملکرد مورد انتظار ایجاد شده است و میشود در جاهای مناسب تری این مورد را بررسی کرد.

چه رتبه ای می‌دهید؟

میانگین ۰ / ۵. از مجموع ۰

اولین نفر باش

title sign
معرفی نویسنده
علیرضا ارومند
مقالات
23 مقاله توسط این نویسنده
محصولات
43 دوره توسط این نویسنده
علیرضا ارومند

علیرضا ارومند به عنوان Product Manager شرکت داتین (وابسته به فناپ) در حوزه پروژه‌های بانکی فعال است.او همچنین مدرس و Technical Manager پروژه‌های نیک آموز می باشد از دیگر تخصص های او میتوان به: تولید فریمورک برنامه نویسی فوق العاده حرفه‌ای با مدیریت بیش از 1 میلیون تراکنش در ثانیه، همکاری با تیم توسعه شرکت ارتباط فردا (بانک آینده)، مشاور فنی شرکت توسعه رفاه پردیس (بانک رفاه)، مدیر فنی خبرگزاری نسیم، سخنران تنها همایش مورد تایید مایکروسافت در خاورمیانه در حوزه ASP.NET Core، مدیر فنی خبرگزاری بین المللی پیام‌کوتاه نسیم (برنده جشنواره وب ایران)، مدرس دوره های Dot Net ، ASP.NET در نیک آموز، همکاری با تیم توسعه شرکت ارتباط فردا

title sign
دیدگاه کاربران

    • با سلام. پک آموزش جاوا SE رو ندارید؟!

      • به امید خدا بزودی دوره های حرفه ای جاوا را هم استارت خواهیم زد

    • عرض سلام و خسته نباشید،
      چرا مقالات تاریخ انتشار ندارن ؟!

      • عرض سلام و احترام
        تاریخ انتشار را برای این نذاشتیم که خیلی‌ها با اینکه مطلب بسیار مفید و ارزشمند است ولی به دلیل تاریخ گذشته بودن زیاد فکر می کنند تاریخ مصرف آن تمام شده است و مقاله را نمی خوانند یا دانلود نمی کنند. این یک ترفند آموزشی است که سایت‌های آموزشی معتبر خارجی انجام می‌دهند تا مقالات و محتوای آموزشی سایت به خوبی توسط کاربران استفاده شود.

    • عرض سلام و خسته نباشید،
      چرا مقالات تاریخ انتشار ندارن ؟!

    •     عالییی

    •  با سلام

      مقاله عالی بود

      لطفا بیشتر در مورد ASP.NET مقاله قرار بدهید

      با تشکر

    •   مرسی

      سایت مفید و جالبی دارید
    •     مطلب مفید و جالبی بود. امیدوارم در مورد OOP مطالب بیشتری از این سبک و سیاق (کوتاه، مختصر و مفید) درج کنید.

    •     با سلام و تشکر از مقاله تون.با توجه به اینکه کمتر مقاله برنامه نویسی ارائه میشه تو سایت واقعا جای این چنین مقالاتی خالی بود

    •    very nice engineer