PDA

View Full Version : سوال: Object Oreinted در طراحی سایت



ghayegh
پنج شنبه 25 مهر 1387, 16:36 عصر
مشکلی که دارم در رابطه با Refresh صفحه در مسئله ی طراحی سایت است . فرض کنید که کلاس ساده ی زیر را داریم :


public class Class1
{
private string _firstName = string.Empty;

public string firstName
{
get
{
return _firstName;
}
set
{
_firstName = value;
}
}
}


در برنامه ی اصلی هم کد زیر را داریم :


public partial class _Default : System.Web.UI.Page
{
Class1 objClass1 = new Class1();

protected void Page_Load(object sender, EventArgs e)
{
if (Session["FirstLoad"] == null)
{
Session["FirstLoad"] = true;
objClass1.firstName = "Mehrnoosh";
}
Label1.Text = objClass1.firstName;
}
protected void Button1_Click(object sender, EventArgs e)
{

}
}


الان اگر برنامه را اجرا کنیم ، در Label1 نوشته شده : Mehrnoosh . خوب تا اینجا که درست است . ولی اگر دکمه ی Button1 را کلیک کنیم ، در Label1 هیچ مقداری نشان داده نخواهد شد. مشکل همین است که گفتم . البته علتش هم مشخص است . چون صفحه Refresh می شود ، بنابراین مقادیر تمام متغیرهای برنامه و متغیرهای کلاس ها را هم دوباره Refresh یا Reset کرده و به حالت مقدار پیش فرضشان در می آورد.
:خجالت:
حال سوال من این است که با توجه به این مسئله چطور می توان در C# ، از Object Oriented استفاده کرد ؟
:قهقهه:
فقط با تمام وجود خواهش می کنم کسی در پاسخ به این سوال نگوید که می توانی از Session و یا متغیرهای Static برای نگهداری مقادیر متغیرها استفاده کنی. چون همه می دانند که اینطوری با قضیه برخورد کردن ، Object Oriented نیست.
با تشکر
:لبخندساده:

Chabok
جمعه 26 مهر 1387, 19:30 عصر
سلام

چون بار دوم که صفحه لود می شود(یا دکمه کلیک می شود) این اتفاق می افتد :


Class1 objClass1 = new Class1();
Label1.Text = objClass1.firstName;

با دقت کدهای بالا رو تریس کنید .
حالا به نظرتون چرا لیبل شما خالیه ؟

mahdi_farhani
شنبه 27 مهر 1387, 07:32 صبح
از فکر متغییر عمومی بیا بیرون ، وب مثل ویندوز نیست .
شما یا از viewstate استفاده کن یا متغییر static
اگر از متغییر استاتیک استفاده میکنی ، همین روشت درسته ولی اگر از viewstate استفاده کنی .
تو get , set باید دیگه با viewstate استفاده کنی

ghayegh
شنبه 27 مهر 1387, 11:03 صبح
با سلام
:لبخندساده:
Chabok گفته بودید که به خاطر کد زیر است که متغیرم خالی را نشان می دهد:


Class1 objClass1 = new Class1();
Label1.Text = objClass1.firstName;

ولی من که این دو خط کد را پشت سر هم ننوشتم که شما این را می گوئید . شما اگر همین کدی را که نوشتم ( البته اگر سشن ها را به متغیر تبدیل کنید) ، در یک پروژه ی ویندوزی اجرا کنید ، اصلا داخل لیبل خالی نیست.

آقای mahdi_farhani هم گفته بودند :


از فکر متغییر عمومی بیا بیرون ، وب مثل ویندوز نیست

من به فکر متغیر عمومی نیستم و به فکر متغیر Private هستم . بعد هم این همه می گویند که C# یک زبان قوی Object Oreinted است ، چطور ممکن است که امکانی برای پیاده سازی Object Oreinted در وب نداشته باشد
:تشویق:
در هر حال از توجهتان ممنون

Amir Taghavi
شنبه 27 مهر 1387, 11:49 صبح
بعد هم این همه می گویند که C# یک زبان قوی Object Oreinted است ، چطور ممکن است که امکانی برای پیاده سازی Object Oreinted در وب نداشته باشد

oop تر ار #C سراغ داری؟!!!

جواب سوالت همونیه که آقا مهدی گفت (پست 3)

Chabok
شنبه 27 مهر 1387, 12:13 عصر
سلام


:لبخندساده:
Chabok گفته بودید که به خاطر کد زیر است که متغیرم خالی را نشان می دهد:


Class1 objClass1 = new Class1();
Label1.Text = objClass1.firstName;
ولی من که این دو خط کد را پشت سر هم ننوشتم که شما این را می گوئید . شما اگر همین کدی را که نوشتم ( البته اگر سشن ها را به متغیر تبدیل کنید) ، در یک پروژه ی ویندوزی اجرا کنید ، اصلا داخل لیبل خالی نیست.


