MVP Design Pattern

 

با سلام

امروز در مورد الگوی طراحی MVP مطالبی را خدمت شما ارائه کنم .

اما اجازه بدید قبل از اینکه به معرفی MVP بپردازیم ، تعریفی از الگوهای طراحی یا Design Patterns داشته باشیم.

در
واقع الگوهای طراحی راه حل هایی برای مشکلاتی هستند که به طور معمول در
برنامه نویسی با آنها مواجه هستیم ، این راه حل ها قبلا توسط افرادی طراحی
و دسته بندی میشوند ، در واقع شما میتوانید بدون اینکه مراحلی که دیگران
طی کردند تا به نتیجه برسند را به سادگی با استفاده از این الگوها طی کنید
.

یک
الگوی طراحی در واقع یک طرح به اتمام رسیده نیست که بتوان آن را مستقیم در
کدها استفاده کرد ، الگوهای طراحی شامل توضیحات یا قالب هایی است برای حل
مشکلات .

به قول یکی از دوستان
در سایت برنامه نویس : کسی که OOP رو خوب میدونه مثل کسی ست که اجزای
تشکیل دهنده ی یک کیک رو میشناسه؛ اما کسی که الگوهای طراحی (Design
Patterns ) رو میدونه دستور پخت دقیق اون کیک رو هم در اختیار داره.

نتیجه : کیک نفر اول همیشه یکدست و خوشمزه نمیشه؛ در حالیکه کیکی که نفر دوم میپزه همیشه خوشمزه و یکدست خواهد بود.

شما
میبایست به عنوان یک برنامه نویس و توسعه دهنده در مورد الگوهای طراحی
اطلاعاتی داشته باشید تا بتوانید برنامه هایی با قابلیت و انعطاف پذیری
بالا ایجاد کنید .

یکی
از الگوهای طراحی که در برنامه های تحت وب و همچنین برنامه هایی که تحت
شیرپوینت پیاده سازی میشوند کاربرد فراوانی دارد MVP میباشد . MVP مخفف
کلمات زیر میباشد :

M = Model

V = View

P = Presenter

این الگو داده های
برنامه را از هم تفکیک میکند ، یک صفحه ساده را در نظر بگیرید ، این صفحه
شامل کنترل هایی برای دریافت نام ، نام خانوادگی ، تلفن و آدرس شخص میباشد
، کاربر میتوانید این فرم را تکمیل و پس از تایید آن پیغامی به او نمایش
داده میشود .

شما به عنوان
برنامه نویس در کلاسی که مربوط به این صفحه میباشد کدهایی را که این
عملیات را انجام میدهد مینویسید ، اما چند تا مشکل وجود دارد :

۱ – اگر تیم طراحی صفحه هنوز کنترل ها و ظاهر صفحه را ایجاد نکرده باشند ممکن است زمان را از دست بدهید

۲ – نگهداری و پشتیبانی از این کدها دشوار میباشد

۳ – تست کردن کدها مشکل است

۴ – به سختی میتوانید کدهای خود را با صفحاتی که به نوعی با این کدها در ارتباط هستند به اشتراک بگذارید

این مدل ظاهر ( UI ) و رویدادها و توابع را از یکدیگر تفکیک میکند و در دو کلاس پیاده سازی میشوند ، View و Presenter

کلاس View برای پیاده سازی کنترلها و انتقال رویدادهایی که برای این کنترلها رخ میدهد به Presenter مورد استفاده قرار میگیرد .

کلاس Presenter برای پاسخ دهی به رویداد و به روز کردن Model ) که شامل لایه منطقی و داده میباشد ) به کار میرود

یکی از مزایای این
الگو این است که کدهایی که در کلاس Presenter پیاده سازی میشوند میتوانند
به راحتی در برنامه های تحت وب و ویندوز اجرا شوند .

دومین مزیت
استفاده از این الگو این است که تیم برنامه نویسی بدون اینکه منتظر شوند
تا طراحی ظاهر برنامه تکمیل شود ( بدون توجه به UI ) میتوانند کدهای خود
را تست و اجرا کنند ، در شکل زیر میتوانید نمایی از این الگو را مشاهده
نمایید :

