PDA

View Full Version : چرا باید از set و get استفاده کنیم؟



TheBest
شنبه 14 اردیبهشت 1392, 11:54 صبح
با سلام
می‌خواستم بدونم چرا باید از set و get استفاده کنیم؟ مثلا در کد زیر:
public string FirstName;
public string LastName;
public string Name
{
get
{
return FirstName + " " + LastName;
}
}
چرا بجای کد بالا اینطوری ننویسیم:
public string FirstName;
public string LastName;
public string Name = FirstName + " " + LastName;

fool66
شنبه 14 اردیبهشت 1392, 12:03 عصر
set و get برای مقدار دهی خارج از کلاس و بازیابی اون هست با اینا میتونی جلوی مقادیر غیر قابل قبول رو بگیری

TheBest
شنبه 14 اردیبهشت 1392, 12:07 عصر
یعنی خارج از کلاس نمیشه بدون set و get مقدار دهی کرد؟
جلوگیری از وارد کردن مقادیر غیرقبول رو قبلا هم خوندم ولی دقیقا متوجه منظورش نشدم، یعنی چی؟ چظوری جلوش رو میگیره؟

fool66
شنبه 14 اردیبهشت 1392, 12:17 عصر
مقادیر public رو میشه ولی برای مقادیر private باید از set و get استفاده کنی

مثلا وقتی می خوای سن یه فرد رو بگیری و برای سن نباید اعداد منفی رو قبول کرد با استفاده از تابع set و یه شرط به راحتی می تونی کنترل کنی و اگه مقدار نا معتبر بود مقدار پیشفرض خودت رو درون متغیر قرار بدی

TheBest
شنبه 14 اردیبهشت 1392, 12:26 عصر
خب اینکارو با یه شرط معمولی و بدون ست و گت هم میشه انجام داد. الان مزیت استفاده از این‌ها چیه؟

fool66
شنبه 14 اردیبهشت 1392, 12:41 عصر
بهترین خصوصیتشش مقدار دادن به متغیر private کلاس هست

همه کارا ها رو می تونیم به روش های مختلف انجام بدیم ولی یه برنامه نویسی اصولی داریم که میشه گفت خیلیا اصولی نمی نویسن

بهزاد علی محمدزاده
شنبه 14 اردیبهشت 1392, 12:43 عصر
اونوقت اگر چند بار نیاز به فراخوانی داشته باشی. چند بار if. می نویسی ؟ و این if رو کجا می نویسی ؟

csharpdoost
شنبه 14 اردیبهشت 1392, 14:14 عصر
همه مطالب فوق درسته. میشه بدون get و set هم چیزی رو که میخوای انجام بدی. اما این دو بیشتر برای وضوح بیشتر و اصولی شدن و کنترل راحت تر و مطمئن تر برای ورودی و خروجی برنامه می باشد. والا اگر این شرایط را بدون این دو هم بتونی رعایت کنی مشکلی نداره.

FastCode
شنبه 14 اردیبهشت 1392, 14:20 عصر
بهترین علتش رو خودتون توی سوال آوردید.


public string FirstName;
public string LastName;
public string Name = FirstName + " " + LastName

در اینجا اگر یکی از مقادیر FirstName یا LastName رو تغییر بدیم Name خود به خود تغییر نخواهد کرد.


اگر تعداد Write ها کم باشه و تعداد Read ها زیاد باشه میتونیم Name رو در یک متغیر private نگهداری کنیم و در هر تغییر FirstName یا LastName مقدارش رو تغییر بدیم.(حالت چهارم)
اگر عکس این شرط برقرار باشه بهتره که هر بار که مقدار Name خواسته شد محاسبه بشه.(حالتهای اول, دوم و سوم)

این چهار حالت صحیح:

public string FirstName { get; set; }
public string LastName { get; set; }
public string Name
{
get
{
return FirstName + " " + LastName;
}
}

private string firstName;
public string FirstName { get { return firstName; } set { firstName = value; } }
private string lastName;
public string LastName { get { return lastName; } set { lastName = value; } }
public string Name
{
get
{
return firstName + " " + lastName;
}
}

public string FirstName;
public string LastName;
public string Name
{
get
{
return FirstName + " " + LastName;
}
}


private string firstName;
public string FirstName { get { return firstName; } set { firstName = value; name = firstName + " " + lastName; } }
private string lastName;
public string LastName { get { return lastName; } set { lastName = value; name = firstName + " " + lastName; } }
private string name;
public string Name
{
get
{
return name;
}
}