اگه یکم دقت میکردین متوجه پاسخ من میشدید :


چون بار دوم که صفحه لود می شود(یا دکمه کلیک می شود) این اتفاق می افتد :


Class1 objClass1 = new Class1();
if (Session["FirstLoad"] == null)
{
Session["FirstLoad"] = true;
objClass1.firstName = "Mehrnoosh";
}
Label1.Text = objClass1.firstName;


خطوطی که قرمز شده اند دفعات بعد اجرا نخواهند شد .
چون شرط شما برقرار نیست و سشن شما پر است .

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

بهتره مثال خودم را با یک صفحه ساده وب بزنم (مثل asp یا php)
شما توی صفحه ای که طراحی می کنید صفحه از بالا به پایین شروع به اجرا کردن کدهای شما میکنه و یک سری کار انجام میده و نهایتا یک سری کد HTML تولید میکنه .

وقتی صفحه شما سمت سرور اجرا شد کدهای HTML به کلاینت ارسال می شود .
و دیگر سمت سرور چیزی باقی نمانده است .
منظورم اینه که دیگه کامپایل صفحه تمام شد .

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

امیدوارم متوجه شده باشید که وب مثل ویندوز نیست . شاید با ASP.net کمی این احساس بهتون دست بده .
ولی وب و پروتکل http به این صورته که هر بار که از سمت کلاینت درخواستی میاد کدهای شما اجرا میشن . در واقع کدهای شما همیشه در حال اجرا نیست.

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

موفق و پیروز باشید . خدانگهدار

ghayegh
شنبه 27 مهر 1387, 16:40 عصر
با سلام
از همه ی کسانی که تا الان راجع به این قضیه راهنمایی کردند ، ممنونم .
:تشویق:
کاربر Chabok ، در ارتباط با کد من در زیر گفته بودید :


Class1 objClass1 = new Class1();
if (Session["FirstLoad"] == null)
{
Session["FirstLoad"] = true;
objClass1.firstName = "Mehrnoosh";
}
Label1.Text = objClass1.firstName;

و شما گفته بودید :


خطوطی که قرمز شده اند دفعات بعد اجرا نخواهند شد .
چون شرط شما برقرار نیست و سشن شما پر است .

خوب ، من هم این ایف را نوشته ام که دیگر objClass1.firstName را پر نکند . یعنی می خواستم نشان دهم که متغیری که یک بار مقدار گرفته ، دفعه ی دوم مقدار نگیرد . و خط بعد از ایف که به لیبل مقدار می دهد ، از مقدار قبلی داده شده به متغیر استفاده کند که مشکلم همین بود که این کار را نکرده .
ضمنا من هم که گفتم که می دانم ، این مشکل به خاطر قضیه ی Refresh است .
بعد هم من یک بار این قضیه را که چرا نمی شود از Object Oreinted در وب استفاده کرد ، به یکی از استادهایم گفتم . ایشان گفتند :


چطور این همه سال است که طراحان سایت دارند از آبجکت ارینتد استفاده می کنند

این استادم از آن استاد آبکی ها نبود .
:لبخندساده:
همچنین من تمام توضیحات کاربر Chabok را خط به خط متوجه شدم و از ایشان ممنونم . ولی :
من متاسفانه هنوز نمی توانم باور کنم که در وب نمی توان از Object Oreinted استفاده کرد . تصور می کنم که هنوز ما ( کسانی که این صفحه را دیده اند) راه حلش را پیدا نکردیم.
:خجالت:
ضمنا من اصراری بر کدهایی که نوشتم ندارم . اصرار من بر این است که چطور می توان در Asp.Net ، مسئله ی Object Oreinted را پیاده سازی کرد.

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

mahdi_farhani
شنبه 27 مهر 1387, 17:21 عصر
میشه یک توضیحی در مورد شئ گرایی بدی ؟؟؟؟
شئ گرایی که فقط این یک نکته نیست

KambizZandi
شنبه 27 مهر 1387, 18:20 عصر
1/ صفحه شما با کليک بر روي دکمه refresh نميشود. بلکه Postback ميشود. به اين نکته دقت کنيد.
2/ در برنامه هاي وين، مقادير شما در memory نگهداشته شده و بعد از آن براحتي قابل استفاده هستند. چون context از بين نميرود. اما در وب با هر بار load شدن صفحه، مجددا context ساخته ميشود که البته مقاديري از آن از viewstate يا session يا controlstate مي آيند.
3/ وقتي صفحه اي ساخته ميشود، مقاديري را که ميخواهيم در سطح context نگهداري شوند بايد در مثلا viewstate يا session قرار دهيم.
4/ کنترلهاي asp.net معمولا خودشان اينکار را انجام ميدهند بشرطي که enableviewstate=true باشد که بصورت پيش فرض اينچنين است.
با توجه به موارد بالا شما بايد قبل از اينکه مقداري را در label قرار دهيد ابتدا چک کنيد که IsPostBack برابر false باشد:


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["FirstLoad"] == null)
{
Session["FirstLoad"] = true;
objClass1.firstName = "Mehrnoosh";
}
Label1.Text = objClass1.firstName;
}
}

