PDA

View Full Version : سوال: دلیل ساخت متد از نوع خود کلاس چیست:



yavar00111
چهارشنبه 24 خرداد 1391, 15:08 عصر
لطفا به قطعه کد زیر نگاه کنید:

public class Customer : IDataErrorInfo
{
#region Creation

public static Customer CreateNewCustomer()
{
return new Customer();
}

public static Customer CreateCustomer(
double totalSales,
string firstName,
string lastName,
bool isCompany,
string email)
{
return new Customer
{
TotalSales = totalSales,
FirstName = firstName,
LastName = lastName,
IsCompany = isCompany,
Email = email
};
}

protected Customer()
{
}

#endregion // Creation

#region State Properties

/// <summary>
/// Gets/sets the e-mail address for the customer.
/// </summary>
public string Email { get; set; }

/// <summary>
/// Gets/sets the customer's first name. If this customer is a
/// company, this value stores the company's name.
/// </summary>
public string FirstName { get; set; }

/// <summary>
/// Gets/sets whether the customer is a company or a person.
/// The default value is false.
/// </summary>
public bool IsCompany { get; set; }

/// <summary>
/// Gets/sets the customer's last name. If this customer is a
/// company, this value is not set.
/// </summary>
public string LastName { get; set; }

/// <summary>
/// Returns the total amount of money spent by the customer.
/// </summary>
public double TotalSales { get; private set; }

#endregion // State Properties



چند سوال داشتم:
1- چرا متد ساخت مشتری جدید از نوع خود کلاس است؟
2- چرا برای ساخت مشتری از 2 متد ساخت مشتری جدید و ساخت مشتری استفاده کرده است؟
3- متد مشتری که از نوع محافظت شده میباشد، به چه دلیل ساخته شده است و چرا هیچ کدی درون آن نیست و چرا محافظت شده میباشد؟

فکر میکنم این سوالات در ذهن خیلی از ماها اومده باشه ولی خیلی ساده از کنارش گذشتیم. :لبخندساده:

Saeed_m_Farid
چهارشنبه 24 خرداد 1391, 17:31 عصر
1- چرا متد ساخت مشتری جدید از نوع خود کلاس است؟
2- چرا برای ساخت مشتری از 2 متد ساخت مشتری جدید و ساخت مشتری استفاده کرده است؟
3- متد مشتری که از نوع محافظت شده میباشد، به چه دلیل ساخته شده است و چرا هیچ کدی درون آن نیست و چرا محافظت شده میباشد؟

قبل جواب باید بگم بعد مدتها یه سوال درست حسابی دیدم! تا اونجایی که من میدونم این یه مثال برای آشنایی با الگوی طراحی MVVM (http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx) هست و من (با اینکه خیلی دوس دارم) متاسفانه وقت نکردم با این (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) Design Pattern بصورت کاربردی کار کنم ولی تو این مثالی که شما زدین شاید بتونم کمک کنم:


منظورتون واضح نیست! اگه دوتا تابع اولی (CreateNewCustomer و CreateCustomer) که یه نوع Customer برمیگردونن منظورتون هست، همونطوریکه می بینین متدها static تعریف شدن و با فراخوانی این متدها نمونه ای از کلاس Customer درست میشه بدون اینکه نیاز باشه شما یک شی از نوع Customer درست کرده باشین؛ یعنی مستقیماً می تونید Customer.CreateNewCustomer یا Customer.CreateCustomer رو فراخوانی کنید و شیءای از نوع Customer تحویل بگیرین. ولی اگه سازنده کلاس مدنظرتون باشه (یعنی protected Customer) که سوال بیربط میشه! چون سازنده اصولاً باید همنام کلاس مدنظرتون باشه ...
این زیاد سخت نبود! یکمی تامل میکردین میشد متوجه شد که تو CreateNewCustomer شما شیءای از نوع Customer تحویل میگیرین که مقداردهی اولیه نشده و همه اعضاء پیشفرض هستن؛ ولی با فراخوانی CreateCustomer شیء شما با مقادیری که بعنوان ورودی بهش دادین مقداردهی میشه.
نکته اصلی اینجاست! همونطورکه میدونین سازنده کلاس که متدی همنام خود کلاس بدون نوع برگشتی هست (که شما اسمش رو گذاشتین متد مشتری و این غلط هست) قسمتی از کلاس هست که موقع ساختن یک شی از کلاس (یا کلاسی که ازش ارث برده، به شرطی که override نشده باشه) بطور خودکار فراخوانی میشه! تو این الگو، افزودن keyword (http://msdn.microsoft.com/en-us/library/bcd5672a%28VS.71%29.aspx) بقول شما محافظت شده (protected (http://msdn.microsoft.com/en-us/library/bcd5672a%28VS.71%29.aspx)) باعث میشه که فقط کلاس Customer یا کلاس(ها)ی که ازش مشتق میشن (مثلاً ازش ارث بری دارن) به سازنده دسترسی داشته باشن! خوب این چه معنی میده؟ خلاصه اش این میشه که دیگه شما نمی تونین یک شیء از کلاس Customer بسازین و مجبورین حتماً CreateNewCustomer یا CreateCustomer رو فراخوانی کنید، و با این الگو میشه مطمئن شد که instance سازی از کلاس مزبور محدود میشه به خود کلاس و کلاسهایی که ازش ارث مبیرن! بعبارت دیگه هر ننه قمری نمیتونه با Customer c = new Customer() تو ران تایم یه شیء (instance) درست کنه! درسته این فقط یه مثاله و اینجا ارزش این الگو مشخص نمیشه، ولی تو کاربردهای واقعی مثلاً زمانی مفید هست که شما بدونین درون برخی سازنده های کلاس حجم زیادی از منابع سیستم درگیر میشن که تو تمام موارد نیازی بهشون نیست و شما می تونید با متدهای static برای نمونه گیری از کلاس کارایی کلاس رو تضمین کنید یا تو برخی جاها کد مدیریت نشده استفاده کردین یا کارایی کردین که خطری هستن و ... ضمناً اینکه چرا هیچ کدی توش نیست واسه اینه که این یه Sample هست برای آشنایی شما با این Design Pattern نه پروژه واقعی

tooraj_azizi_1035
چهارشنبه 24 خرداد 1391, 22:34 عصر
سلام


1- چرا متد ساخت مشتری جدید از نوع خود کلاس است؟

زیرا مقدار بازگشتی آن یک شیء Customer است.


2- چرا برای ساخت مشتری از 2 متد ساخت مشتری جدید و ساخت مشتری استفاده کرده است؟

به این دلیل که در هنگام ساخت کاربر هم بتواند در ابتدا برخی خصوصیات را مقدار دهی کند و هم اینکه نخواهد چنین کاری بکند.


3- متد مشتری که از نوع محافظت شده میباشد، به چه دلیل ساخته شده است و چرا هیچ کدی درون آن نیست و چرا محافظت شده میباشد؟

ساخته شده چون کلاس های مشتق شده از این کلاس باید بتوانند سازنده آن را در بدنه خود با استفاده از base.Customer() صدا بزنند.
هیچ کدی در آن نیست چون صرفاً جهت اینکه کلاس مشتق شده بتواند سازنده این کلاس را صدا بزند این سازنده وجود دارد (اگر چنین متدی ننویسید کامپایلر C# خودش آن را تولید می کند).
محافظت شده است چون سازنده کلاس نمی خواهد نمونه ای که از روی کلاس ساخته شده مستقیماً آن را فراخوانی کند.

این نوع طراحی عمداً از سوی طراح کلاس بدین شکل طراحی شده و می توانست اینطور نباشد.

yavar00111
پنج شنبه 25 خرداد 1391, 11:07 صبح
دقیقا همینطوره، دارم روی MVVM کار میکنم، ولی توی سمپلهایی که پیدا میکنم مفاهیم شی گرایی به طرز فوق العاده ای استفاده شده، و بخاطر همین مقداری گیر کردم.


قبل جواب باید بگم بعد مدتها یه سوال درست حسابی دیدم! تا اونجایی که من میدونم این یه مثال برای آشنایی با الگوی طراحی MVVM (http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx) هست و من (با اینکه خیلی دوس دارم) متاسفانه وقت نکردم با این (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) Design Pattern بصورت کاربردی کار کنم ولی تو این مثالی که شما زدین شاید بتونم کمک کنم:



منظورتون واضح نیست! اگه دوتا تابع اولی (CreateNewCustomer و CreateCustomer) که یه نوع Customer برمیگردونن منظورتون هست، همونطوریکه می بینین متدها static تعریف شدن و با فراخوانی این متدها نمونه ای از کلاس Customer درست میشه بدون اینکه نیاز باشه شما یک شی از نوع Customer درست کرده باشین؛ یعنی مستقیماً می تونید Customer.CreateNewCustomer یا Customer.CreateCustomer رو فراخوانی کنید و شیءای از نوع Customer تحویل بگیرین. ولی اگه سازنده کلاس مدنظرتون باشه (یعنی protected Customer) که سوال بیربط میشه! چون سازنده اصولاً باید همنام کلاس مدنظرتون باشه ...
این زیاد سخت نبود! یکمی تامل میکردین میشد متوجه شد که تو CreateNewCustomer شما شیءای از نوع Customer تحویل میگیرین که مقداردهی اولیه نشده و همه اعضاء پیشفرض هستن؛ ولی با فراخوانی CreateCustomer شیء شما با مقادیری که بعنوان ورودی بهش دادین مقداردهی میشه.
نکته اصلی اینجاست! همونطورکه میدونین سازنده کلاس که متدی همنام خود کلاس بدون نوع برگشتی هست (که شما اسمش رو گذاشتین متد مشتری و این غلط هست) قسمتی از کلاس هست که موقع ساختن یک شی از کلاس (یا کلاسی که ازش ارث برده، به شرطی که override نشده باشه) بطور خودکار فراخوانی میشه! تو این الگو، افزودن keyword (http://msdn.microsoft.com/en-us/library/bcd5672a%28VS.71%29.aspx) بقول شما محافظت شده (protected (http://msdn.microsoft.com/en-us/library/bcd5672a%28VS.71%29.aspx)) باعث میشه که فقط کلاس Customer یا کلاس(ها)ی که ازش مشتق میشن (مثلاً ازش ارث بری دارن) به سازنده دسترسی داشته باشن! خوب این چه معنی میده؟ خلاصه اش این میشه که دیگه شما نمی تونین یک شیء از کلاس Customer بسازین و مجبورین حتماً CreateNewCustomer یا CreateCustomer رو فراخوانی کنید، و با این الگو میشه مطمئن شد که instance سازی از کلاس مزبور محدود میشه به خود کلاس و کلاسهایی که ازش ارث مبیرن! بعبارت دیگه هر ننه قمری نمیتونه با Customer c = new Customer() تو ران تایم یه شیء (instance) درست کنه! درسته این فقط یه مثاله و اینجا ارزش این الگو مشخص نمیشه، ولی تو کاربردهای واقعی مثلاً زمانی مفید هست که شما بدونین درون برخی سازنده های کلاس حجم زیادی از منابع سیستم درگیر میشن که تو تمام موارد نیازی بهشون نیست و شما می تونید با متدهای static برای نمونه گیری از کلاس کارایی کلاس رو تضمین کنید یا تو برخی جاها کد مدیریت نشده استفاده کردین یا کارایی کردین که خطری هستن و ... ضمناً اینکه چرا هیچ کدی توش نیست واسه اینه که این یه Sample هست برای آشنایی شما با این Design Pattern نه پروژه واقعی