PSPCommunity.org ورود | ثبت نام | كمك

رامین احمدی

SharePoint Development

بيشترين بازديد شده

MVP Design Pattern
 

با سلام

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

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

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

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

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

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

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

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

M = Model

V = View

P = Presenter

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

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

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

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

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

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

این مدل ظاهر ( 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("نام : {0}<br />", view.Name));

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

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

sb.Append(string.Format("پیام : {0}<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();

}

}

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

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

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

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

Posted: Sunday, August 16, 2009 9:26 AM توسط ramin
در زمینه:

نظرات

شاهین کیاست گفته:

تشکر از مطلب مفیدتون.

به نظرم با وجود ASP.NET MVC رفتن به سمت پیاده سازی MVP در ASP.NET WebForm کار صحیحی نیست. چون پیاده سازی همچین Pattern هایی بدون استفاده از Framework زمان بر هست.

البته بنده تجربه ی بسیار کمی دارم.

:)

# June 27, 2011 1:07 AM
نظرات افراد ناشناس غير فعال مي باشد