ghayegh
شنبه 27 مهر 1387, 19:56 عصر
با سلام و تشکر دوباره از همه ی شما که دوباره به این سوال توجه کردید .
:لبخندساده:
آقای mahdi_farhani (http://barnamenevis.org/forum/member.php?u=6523) ، گفته بودید :


شئ گرایی که فقط این یک نکته نیست

دقیقا بالای پیغام شما ، من با رنگ سبز نوشته بودم :
ضمنا من اصراری بر کدهایی که نوشتم ندارم . اصرار من بر این استکه چطور می توان در Asp.Net ، مسئله ی Object Oreinted را پیاده سازیکرد.
در هر صورت باز هم از توجهتان ممنون.:تشویق:
راستش من
1- هر کسی که بخواهد به جای متغیرهای private ، از Session ها و یا متغیرهای Static استفاده کند ، به او می گویم Object Oriented کار نکرده ای.
2- هر کسی که بخواهد یک کلاس بنویسد و به جای تمام متغیرهای Public و Private اش ، از متغیرهای Static استفاده کند ، به او می گویم Object Oriented کار نکرده ای.
3- هر کسی که بخواهد یک کلاس بنویسد که در آن از متغیرهای Public و Private استفاده کند و بعد برای اینکه این مقادیر کار کند ، آن آبجکتی که از کلاس گرفته در یک Session ذخیره کند تا بعدها بتواند آن مقادیر Public و Private را از Session بازیابی کند ، به او می گویم Object Oriented کار نکرده ای.
4- هر برنامه ای که نتواند حتی مقدار یک آبجکتی از کلاس را در متغیرهای سراسری خودش ذخیره کند ، آیا این Object Oreinted است؟
5- هر برنامه ای که تنها راه ذخیره کردن یک آبجکت از کلاس ، این باشد که آن آبجکت را در Session ذخیره کند و یا در متغیر Static ، آیا این Object Oreinted است؟ قطعا نیست و قطعا C#.Net راهکاری برای پیاده سازی Object Oreinted در وب ارائه داده است.


ما چه موقع از یک متغیر Static استفاده می کنیم ؟ پاسخ : زمانی که برای تمام آبجکت هایی که از یک کلاس گرفته می شود ، آن مقداری که مد نظر ماست ، یکسان باشد . پس چرا دارید از متغیر Static در جائی غیر از خودش استفاده می کنید ؟ من خودم هم قبلا به غلط از Static و Session استفاده می کردم. ولی همان موقع هم می دانستم که دارم کاری می کنم که در جای خودش نیست.

با توجه به توضیحات شما ، که همه را هم قبول دارم ، من نمی دانم چرا از خود نمی پرسید که ASP.NET چطور می تواند مقدار Session را ذخیره کند ، ولی راهکاری برای ذخیره ی مقادیر Private نگذاشته است؟
:عصبانی++:
من هنوز جواب خودم را پیدا نکردم.

ممنون .

Behrouz_Rad
یک شنبه 28 مهر 1387, 00:33 صبح
من فکر میکنم شما در کلاس های آموزش برنامه نویسی شرکت کردید.
اصولاً در این کلاس ها بحث OOP رو به خوبی به هنرجو یاد نمیدن. بنابراین هنرجو هر مسئله ای رو سعی می کنه به نوعی به OOP ارتباط بده!

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



1- هر کسی که بخواهد به جای متغیرهای private ، از Session ها و یا متغیرهای Static استفاده کند ، به او می گویم Object Oriented کار نکرده ای.

Session یکی از راه های ذخیره ی مقداری عمومی برای هر فرد در ASP.NET هست. متغیرهای عمومی به منظور نگهداری داده بین صفحات کاربردی ندارن.


2- هر کسی که بخواهد یک کلاس بنویسد و به جای تمام متغیرهای Public و Private اش ، از متغیرهای Static استفاده کند ، به او می گویم Object Oriented کار نکرده ای.

البته بهتره بنده در این مورد به شما بگم که OOP کار نکردی! کلاس های Utility تماماً از اعضای Static ایجاد میشن!


3- هر کسی که بخواهد یک کلاس بنویسد که در آن از متغیرهای Public و Private استفاده کند و بعد برای اینکه این مقادیر کار کند ، آن آبجکتی که از کلاس گرفته در یک Session ذخیره کند تا بعدها بتواند آن مقادیر Public و Private را از Session بازیابی کند ، به او می گویم Object Oriented کار نکرده ای.

در ASP.NET برای هر سناریویی ابزار خاص خودش تعبیه شده. وقتی که ماهیت چیزی رو می دونیم، دلیل وجود یا عدم وجود اون واسمون آسون میشه. همون طور که دوستان اشاره کردن، بعد از ارسال صفحه به کلاینت، اون صفحه به طور کامل از بین میره. این ماهیت وب هست! ارتباطی هم با نوع زبان یا شرکت نداره! در حال حاضر تو در کدهات از ماهیت وب تخطی کردی. مورد 3 هم ارتباطی با بحث OOP نداره.


4- هر برنامه ای که نتواند حتی مقدار یک آبجکتی از کلاس را در متغیرهای سراسری خودش ذخیره کند ، آیا این Object Oreinted است؟

البته ASP.NET یک تکنولوژیه و زبان نیست. مشکل شما اینه که دید ویندوز به وب داری. تا این دید اصلاح نشه هر چه ما بگوییم راه به جایی نبرد ;) "متغیر عمومی" در وب به اون معنا که در ویندوز وجود داره نیست! در وب از Session، Application، Cache، Cookie و ViewState بنا به اقتضای شرایط استفاده میشه. ما در ویندوز از این چیزها نداریم!