TheBest
شنبه 14 اردیبهشت 1392, 18:46 عصر
فقط یه سوال: در حالت چهارم، هنگام کدنویسی، firstName باید مقدار دهی بشه یا FirstName؟

FastCode
شنبه 14 اردیبهشت 1392, 18:52 عصر
فقط یه سوال: در حالت چهارم، هنگام کدنویسی، firstName باید مقدار دهی بشه یا FirstName؟
FirstName باید مقداردهی بشه.چون اگر firstName رو مقداردهی کنیم مقدار name و در نتیجه مقدار Name نامعتبر خواهد خواهد بود.

TheBest
شنبه 14 اردیبهشت 1392, 18:59 عصر
خب اینطوری که firstName و lastNameی که داریم ازشون استفاده می‌کنیم مقداردهی نشده و خالیه! پس چطور Name رو مقداردهی می‌کنه؟!

FastCode
شنبه 14 اردیبهشت 1392, 19:15 عصر
خب اینطوری که firstName و lastNameی که داریم ازشون استفاده می‌کنیم مقداردهی نشده و خالیه! پس چطور Name رو مقداردهی می‌کنه؟!
میتونید اینطوری عمل کنید:

private string firstName;
public string FirstName { get { return firstName; } set { firstName = value; if((firstName == null) || (lastName == null)) name = null; else name = firstName + " " + lastName; } }
private string lastName;
public string LastName { get { return lastName; } set { lastName = value; if((firstName == null) || (lastName == null)) name = null; else name = firstName + " " + lastName; } }
private string name;
public string Name
{
get
{
return name;
}
}

یا خیلی زیبا تر:

private string firstName;
public string FirstName { get { return firstName; } set { firstName = value; refreshName(); } }
private string lastName;
public string LastName { get { return lastName; } set { lastName = value; refreshName(); } }
void refreshName()
{
if((firstName == null) || (lastName == null)) name = null; else name = firstName + " " + lastName;
}
private string name;
public string Name
{
get
{
return name;
}
}