خوب ، بهتره یک مثل عملی بزنیم تا بهتر بتوانیم مفهوم و کارایی این الگو را درک کنیم .

فرم ساده ی زیر را در نظر بگیرید :

گام نخست در ایجاد این الگو ساخت کلاس اینترفیس میباشد که در واقع همان View ما میباشد .

یک کلاس به اسم IContactUs.cs میسازیم و کدهای زیر را در آن وارد میکنیم :

public interface IReaderContactUs

  {

string Name { get; }

string Email { get; }

string PhoneNumber { get; }

string Message { get; }

string Result { set; }

  }

در اینترفیس ها ما
هیچ پیاده سازی انجام نمیدیم فقط دستورعمل ها در اینترفیس تعریف میشوند .
اینترفیسی که در بالا تعریف کردیم به ما میگوید که میتوانیم نام ، ایمیل ،
شماره تلفن و پیام را دریافت ( Get ) و یک نتیجه را دریافت ( Set ) کنیم .

حالا ما به یک
Presenter احتیاج داریم ، Presenter همچون یک کارگر زنبور عسل همیشه در
حال کاره و یک نکته قابل توجه در مورد Presenter این است که Presenter هیچ
اطلاعی در مورد UI ندارد .

Presenter معمولا
به صورت یک کلاس جدا پیاده سازی میشود و در نهایت توسط UX (User
Experience) که در این مثال یک صفحه وب میباشد استفاده میشود .

یک کلاس دیگر ساخته و نام آنرا ContactUsPresenter.cs میگذاریم و کدهای زیر را در آن وارد میکنیم :

public class ContactUsPresenter

{

private readonly IReaderContactUs view;

public ContactUsPresenter(IReaderContactUs view)

{

this.view = view;

}

public void ProcessForm()

{

StringBuilder sb = new StringBuilder();

sb.Append(string.Format("نام : {۰}<br />", view.Name));

sb.Append(string.Format("ایمیل : {۰}<br />", view.Email));

sb.Append(string.Format("تلفن : {۰}<br />", view.PhoneNumber));

sb.Append(string.Format("پیام : {۰}<br />", view.Message));

view.Result = string.Format("<h1>با تشکر ، پیام شما دریافت شد</h1>{0}<hr />", sb);

}

}

در این کلاس ما یک نمونه از اینترفیس ایجاد میکنیم ، همچنین Constructor ما شامل یک پارامتر است که از نوع اینترفیس ماست .

در آخر ما به
کدهای وب فرم خود مراجعه میکنیم ، در کدهای وب فرم اینترفیس را پیاده سازی
میکنیم ، این بدین معناست که وب فرم ما میباست نام ، ایمیل ، تلفن و پیام
را مقدار دهی کنید و سپس پیام مورد نظر را به کاربر نمایش دهد .

توجه داشته باشید که ما یک نمونه خصوصی از ContactUsPresenter میسازیم اما در هنگام فراخوانی متد OnInit آن را معرفی میکنیم ، هنگامی که دکمه ارسال کلیک شود ، متد ProcessForm اجرا میشود :

public partial class ContactUs : UserControl, IReaderContactUs

{

private ContactUsPresenter presenter;

 

public string Name { get { return txtName.Text; } }

public string Email { get { return txtEmail.Text; } }

public string PhoneNumber { get { return txtPhone.Text; } }

public string Message { get { return txtMessage.Text; } }

public string Result { set { lblResult.Text = value; } }

 

protected override void OnInit(EventArgs e)

{

base.OnInit(e);

presenter = new ContactUsPresenter(this);

}

protected void SubmitContactButton_Click(object sender, EventArgs e)

{

presenter.ProcessForm();

}

}

و میتوانید نتیجه کار خود را ببینید :

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

امیدوارم که مورد استفاده شما دوستان عزیز قرار گرفته باشد .

موفق و پیروز باشید .

پاسخ دهید