5- هر برنامه ای که تنها راه ذخیره کردن یک آبجکت از کلاس ، این باشد که آن آبجکت را در Session ذخیره کند و یا در متغیر Static ، آیا این Object Oreinted است؟

جواب این سوال اینه: درک درستی از OOP پیدا نکردید.

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

موفق باشید.

ghayegh
یک شنبه 28 مهر 1387, 11:40 صبح
با سلام
:لبخندساده:
بابا ما کی به هر کسی هر لقبی که خواستیم ، نسبت دادیم ؟ توی هر پیغاممون هم هر وقت خواستیم بگوئیم پاسخ شما را به فلان دلیل قبول نداریم ، بعدش هم گفتیم که با این وجود از اینکه به این سوال توجه کردید ،ممنونم . روی پیغام اکثریتتون هم ، بر روی Button تشکر کلیک کردیم. بالاخره سوال دیگه . حل هم نشده .
قبلا هم گفتم . من یک استاد فوق العاده بداخلاق داشتم که فوق العاده هم با سواد بود . نمی خوام بگم هر چی گفته درست بوده . ولی من خودم هم قبلا که این سوال رو ازش پرسیدم ، قیافه اش و مفهوم حرفش ، تمام حاکی از تعجب وی از حرف من بود که چرا گفته ام نمی توان در وب Object Oreinted را آنطور که مد نظرمان است ، پیاده سازی کرد.

کسی پاسخ دیگری برای سوال این صفحه ندارد؟
:متفکر:
اگر راهنمایی کنید ، ممنون می شوم.

Amir Taghavi
یک شنبه 28 مهر 1387, 12:01 عصر
کسی پاسخ دیگری برای سوال این صفحه ندارد؟

پاسخی نموده!
جوابت رو در پست های قبلی جستجو کن.


آنطور که مد نظرمان است