FastCode
یک شنبه 15 اردیبهشت 1392, 15:26 عصر
نکته ی دیگری که یادم رفت بگم اینه که معمولا وقتی از property استفاده میکنند که زمان محاسبه خیلی کم باشه(O(1 یا ((O(log(N در غیر این صورت از method ها استفاده میشه.
البته هیچ اجباری برای این کار وجود نداره.

Rezahak
یک شنبه 15 اردیبهشت 1392, 16:36 عصر
نکته ی دیگری که یادم رفت بگم اینه که معمولا وقتی از property استفاده میکنند که زمان محاسبه خیلی کم باشه(O(1 یا ((O(log(N در غیر این صورت از method ها استفاده میشه.

با سلام
برای این نکته ای که فرمودید منبعی دارید؟؟ به نظر منطقی نمی یاد!!!!

FastCode
یک شنبه 15 اردیبهشت 1392, 17:01 عصر
با سلام
برای این نکته ای که فرمودید منبعی دارید؟؟ به نظر منطقی نمی یاد!!!!
اتفاقا خیلی هم منطقیه.پس شما تا الان با چه برحانی تصمیم میگرفتی که از method استفاده کنی یا property؟
فقط کافیه جست و جو کنید.
این رو الان پیدا کردم.
http://stackoverflow.com/questions/1374273/when-to-use-properties-instead-of-functions
اگر دقت کنید در کنار موارد دیگر این تنها موردی هست که پاسخ دهندگان در stackoverflow همگی بهش اشاره کردن.
http://msdn.microsoft.com/en-us/library/bzwdh01d%28v=vs.71%29.aspx

fakhravari
یک شنبه 15 اردیبهشت 1392, 21:49 عصر
get ; set; برای امنیت بیشتر متد های کلاس.:لبخندساده:

Rezahak
یک شنبه 15 اردیبهشت 1392, 22:14 عصر
اتفاقا خیلی هم منطقیه.پس شما تا الان با چه برحانی تصمیم میگرفتی که از method استفاده کنی یا property؟
فقط کافیه جست و جو کنید.
این رو الان پیدا کردم.
http://stackoverflow.com/questions/1374273/when-to-use-properties-instead-of-functions
اگر دقت کنید در کنار موارد دیگر این تنها موردی هست که پاسخ دهندگان در stackoverflow همگی بهش اشاره کردن.
http://msdn.microsoft.com/en-us/library/bzwdh01d%28v=vs.71%29.aspx
بنده مواردی رو که اشاره کردید مطالعه کردم ولی در آنها چیزی راجع به زمان اجرا که شما اشاره کردید ننوشته؟؟؟!!!

FastCode
یک شنبه 15 اردیبهشت 1392, 22:53 عصر
بنده مواردی رو که اشاره کردید مطالعه کردم ولی در آنها چیزی راجع به زمان اجرا که شما اشاره کردید ننوشته؟؟؟!!!
کسانی که در stackoverflow توضیح دادن فقط گفتن زمانگیر یا غیر زمانگیر.
این مبحث یک مقدار پیچیده تر از چیزی هست که بشه راجع بهش در دو صفحه بحث کرد.
ولی میتونم به طور خیلی ساده چند تا مثال بزنم.
۱.در DataGridView اگر به ازای هر field پردازشی بیشتر از این مقدار انجام بشه در DataSet های بالای چند ده هزار مشکلی جالبی پیش میاد که احتمال داره باهاش برخورد کرده باشید.
هر سلول به شکل جدا رندر میشه.
اگر تمام سلول ها با الگوریتم های با پیچیدگی کمتر از Sqrt(N) محاسبه بشن در حالتهایی که محاسبات تو در تو هم داشته باشید این پیچیدگی به O(N) نخواهد رسید.
بهترین روش برای اینکه متوجه بشید property ای که برای نمایش در یک DataGridView طراحی کردید از این شرایط برخوردار هست اینه که همه ی property هاتون از یک حد پیچیده تر نباشن که با یک نگاه بتونید حدودا پیچیدگی رو حدث بزنید.
۲.فرض کنید میخواهید یک لیست به طول M رو بر اساس یکی از property هاش مرتب کنید: M Log(M). اگر به ازای هر M یک Log N داشته باشید چی میشه؟ M(Log(N))Log(M(Log(N))) میبینید که خیلی زیاد نیست. حالا Log(N) رو با یک چیز دیگه عوض کن.میبینید که خیلی زیاده.

مثال از این دست زیاده.
من همیشه به دوستهام پیشنهاد میکنم که با توجه به حجم اطلاعاتشون یک سری constraint برای خودشون بزارن که بعدا به مشکل نخورن.این یکی از اونهاست.

بعضی چیزها رو در کتابها نمینویسن.تجربه.

Rezahak
یک شنبه 15 اردیبهشت 1392, 23:08 عصر
کسانی که در stackoverflow توضیح دادن فقط گفتن زمانگیر یا غیر زمانگیر.
این مبحث یک مقدار پیچیده تر از چیزی هست که بشه راجع بهش در دو صفحه بحث کرد.
ولی میتونم به طور خیلی ساده چند تا مثال بزنم.
۱.در DataGridView اگر به ازای هر field پردازشی بیشتر از این مقدار انجام بشه در DataSet های بالای چند ده هزار مشکلی جالبی پیش میاد که احتمال داره باهاش برخورد کرده باشید.
هر سلول به شکل جدا رندر میشه.
اگر تمام سلول ها با الگوریتم های با پیچیدگی کمتر از Sqrt(N) محاسبه بشن در حالتهایی که محاسبات تو در تو هم داشته باشید این پیچیدگی به O(N) نخواهد رسید.
بهترین روش برای اینکه متوجه بشید property ای که برای نمایش در یک DataGridView طراحی کردید از این شرایط برخوردار هست اینه که همه ی property هاتون از یک حد پیچیده تر نباشن که با یک نگاه بتونید حدودا پیچیدگی رو حدث بزنید.
۲.فرض کنید میخواهید یک لیست به طول M رو بر اساس یکی از property هاش مرتب کنید: M Log(M). اگر به ازای هر M یک Log N داشته باشید چی میشه؟ M(Log(N))Log(M(Log(N))) میبینید که خیلی زیاد نیست. حالا Log(N) رو با یک چیز دیگه عوض کن.میبینید که خیلی زیاده.

مثال از این دست زیاده.
من همیشه به دوستهام پیشنهاد میکنم که با توجه به حجم اطلاعاتشون یک سری constraint برای خودشون بزارن که بعدا به مشکل نخورن.این یکی از اونهاست.

بعضی چیزها رو در کتابها نمینویسن.تجربه.

به هر حال شاید مطالبی که شما نوشتید درست باشه اما باز هم به نظر من منطقی به نظر نمی رسه چون نقش بهینه ساز در زمان کامپایل نادیده می شه
اگر واقعا تعویض property و method از نظر زمان اجرا اینقدر حیاتی باشد بهینه ساز در زمان کامپایل خودبه خود این کار را انجام می داد

FastCode
دوشنبه 16 اردیبهشت 1392, 00:50 صبح
به هر حال شاید مطالبی که شما نوشتید درست باشه اما باز هم به نظر من منطقی به نظر نمی رسه چون نقش بهینه ساز در زمان کامپایل نادیده می شه
اگر واقعا تعویض property و method از نظر زمان اجرا اینقدر حیاتی باشد بهینه ساز در زمان کامپایل خودبه خود این کار را انجام می داد
کلا شما میدونی امگا چیه؟بهینه ساز چیه؟پیچیدگی چیه؟وقتی نمیدونی چرا گیر الکی میدی؟یک ساعت توضیح دادم. تازه میگی بهینه ساز؟

مهرداد صفا
دوشنبه 16 اردیبهشت 1392, 01:10 صبح
با سلام
می‌خواستم بدونم چرا باید از set و get استفاده کنیم؟ مثلا در کد زیر:
public string FirstName;
public string LastName;
public string Name
{
get
{
return FirstName + " " + LastName;
}
}
چرا بجای کد بالا اینطوری ننویسیم:
public string FirstName;
public string LastName;
public string Name = FirstName + " " + LastName;

با سلام.
علاوه بر نکاتی که دوستان فرمودند:
یکی از قابلیتهای property نسبت به field معمولی این است که مثلا شما فرض کنید یک مستطیل دارید که با تغییر خصوصیات طول و عرض و رنگ باید شکل آن بلافاصله روی تصویر با خصوصیات جدید رسم شود؛ این کاری است که به راحتی در property set بعد از مقدار دهی به متغیرهای محلی که برای نگهداری مقادیر در نظر گرفتید انجام می دهید، در حالیکه یک فیلد قادر به چنین کاری نیست و صرفا مقدار را نگهداری میکند، مگر اینکه مثلا بیایید از توابع SetColor و GetColor استفاده کنید که باید گفت این شبیه روشهای رویه گراست و باعث پیچیدگی بیشتر برنامه می شود.
از طرفی همانطور که دوستان گفتن خصوصیت میتواند در هر بار که مقدار آنها گرفته میشود مقدار را به روز محاسبه کنند. مثلا اگر در همین مستطیل یک خصوصیت برای مساحت داشته باشیم؛ اگر از فیلد استفاده کنید باید یک بار طول و عرض را در هم ضرب کنید و در مساحت قرار دهید و اگر طول و یا عرض تغییر کنند تغییری در مساحت به وجود نمی آید در حالیکه در خصوصیت این محاسبات در هنگام گرفتن مقدار خصوصیت انجام شده و مقادیر به روز محاسبه می شوند.

youngold
دوشنبه 16 اردیبهشت 1392, 01:27 صبح
من قبلاً هم در یکی از تاپیک ها که به کد نویسی شی گرا و کلاً کدینگ اشاره داشت گفتم
واقعاً چرا اصرار دارید چیزی رو که نیازش رو حس نکردید درک کنید؟
پرسش این سوال ها نشان دهنده ی نرسیدن به مرحله نیاز هست
البته این دلیل نمیشه که اطلاعات شما کم باشه بلکه ممکنه شما در زمینه دیگه ای فعالیت کرده باشید (به کسی بر نخوره)
واقعاً در برخورد با این تاپیک ها اولین چیزی که به ذهن میرسه اینه که چجوری جواب اینو بدیم؟!
عجله نکنید باید وقت بیشتری بزارید ، به خصوص این مسائل که واقعاً توی پست های بالا مشخصه دوستان موندن چجوری برای شما همه زوایاش رو لحاظ کنند تا به درک برسید

Rezahak
دوشنبه 16 اردیبهشت 1392, 09:52 صبح
کلا شما میدونی امگا چیه؟بهینه ساز چیه؟پیچیدگی چیه؟وقتی نمیدونی چرا گیر الکی میدی؟یک ساعت توضیح دادم. تازه میگی بهینه ساز؟

البته بنده از توضیحات شما ممنونم
بنده از مطالبی مانند پیچیدگی کد و مراحل کامپایل برنامه اطلاع دارم و در ضمن می دونم هدف از قراردادن property و method دسته بندی برای سهولت کد نویسی است وگرنه یک property که فقط خواندنی است و صرفا از get استفاده می کند با method با خروجی غیر void یا function هیچ فرقی ندارد.
ولی متاسفانه اصرار بیش از اندازه شما بر تفاوت زمان اجرا بنده رو مجبور به درخواست از شما برای ارائه منبع کرد ولی منابعی که ارائه فرمودید دلیل قابل قبولی برای فرمایشاتتون در بر نداشت وگرنه خود ارائه کننده ابزار (Microsoft) که تعارف نداره . حداقل این مطلب رو توی msdn میاره!!!!

FastCode
دوشنبه 16 اردیبهشت 1392, 10:26 صبح
البته بنده از توضیحات شما ممنونم
بنده از مطالبی مانند پیچیدگی کد و مراحل کامپایل برنامه اطلاع دارم و در ضمن می دونم هدف از قراردادن property و method دسته بندی برای سهولت کد نویسی است وگرنه یک property که فقط خواندنی است و صرفا از get استفاده می کند با method با خروجی غیر void یا function هیچ فرقی ندارد.
ولی متاسفانه اصرار بیش از اندازه شما بر تفاوت زمان اجرا بنده رو مجبور به درخواست از شما برای ارائه منبع کرد ولی منابعی که ارائه فرمودید دلیل قابل قبولی برای فرمایشاتتون در بر نداشت وگرنه خود ارائه کننده ابزار (Microsoft) که تعارف نداره . حداقل این مطلب رو توی msdn میاره!!!!
این مطالب چیزی نیست که در msdn نوشته بشه.از این دست مطالب بسیار است.
من شخصا 5 سال با .net framework کار کردم تا به این نتیجه رسیدم که مقدار O رو در property هام رعایت کنم که بعدا به مشکل نخورم.


بهینه ساز فقط قسمت های خاص کد شما رو بهینه میکنه.نمیتونه جادو کنه و array و buble sort شما رو بکنه reverse merge join و B* Tree

Rezahak
دوشنبه 16 اردیبهشت 1392, 10:48 صبح
این مطالب چیزی نیست که در msdn نوشته بشه.از این دست مطالب بسیار است.
من شخصا 5 سال با .net framework کار کردم تا به این نتیجه رسیدم که مقدار O رو در property هام رعایت کنم که بعدا به مشکل نخورم.


بهینه ساز فقط قسمت های خاص کد شما رو بهینه میکنه.نمیتونه جادو کنه و array و buble sort شما رو بکنه reverse merge join و B* Tree

دوست عزیز مطلب اصلی این نیست که بهینه ساز کد رو درک کنه و توابعی با زمان اجرا و پیچیدگی بالا رو بهینه کنه موضوع اینه که ایشون فرمودند اگه پیچیدگی بالا باشد باید از تابع استفاده کرد و در غیر این صورت از property . من هم عرض کردم اگه این دوتا با هم فرق می کرد خود بهینه ساز method رو جایگزین property می کرد .

FastCode
دوشنبه 16 اردیبهشت 1392, 11:23 صبح
دوست عزیز مطلب اصلی این نیست که بهینه ساز کد رو درک کنه و توابعی با زمان اجرا و پیچیدگی بالا رو بهینه کنه موضوع اینه که ایشون فرمودند اگه پیچیدگی بالا باشد باید از تابع استفاده کرد و در غیر این صورت از property . من هم عرض کردم اگه این دوتا با هم فرق می کرد خود بهینه ساز method رو جایگزین property می کرد .
آها.مشکل شما اینه که IL بلد نیستید.
در داتنت و بیشتر زبان ها property ها در واقع همان method ها هستند که با یک attribute/Flag ه IL مشخص میشن و فقط به خاطر استفاده ی متفاوتی که برنامه نویس ازشون میبره مثل جدا کردن mehdod های بدون side effect یا همین مورد یا "درست بودن گرامر اینگلیسی موقع خواندن کد" ازشون استفاده میشه.
مثلا همین مورد side-effect در C++ هم در نظر گرفته شده.ولی چون در C++ نمیخواستن یک سری امکانات مثل تعداد پارامتر های method رو از دست بدن و ساختار کدهای موجود رو به هم بزنن از کلمه کلیدی const استفاده کردن.
http://stackoverflow.com/questions/3141087/what-is-meant-with-const-at-end-of-function-declaration