با سلام
امروز در مورد الگوی طراحی 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();
}
}
و میتوانید نتیجه کار خود را ببینید :
خوب ، در این
مقاله توضیحات مختصری در مورد این الگو بیان شد ، شما میتوانید کدهای
پیچیده تری با این الگو طراحی کنید و مطالبی که خدمت شما دوستان عزیز
ارائه شد صرفا جهت آشنایی شما با این الگو میباشد ، اگر فرصتی باشد در
مقالات آینده بیشتر در مورد این الگو برای شما مطالبی قرار خواهم داد ، در
ضمن کدهای این مثال را میتوانید از اینجا دریافت کنید .
امیدوارم که مورد استفاده شما دوستان عزیز قرار گرفته باشد .
موفق و پیروز باشید .