مد نظرت اینه که یه class بسازی که چندتا property و method داشته باشه؟ خوب تو که این کار و کردی ولی اشتباهت اینه که وب رو با ویندوز اشتباه گرفتی. تو win مقدار var ها تو ram میرن. اگه وب هم همینجور بود که... دیگه خودت تا اخر داستانو حدس بزن. (:

ghayegh
یک شنبه 28 مهر 1387, 13:03 عصر
با سلام

Behrouz_Rad گفته بودید :


Sessionیکی از راه های ذخیره ی مقداری عمومی برای هر فرد در ASP.NET هست. متغیرهای عمومیبه منظور نگهداری داده بین صفحات کاربردی ندارن.

متغیرهای عمومی مگر فقط برای انتقال اطلاعات بین صفحات باید استفاده شوند ؟ حتی اگر به Object Oreinted هم کاری نداشته باشیم ( منظورم این است که آن کلاسی که نوشتم ، حذف کنیم ) و کدی مشابه با کد متدLoad بنویسیم ، می بینیم که اصلا مقدار متغیر Public را در همان صفحه هم بعد از PostBack نگه نمی دارد. دیگر چه برسد به اینکه صفحه ی دیگر بخواهد از مقدار متغیر Public صفحه ی قبل استفاده کند.
خواهش می کنم در پاسخ به این سوال نگوئید :


بعد از ارسال صفحه به کلاینت، اون صفحه به طور کامل از بین میره

چون اولا این حرفتان را قبول دارم ، ثانیا سوالم این است که چطور می تواند مقدار Session را ذخیره کند ؟ اما مثلا نمی تواند مقدار متغیرهای Private را ذخیره کند ؟ حالا اصلا نمی تواند ، درست . راه حلش چیست که بتواند مقدار متغیرهای Private را ذخیره کرد؟
من یک سوالی از همه ی شما دارم : مثلا در پروژه های ویندوزی می گوئیم که یک ماشین یک سری خصوصیاتی دارد : مثلا رنگش و مدلش و تعداد درهایش و یک سری رفتارهایی دارد : مثلا : ترمز می کند و جلو می رود و عقب می رود. بنابراین می آئیم و یک کلاس ماشین درست می کنیم .
دائم می گوئید :


وب را با ویندوز اشتباه گرفتی

حال سوال اصلی من این است :


آیا این مفاهیمی که گفتم در پروژه های وب از بین می رود ؟

آیا در این ASP.NET ی که شما از آن ترسیم می کنید ، این مفهوم که ماشین ، خصوصیات اختصاصی (Private Property) و یا رفتار اختصاصی(Private Method) دارد ، از بین می رود ؟ با توجه به آنچه که شما می گوئید و می خواهید که ظاهرا متغیرهای کلاس ماشین را هم Static تعریف کنید ، مشکل زیر بوجود می آید :
اگر کلاس لندرور و کلاس بنز ، از کلاس ماشین به ارث برده شوند ، و بعد مثلا یک خصوصیتی در کلاس لندرور را تغییر دهید ( این خصوصیت را از کلاس ماشین ) به ارث برده ، آنگاه ، مقدار کلاس بنز را هم تغییر داده اید . به این دلیل که همانطور که قبلا گفتم ، ماهیت متغیرهای استاتیک این است که این مقدار برای تمام آبجکت ها یکسان است.
مگر اینکه نخواهید از یکی از مفاهیم اصلی Object Oreinted یعنی Inheritance ( وراثت ) استفاده کنید.


protectedvoid Page_Load(object sender, EventArgs e)
{
if (Session["FirstLoad"] == null)
{
Session["FirstLoad"] = true;
Machine.theProperty = "";
BMV.theProperty = "xxxxxxxxxxxx";
}
//مشکل خط زیر پیدا می شود . در زیر کلاس بنز تا به حال نباید مقدار
// می گرفته ، ولی به دلیل اینکه از متغیر استاتیک در جائی غیر از خودش
// استفاده کردیم ، مقدار داده شده در کلاس بی ام و را دارد نشان می دهد
// طبیعی هم هست که مشکل بوجود آید
Label1.Text = Benz.theProperty;
}



publicclassMachine
{
/*Private متغیر استاتیک زیر قرار بوده که یک متغیر*/
/* در کلاس های دیگر به آن دسترسیset , get باشد که بعدها از طریق متد */
/*پیدا شود*/
publicstaticstring theProperty;
}



publicclassBenz : Machine
{
public Benz()
{
//
// TODO: Add constructor logic here
//
}
}



publicclassBMV : Machine
{
public BMV()
{
//
// TODO: Add constructor logic here
//
}
}

من البته برنامه ی کوچکی مطلبی را که گفتم ، به سایت فرستادم . لطف کنید آن را ببینید.

Behrouz_Rad
یک شنبه 28 مهر 1387, 14:10 عصر
سوالم این است که چطور می تواند مقدار Session را ذخیره کند ؟ اما مثلا نمی تواند مقدار متغیرهای Private را ذخیره کند ؟ حالا اصلا نمی تواند ، درست . راه حلش چیست که بتواند مقدار متغیرهای Private را ذخیره کرد؟

واقعاً بعضی چیزها اینقدر واضح هستند که شاید به همین دلیل نمیشه زیاد در مورد اونها توضیح داد.
تو اینطوری در نظر بگیر که "متغیر عمومی" همون Session هست. هر چند که این مسئله رو میدونی که صفحه پس از ارسال به کلاینت از بین میره اما واست قابل هضم نیست. دلیلش رو در ادامه میگم.

در زمان ورود به هر سایتی که با ASP.NET ایجاد شده، یک عدد راندوم تولید میشه که بهش میگن SID یا همون Session Identifier. این مقدار در یک کوکی ذخیره میشه و بر روی سیستم کاربر قرار میگیره.
این کوکی حتماً نیازه (البته در URL هم میشه ذخیرش کرد) تا Session های بعدی که برای کاربر ایجاد میشن و در حافظه ی Server ذخیره میشن، بتونن Tracking یا ردیابی بشن. در هنگام ارسال درخواست توسط کاربر به سایت، مقدار SID از کوکی بازیابی میشه و با مقادیر موجود در Server مقایسه میشه. بدین طریق میشه متوجه شد که فلان Session مربوط به فلان کاربر هست. این دقیقاً اصلی ترین قسمت جوابته. چون ابهام اصلی که واست وجود داره اینه که نمی دونی چطور ASP.NET متوجه میشه که فلان Session مال فلان کاربر هست. امیدوارم پاسخت رو در این زمینه گرفته باشی :)

و اما بیا کمی عمیق تر به قضیه نگاه کنیم و این بار حق رو به تو بدیم! ;)
خیلی اصرار داری که حتما بشه متغیر عمومی رو مثل ویندوز باهاش رفتار کنی؟ بسیار خوب. من این پیشنهاد رو به تیم توسعه ی ASP.NET بدین شکل می تونم بدم: نوعی از اعلان خاص در ASP.NET قرار بگیره که در زمان تعریف متغیر عمومی، مشخص کنه که ما رفتاری مثل ویندوز رو از اون انتظار داریم.
به عنوان مثال:


public partial class _Default : System.Web.UI.Page
{

MyClass WinBehavior behrouz = new MyClass();

protectedvoid Page_Load(object sender, EventArgs e)
{
if (Session["mySession"] == null)
{
Session["mySession"] = true;
behrouz.Property = "Hello World!";
}

Label1.Text = behrouz.Property;
}

}

فکر می کنی که تیم توسعه به چه شکل می تونه این پیشنهاد رو پیاده سازی کنه؟ شک نکن که Session تنها راهیه که می تونه برای پیاده سازی این روش ازش استفاده کنه.

در مورد بقیه ی صحبت هات هم نیازی به توضیح نیست. چون در پست قبلی گفتم که متغیر عمومی کلاً در وب نداریم! پس Static بودن یا نبودنش فرقی نداره.

موفق باشید.

ghayegh
یک شنبه 28 مهر 1387, 15:28 عصر
با سلام
باز هم ممنون که به این سوال توجه کردید.
:لبخندساده:
آقای Behrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) گفته بودید :


متغیر عمومی کلاً در وب نداریم


مطلب 1 :
همانطور که می دانیم ، خیلی از مفاهیم و یا کامپوننت های ویندوزی در وب نیست و برعکس . به خاطر همین هم وقتی مثلا با Visual Studio.NET2005 کار می کنیم ، می بینیم که مثلا اگر از کلمه ی webBrower در وب استفاده کنیم ، (که در حقیقت یک کامپوننت ) است ، برنامه ی وب آن را نمی شناسد.
حال سوال من نسبت به حرفی که زدید ، این است که اگر متغیر عمومی در وب نداریم ، پس چطور Visual C#.NET2005 نسبت به استفاده از این کلمه ، حساسیت نشان نمی دهد . یا مثلا چرا نسبت به کلمه ی Private ، حساسیت نشان نمی دهد و آن را قبول می کند.
مطلب 2 :
من قبلا در برنامه ASP.NET2005 ، یک کلاس ارتباط با دیتابیس نوشته بودم که فرض کنید فقط کواری را اجرا می کرد . مثلا ابتدا توسط برنامه ، مقداری که قرار است در دیتابیس ریخته شود ، را در متغیر Private می ریخت و بعد چون هنوز PostBackی نشده بود ، همان مقدار را به دیتابیس ارسال می کرد. ( که اگر قرار بود PostBack ی انجام شود ، مقدار داخل Private ، خالی بود . )

حال با توجه به مطلب 1 و مطلب 2 و نوشته ی خودتان ، نمی خواهید بگوئید که چرا می شود از مثلا متغیرهای Public و متغیرهای Private استفاده کرد ، ولی به شکل یک بار مصرف ( مثل کلاس ارتباط با دیتابیسی که من نوشتم ) – ( منظورم از یک بار مصرف ، PostBack نشدن است ، یعنی مقدار Private تا زمانی اعتبار دارد که PostBack ی انجام نشده باشد).

آقای Behrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، از توضیحاتتان ممنون . ولی کاش جواب این سوالم را که قبلا در مورد کلاس Machine و کلاس Benz و کلاس BMV دادم می دادید. من در آن تاپیک این مسئله را مطرح کرده بودم ، که اگر بخواهید همه ی متغیرها را Static تعریف کنید ، آن وقت از این قانون طبیعی که هر شیء ای ، یک سری خصوصیات اختصاصی دارد و یک سری رفتاری های اختصاصی ، تخطی کرده اید.

ضمنا شما گفتید :


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


حقیقتا من هم ، همین احساس را نسبت به متغیرهای Private دارم. اگر شخصی بر روی کره ی زمین ، دارای این خصوصیت اختصاصی باشد که رنگ چشمش آبی است ( در ویندوز رنگ چشم فلان شخص آبی است ) ، آیا اگر این شخص به فضا ( به وب ) برود ، خصوصیات اختصاصی اش ( رنگ چشمش آبی است ، پس دارای یک سری خصوصیات Private است ) ، تغییر می کند ؟

اکثر کسانی که این سوال من را خوانده اند ، می گویند :


وب را با ویندوز اشتباه گرفته ای


دقیقا مثل کسانی که می گویند : این نسل جدید با نسل قبلی ها متفاوتند . خوب در این که شکی نیست . ولی یک سری خصوصیات را نمی توان منکر شد . مثل اینکه هم نسل قبلی و هم نسل جدید ، غذا می خورند ( حالا قبلی ها نون و پنیر و پیاز می خوردند ، جدیدی ها اکثرا برنج می خورند.) یعنی هر دو نسل ، غذا می خوردند ، ولی هر کدام ، این Method غذاخوردن را یک جور پیاده سازی می کردند.

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

آقای Behrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، گفته بودید :


فکر می کنی که تیم توسعه به چه شکل می تونه این پیشنهاد رو پیاده سازی کنه؟ شک نکن که Session تنها راهیه که می تونه برای پیاده سازی این روش ازش استفاده کنه.


حتی اگر چنین باشد که شما می گوئید ، پس چطور ممکن است که ASP.NET2005 ، پکیجی برای این کار در نظر نگرفته باشد؟
:عصبانی++:
ممنون.

ghayegh
یک شنبه 28 مهر 1387, 17:14 عصر
با سلام
:لبخندساده:
یک خواهشی داشتم از کسانی که به این سوال می خواهند پاسخ دهند .
:تشویق:
اولا از تمام کسانی که قصد کمک دارند ، ممنونم .
ثانیا خواهش می کنم ، در پاسخ به این سوال ، جواب های الکی ندهید ، مثلا یکی از افرادی که خواسته صبحتی در رابطه با این سوال بکند ، گفته :


پاسخی نموده!

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


ببینید ، فوقش این است که دیگر هیچ کس پاسخی به ذهنش نمی رسد به من بدهد و قضیه تمام می شود.


من هنوز پاسخ خود را دریافت نکردم . اگر کسی می تواند در این زمینه راهنمایی کند ، ممنون می شوم.

Behrouz_Rad
یک شنبه 28 مهر 1387, 17:22 عصر
ما قبلاً مدیری در این سایت داشتیم با آی دی Inprise. جا داره که اینجا هم از ایشون یادی کرده باشیم. شانس خوبی آوردی که با ایشون در این مورد بحث نمی کنی ;) بگذریم...



همانطور که می دانیم ، خیلی از مفاهیم و یا کامپوننت های ویندوزی در وب نیست و برعکس . به خاطر همین هم وقتی مثلا با Visual Studio.NET2005 کار می کنیم ، می بینیم که مثلا اگر از کلمه ی webBrower در وب استفاده کنیم ، (که در حقیقت یک کامپوننت ) است ، برنامه ی وب آن را نمی شناسد.
حال سوال من نسبت به حرفی که زدید ، این است که اگر متغیر عمومی در وب نداریم ، پس چطور Visual C#.NET2005 نسبت به استفاده از این کلمه ، حساسیت نشان نمی دهد . یا مثلا چرا نسبت به کلمه ی Private ، حساسیت نشان نمی دهد و آن را قبول می کند.

این مطالب چه ارتباطی با بحث "متغیر عمومی" دارن؟


من قبلا در برنامه ASP.NET2005 ، یک کلاس ارتباط با دیتابیس نوشته بودم که فرض کنید فقط کواری را اجرا می کرد . مثلا ابتدا توسط برنامه ، مقداری که قرار است در دیتابیس ریخته شود ، را در متغیر Private می ریخت و بعد چون هنوز PostBackی نشده بود ، همان مقدار را به دیتابیس ارسال می کرد. ( که اگر قرار بود PostBack ی انجام شود ، مقدار داخل Private ، خالی بود . )

حال با توجه به مطلب 1 و مطلب 2 و نوشته ی خودتان ، نمی خواهید بگوئید که چرا می شود از مثلا متغیرهای Public و متغیرهای Private استفاده کرد ، ولی به شکل یک بار مصرف ( مثل کلاس ارتباط با دیتابیسی که من نوشتم ) – ( منظورم از یک بار مصرف ، PostBack نشدن است ، یعنی مقدار Private تا زمانی اعتبار دارد که PostBack ی انجام نشده باشد).

کدها رو قرار بده تا دلیلش رو بگم.


آقای Behrouz_Rad ، از توضیحاتتان ممنون . ولی کاش جواب این سوالم را که قبلا در مورد کلاس Machine و کلاس Benz و کلاس BMV دادم می دادید. من در آن تاپیک این مسئله را مطرح کرده بودم ، که اگر بخواهید همه ی متغیرها را Static تعریف کنید ، آن وقت از این قانون طبیعی که هر شیء ای ، یک سری خصوصیات اختصاصی دارد و یک سری رفتاری های اختصاصی ، تخطی کرده اید.

هر چند که ارتباطی بین این سوال و بحث متغیر عمومی نمی بینم، اما باید بگم که ممکنه من نیاز داشته باشم که کلاسی سرتاسر با متغیرهای استاتیک ایجاد کنم. مثلاً کلاسی که تنظیمات عمومی برنامه رو از فایل Web.Config می خونه :) اینجاست که من میگم اگر برای خوندن این مقادیر از چیزی به جز متغیرهای Static استفاده کنی، OOP کار نکردی! :)

یک مطلب مهمی هم که باید بدونی اینه که استفاده نکردن یک فرد از مفاهیم OOP در برنامش، با عدم پشتیبانی یک زبان از OOP دو چیز متفاوته! OOP پنج خصوصیت هست که زبان هایی که اون رو داشته باشن شی گرا محسوب میشن. مثلاً VB.6.0 چیزی با عنوان Inheritance نداره؛ پس شی گرا نیست. زبان های دات نت همه ی اون خصوصیات رو دارن؛ پس شی گرا هستن. به همین سادگی :)


ببینید ، فوقش این است که دیگر هیچ کس پاسخی به ذهنش نمی رسد به من بدهد و قضیه تمام می شود.

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

و در پایان: "پیاده سازی مسئله ی Object Oreinted در وب" که مرتباً از اون یاد می کنی با بحث "متغیر عمومی" ارتباطی نداره! من فکر می کنم در مورد OOP برخی مفاهیم رو به درستی متوجه نشدید.

موفق باشید.

ghayegh
یک شنبه 28 مهر 1387, 21:07 عصر
با سلام
:لبخندساده:
آقایBehrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945)، از توضیحتتان باز هم تشکر می کنم .

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

آقایBehrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، گفته بودید :


این مطالب چه ارتباطی با بحث "متغیر عمومی" دارن؟
و
هر چند که ارتباطی بین این سوال و بحث متغیر عمومی نمی بینم،
و
و در پایان: "پیاده سازی مسئله ی Object Oreinted در وب" که مرتباً از اون یاد میکنی با بحث "متغیر عمومی" ارتباطی نداره


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

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

آقایBehrouz_Rad (http://barnamenevis.org/forum/member.php?u=7945) ، گفته بودید :


تنظیمات عمومی برنامه رو از فایل Web.Config می خونه :) اینجاست که من میگم اگربرای خوندن این مقادیر از چیزی به جز متغیرهای Static استفاده کنی، OOP کار نکردی! :)

مگر من می گویم از متغیرهای Static در برنامه ها و اصلا در برنامه های Object Oreinted نباید استفاده شود ؟ خوب معلوم است که این متغیرهای Static را به یک منظوری ساخته اند . الکی که نبوده . حرف من این است که شماها می خواهید از متغیرهای Staticدر کلاس ها ، استفاده ی نابجا کنید . یعنی اینکه متغیرهای Static را برای منظوری ساخته اند . اما شما می خواهید از آن استفاده ی نادرست کنید.


هر کسی راجع به پیاده سازی مسئله ی Object Oreinted در وب ( ASP.NET2005) نظری داره ، لطفا بیان کنه. اصلا یک لطفی می کنید : یک کلاس بسیار کوچک ، مثلا همان کلاس BMV و کلاس Benz را که از کلاس Machine مشتق شده بود ، طراحی می کنید که من ببینم شما چطور طراحی می کنید . فقط در طراحی یادتان باشد که کلاس Benz و کلاس BMV ، هر کدام دارای یک سری خصوصیات اختصاصی هستند. ( مثلا کلاس Benz ، یکی از ویژگیهای اختصاصی اش این است که تویش عروسک خرس هست که تازگی ها مد شده – منظورم این است که مثل آینه ی ماشین که یکی از وسایل ماشین است ، این هم یکی از وسایل ماشین است و همچنین کلاس BMV ، یکی از ویژگیهای اختصاصی اش این است که وقتی روشنش می کنیم ، همان لحظه به طور اتوماتیک ، ضبطش روشن می شود ).

Behrouz_Rad
یک شنبه 28 مهر 1387, 21:48 عصر
بحث رو به بیراهه بردی.
من فکر می کنم خودت هم نمیدونی سوالت چیه! و مطمئنم داری مغلطه می کنی.
جواب سوالاتت همگی داده شد. اگر ابهام دیگه ای داری می تونی از گوگل کمک بگیری.

موفق باشید.