PDA

View Full Version : سوال: تعریف یک کلاس یا متغیر به صورت سراسری در کل پروژه



ESG_Esfahan
جمعه 03 مهر 1388, 14:38 عصر
سلام
چطور میشه یک کلاس یا یک متغییر تعریف کرد که در کل پروژه به آن دسترسی داشته باشیم. یعنی در همه فرم ها و کلاسهای دیگه بتونیم مقدار آن متغییر را استفاده کنیم یا متغییر را مقدار دهی کینم.
با تشکر

اَرژنگ
جمعه 03 مهر 1388, 15:00 عصر
سلام
چطور میشه یک کلاس یا یک متغییر تعریف کرد که در کل پروژه به آن دسترسی داشته باشیم. یعنی در همه فرم ها و کلاسهای دیگه بتونیم مقدار آن متغییر را استفاده کنیم یا متغییر را مقدار دهی کینم.
با تشکر

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

ESG_Esfahan
شنبه 04 مهر 1388, 03:26 صبح
من متوجه مشکل اخلاقی خودم نشدم.تا حالا پیش نیومده که بخواهید یک setting در برنامه خودتان بزارین که لازمه همه جای پروژه بهش دسترسی داشته باشید در صورت لزوم عوضش کنید.
نمی دونم شما در مورد سوال چه فکری کردید که من را محکوم کردید به مخالفت با اصول.
از پاسخ شما ممنونم

zahra_63
شنبه 04 مهر 1388, 07:38 صبح
در solution explorer یک فولدر اضافه کن و اسمشو بزار Allclass و کلاسها و توابع ومتغییر هاتو اونجا تعریف کن و در برنامه اونارو فراخوانی کن
:گیج:

Amir Oveisi
شنبه 04 مهر 1388, 13:29 عصر
تا حالا پیش نیومده که بخواهید یک setting در برنامه خودتان بزارین که لازمه همه جای پروژه بهش دسترسی داشته باشید در صورت لزوم عوضش کنید.

برای این کارها میشه از فایل setting پروژه استفاده کرد.
میتونین از Registry هم استفاده کنید.


تعریف متغیر سراسری بر خلاف قواعد شی گرایی هست و باید از این کار خودداری کرد. چون کسی که با #C برنامه نوسیس میکنه حتما قصد داره برنامه نویسی شی گرا انجام بده (که یکی از نقاط قوت محسوب میشه برای یک برنامه) بنابراین دلیلی نداره خواسته یا نا خواسته اصول شی گرایی رو زیر پا بذاره و نادیده بگیره.

موفق باشید

alireza_tavakol
شنبه 04 مهر 1388, 14:44 عصر
سوالی که میپرسید خلاف اصول برنامه نویسی است،


تعریف متغیر سراسری بر خلاف قواعد شی گرایی هست و باید از این کار خودداری کرد. چون کسی که با C#‎‎‎ برنامه نوسیس میکنه حتما قصد داره برنامه نویسی شی گرا انجام بده


به نظر من ، همیشه قوانین برای رسیدن به شرایط مفید وضع میشوند و در صورتی که قوانین باعث عسر و حرج شود پشیزی ارزش ندارد

یک سوال ، از نوع بی نیاز به پاسخ : مگه قوانین شی گرا وحی منزل ( آیات قرآن ) که آری از هر گونه عیب باشه؟ آیا این امکان وجود نداره که در چند سال آینده به این نتیجه برسیم که برنامه نوسی شی گرا تا حدی غلط است و روش جدیدی ابدا شود که علیه روش شی گرا باشد و مفید تر ارزیابی شود؟

من فکر میکنم بعضی وقت ها ما از بعضی چیز های یک بت می سازیم و دیگه جرئت خراب کردن اون بت رو به خودمون نمی دیم. یا مثلا" در بعضی از موارد به خودمون اجازه نمی دیم که ماورا کتاب های مرجع نظریه پردازی کنیم ( کشتن خلاقیت )

دقیقا" یک همچین دیدگاهی نسبت به دستور GoTo است ، که البته به نظر من باید این گونه دیدگا ها اصلاح بشه

سوال از اساتید ( جناب آقایان bermooda و اَرژنگ ):آیا تا حالا توی هیچ کدوم از پروژه های رسمی تون از متغییر سراسری استفاده نکرده اند؟ آیا توی زندگی شخصیتون همیشه و در همه حال به تمام قوانین اجتماعی و اخلاقی پایبند بوده اید! ( به نظر من برنامه نویسی مثل زندگی می ماند ، همون طوری که توی زندگی ، گاهی آدمیان از چراغ قرمز عبور میکنند ، برنامه نویس ها هم شایسته است از چراغ های قرمز عبور کنند تا از لذت تخلف محروم نمانند :شیطان:)

سوال از عوام الناس برنامه نویس: به نظر شما گرامیان چرا در زبان برنامه نویسی Object Base سی شارپ بخش setting در نظر گرفته شده است؟

اَرژنگ
شنبه 04 مهر 1388, 15:21 عصر
به نظر من ، همیشه قوانین برای رسیدن به شرایط مفید وضع میشوند و در صورتی که قوانین باعث عسر و حرج شود پشیزی ارزش ندارد

یک سوال از نوع بی نیاز به پاسخ : مگه قوانین شی گرا وحی منزل ( آیات قرآن ) که آری از هر گونه عیب باشه؟ آیا این امکان وجود نداره که در چند سال آینده به این نتیجه برسیم که برنامه نوسی شی گرا تا حدی غلط است و روش جدیدی ابدا شود که علیه روش شی گرا باشد و مفید تر ارزیابی شود؟

من فکر میکنم بعضی وقت ها ما از بعضی چیز های یک بت می سازیم و دیگه جرئت خراب کردن اون بت رو به خودمون نمی دیم. و یا شاید به خودمون اجازه نمی دیم که ماورا کتاب های مرجع نظریه پردازی کنیم ( کشتن خلاقیت )

دقیقا" یک همچین دیدگاهی نسبت به دستور GoTo وجود داره ، که البته به نظر من باید این گونه دیدگا ها اصلاح بشه

سوال از اساتید ( جناب آقایان برمودا و اَرژنگ ):آیا تا حالا توی هیچ کدوم از پروژه های رسمی شون از متغییر سراسری استفاده نکرده اند؟ آیا توی زندگی شخصیتون همیشه و در همه حال به تمام قوانین اجتماعی و اخلاقی پایبند بوده اید! ( به نظر من برنامه نویسی مثل زندگی می ماند ، همون طوری که توی زندگی ، گاهی آدمیان از چراغ قرمز عبور میکنند ، برنامه نویس ها هم شایسته است از چراغ های قرمز عبور میکنند تا از لذت تخلف محروم نمانند )

سوال از عوام الناس برنامه نویس: پس به نظر شما گرامیان چرا در زبان برنامه نویسی Object Base سی شارپ بخش setting در نظر گرفته شده است؟

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

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

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

در ضمن این ربطی به برنامه نویسی شئی‌گرائی ندارد، در بین کاراهایه ساده اشتباه این یکی از قدیمترینهاست، دلایل اشتباه بودن این مثال حداقل از۳۰ سال پیش معلوم بود.

در دانشگاه به مسائلی خیلی جزئیتر از اینها اشکال میگرفتند.

دفاع از این مورد از لحاظ تخصصی مسخره است.

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

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

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

بعضیها برنامه‌نویسی را با ‌ تایپ کردن عوضی میگرند.

MAHDIhp_devsq
شنبه 04 مهر 1388, 15:30 عصر
اگر مشكلي دارين از راه هاي مختلفي امتحان كنيد آقاي
alireza_tavakol (http://barnamenevis.org/forum/member.php?u=17033)


اگه اين طوريه يك متغير سراسري هم وحي منزل نيست از راه هاي ديگه استفاده كنيد .مهدي

alireza_tavakol
یک شنبه 05 مهر 1388, 04:09 صبح
با تشکر از استاد عزیزم اَرژنگ جان

به نظر من باید پشت هر قانون ، دلیلی وجود داشته باشه و کسی که قراره به این قانون پایبند باشه علت وضع قانون رو بدانه ، چون پیروی کورکورانه از قوانین ممکنه باعث تخطی شود.

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

علت خلاف بودن تعریف متغییر سراسری در کتاب قانونٍ شی گرایی چیست ؟

صرف نظر از اینکه : معمولا کسانی که به دنبال روش متغییر سراسری هستند برایه رد و بدل اطلاعات ازش استفاده میکنند ، ولی من یک متغییر سراسری توی برنامه ام تعریف می کنم برای نگه داری یک مقدار کلی که لازمه در سرتاسر برنامه ام ازش استفاده کنم ( مثلا" نگه داری عدد پی برای محاسبات ریاضی ) ( فرض مسئله : نبود کلاس math و نبود ثابت pi است )

zoofa
دوشنبه 06 مهر 1388, 02:02 صبح
سلام
حالا جدا از بحث استفاده
آيا ميشه يك همچين متغيري تعريف كرد و يا حتي يك تابع كه بدون نياز به كلاس تعريف كردن بشود در همه‌ي پروژه استفاده كرد؟؟
ممنون

اَرژنگ
دوشنبه 06 مهر 1388, 08:57 صبح
با تشکر از استاد عزیزم اَرژنگ جان

به نظر من باید پشت هر قانون ، دلیلی وجود داشته باشه و کسی که قراره به این قانون پایبند باشه علت وضع قانون رو بدانه ، چون پیروی کورکورانه از قوانین ممکنه باعث تخطی شود.

شما اساتید فرمودین :

علت خلاف بودن تعریف متغییر سراسری در کتاب قانونٍ شی گرایی چیست ؟

صرف نظر از اینکه : معمولا کسانی که به دنبال روش متغییر سراسری هستند برایه رد و بدل اطلاعات ازش استفاده میکنند ، ولی من یک متغییر سراسری توی برنامه ام تعریف می کنم برای نگه داری یک مقدار کلی که لازمه در سرتاسر برنامه ام ازش استفاده کنم ( مثلا" نگه داری عدد پی برای محاسبات ریاضی ) ( فرض مسئله : نبود کلاس math و نبود ثابت pi است )
http://en.wikipedia.org/wiki/Global_variable

They are usually considered bad practice precisely because of their nonlocality: a global variable can potentially be modified from anywhere, (unless they reside in protected memory (http://en.wikipedia.org/wiki/Protected_memory)) and any part of the program may depend on it. A global variable therefore has an unlimited potential for creating mutual dependencies, and adding mutual dependencies increases complexity.

ثابت pi, متغییر نیست، با ثابتهایه سراسری اشکالی نیست، با متغییرهایه سراسری اشکال هست.

alireza_tavakol
دوشنبه 06 مهر 1388, 12:57 عصر
They are usually considered bad practice precisely because of their nonlocality: a global variable can potentially be modified from anywhere, (unless they reside in protected memory) and any part of the program may depend on it. A global variable therefore has an unlimited potential for creating mutual dependencies, and adding mutual dependencies increases complexity.


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

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

اگه من پارگرافی رو که شما فرستادید رو درست ترجمه کرده باشم ، برداشت من از مفهوم پاراگراف : تعریف متغییر سراسری باعث پیچیدگی و وابستگی میشه ولی اعتقاد و تجربه من میگه این جمله کاملا" غلطه واسه همین یک سناریو میگم شما بگید اشکالش ( پیچیدیگی و .. ) کجاست

من توی برنامه ام نیاز دارم با تاریخ شمسی کار کنم ( توی فرم های ثبت اطلاعات و گزارشات و ... ) البته من به فرمت خاصی از تاریخ شمسی نیاز درم (00/00/00) .واسه پیاده سازی این سناریو من نیاز دارم به متغییری که در سرتاسر پروژه قابل دسترس باشه چون قرار در تمام فرم های ثبت و گزارش ازش استفاده کنم. همچنین واسه پیاده سازی این پروژه باید از متغییر ها استفاده کنم چون ممکنه کاربر برنامه من رو اجرا کنه و بعد تاریخ سیستمش رو تغییر بده و یا مثلا" ساعت 11 شب برنامه من رو اجرا کنه و تا ساعت 1 صبح با برنامه من کار کنه.
آیا به نظر شما من باید در هر فرمی که می خوام با تاریخ شمسی کار کنم باید مجددا" تاریخ شمسی رو محاسبه کنم و به فرمت مورد نظر تبدیل کنم ؟ تا خدایی نکرده بر خلاف قوانین شی گرا عملی انجام ندهم و یا اینکه راحتی و آسایش خودم رو در نظر بگیرم؟
اصلا" اگه روزی قرار شده من فرمت تاریخ شمسی رو به (0000/00/00 ) تغییر بدم اگه به صورت متمرکز این تغییر رو روی یک متغییر سراسری اعمال کنم بهتر یا تک تک کلاس هام رو اصلاح کنم بهتر؟

این صرفا" یک مثال است و من اصلا" به دنبال راه حل دیگه ای نمی گردم فقط می خواهم عیب این روش رو بدونم:متفکر:

اَرژنگ
دوشنبه 06 مهر 1388, 13:38 عصر
با تشکر از پیگیری استاد عزیزم اَرژنگ

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

اگه من پارگرافی رو که شما فرستادید رو درست ترجمه کرده باشم ، برداشت من از مفهوم پاراگراف : تعریف متغییر سراسری باعث پیچیدگی و وابستگی میشه ولی اعتقاد و تجربه من میگه این جمله کاملا" غلطه واسه همین یک سناریو میگم شما بگید اشکالش ( پیچیدیگی و .. ) کجاست

من توی برنامه ام نیاز دارم با تاریخ شمسی کار کنم ( توی فرم های ثبت اطلاعات و گزارشات و ... ) البته من به فرمت خاصی از تاریخ شمسی نیاز درم (00/00/00) .واسه پیاده سازی این سناریو من نیاز دارم به متغییری که در سرتاسر پروژه قابل دسترس باشه چون قرار در تمام فرم های ثبت و گزارش ازش استفاده کنم. همچنین واسه پیاده سازی این پروژه باید از متغییر ها استفاده کنم چون ممکنه کاربر برنامه من رو اجرا کنه و بعد تاریخ سیستمش رو تغییر بده و یا مثلا" ساعت 11 شب برنامه من رو اجرا کنه و تا ساعت 1 صبح با برنامه من کار کنه.
آیا به نظر شما من باید در هر فرمی که می خوام با تاریخ شمسی کار کنم باید مجددا" تاریخ شمسی رو محاسبه کنم و به فرمت مورد نظر تبدیل کنم ؟ تا خدایی نکرده بر خلاف قوانین شی گرا عملی انجام ندهم و یا اینکه راحتی و آسایش خودم رو در نظر بگیرم؟
اصلا" اگه روزی قرار شده من فرمت تاریخ شمسی رو به (0000/00/00 ) تغییر بدم اگه به صورت متمرکز این تغییر رو روی یک متغییر سراسری اعمال کنم بهتر یا تک تک کلاس هام رو اصلاح کنم بهتر؟

این صرفا" یک مثال است و من اصلا" به دنبال راه حل دیگه ای نمی گردم فقط می خواهم عیب این روش رو بدونم:متفکر:

این چیزی که میگید ربطی به متغییر سراسری ندارد. اگر فرمت همیشه قرار است که یکی بماند نه، این دوباره میشه ثابت سراسری.

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

در ضمن در هر فرم تاریخ دوباره حساب نمیشه، نمایش تاریخ باید بنابر فرمتی که مشخص شده نمایش داده بشه.

در این سناوریویی که گفته شده، نگهداری از فرمت خاص (custom format) بنابر منطق برنامه متغییر نیست، بلکه یک ثابت است. (اگرچه در حالت بهتر از این روش هم نباید استفاده بشه و در هر جا فرمت تاریخ سیستم استفاده بشه ، من این رو نمیگم ولی منطق این رو میگه).

برنامه‌نویسی برایه راحتی برنامه‌نویس نیست، همانطوری که اصول و قوانین برایه راحتی وضع نشدن، یکبار یکی چراغ قرمز را رد کند، که عجله دارد، یکی دیگر که با سبز دارد میره بزنه بهش ، راحتی کجاست؟

اصول و قوانین مال ما نیستند، برنامه‌نویسی با کد به هم چسباندن فرق دارد، فکر کنید میخواهید برید یک شرکت معتبر کار بگیرید، ازتان یک تکه کد بخواهند، باید ببینند که از اصول رعایت میشه.

فرق برنامه‌نویسی با کد نویسی رعایت اصول است، اینکه یکی میخواهد خانه خشتی درست کند با مهندسی ساختمان فرق دارد.

در ضمن حتی اگر در این مثال فرض را به این بگیریم که یک فرمت باید استفاده بشه، این میشه ثابت سراسری، متد string.Format برایه همین کار است، چرا دیگه باید در هر فرم یک متد حساب کردن نوشته بشه؟

من فکر میکنم، برداشت شما از متغییر سراسری چیزه دیگریست، چونکه در مثالهاتان از ثابت سراسری استفاده میکنید نه از متغییر سراسری.

مثال اشتباه استفاده از متغییر سراسری که بارها در همین تالار فرستاده شده، ربط و بدل اطلاعات بین ۲ شئی (فرم) بوسیله یک متغییر استاتیک یک کلاس است. در مورد اشتباه بودن اون میتونم بحث کنم ولی مثال شما از متغییر سراسری استفاده نمیکنه.

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

و از اینکه به سادگی تسلیم نمیشید، و باعث میشید که فکر کنم متشکرم (ولی چرا هیچ کی دیگه دلیلی نمیاره تعجب دارد، مثل اینکه فقط ما ۲ نفر در این تالار هستیم ، آی ملت ساکت نمانید، دلیل بیارید، برهان بخواهید، که همه باهم پیشرفت کنیم :) .

alireza_tavakol
دوشنبه 06 مهر 1388, 17:46 عصر
باور کنید من استاد نیستم

من عادت کردم که وقتی از کسی چیزی یاد گرفتم اون فرد رو در اون زمینه استاد خودم خطاب کنم ولی اگه می دونستم شما ناراحت می شید بهتون استاد نمی گفتم

استاد اَرژنگ ( ببخشید حواسم نبود :لبخند:)

مثل اینکه من نتونستم درست مثال بزنم منظور من از مطرح کردن مثال قبل مقدار تاریخ بود که باید توی یک متغییر سراسری نگه داری بشه نه فرمت تاریخ!
به نظر شما من باید هر جا که لازم دارم با تاریخ روز سیستم کار کنم ( البته تاریخ شمسی ) باید در همان مکان تاریخ شمسی رو محاسبه کنم؟ یا اینکه به صورت متمرکز تاریخ شمسی سیستم رو محاسبه کنم و توی یک متغییر سراسری قرار بدم تا در هر جای که به تاریخ شمسی نیاز پیدا کردم در دسترس باشه؟

البته بازم میگم این فقط یک مثال است برای نشان دادن نیازمند بودن برنامه به متغییر سراسری



من فکر میکنم، برداشت شما از متغییر سراسری چیزه دیگریست، چونکه در مثالهاتان از ثابت سراسری استفاده میکنید نه از متغییر سراسری.

بازم تاکید میکنم به متغییر نیاز دارم نه ثابت چون ممکنه در هر یک ثانیه روز جاری به اتمام برسه تاریخ عوض شه و اگه مقدار تاریخ از نوع یک ثابت باشه قابل تغییر نیست.



برنامه‌نویسی با کد به هم چسباندن فرق دارد
فرق برنامه‌نویسی با کد نویسی رعایت اصول است، اینکه یکی میخواهد خانه خشتی درست کند با مهندسی ساختمان فرق دارد.


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

saeeedft
دوشنبه 06 مهر 1388, 18:50 عصر
دوستان خیلی خوبه،اگه افراد با تجربه هم در مورد حرف های شما قضاوت کنند و دلایل شما رو بررسی کنند خیلی خوب میشه، خواهشا کسانی که در زمینه بحث تجربه دارند توی این بحث شرکت کنند

Sajjad.Aghapour
دوشنبه 06 مهر 1388, 19:09 عصر
سلام و رحمه الله


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


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


البته بازم میگم این فقط یک مثال است برای نشان دادن نیازمند بودن برنامه به متغییر سراسری
این تفکر شما در مورد متغیرهای سراسری است.شما وقتی تاریخ سیستم رو در ساعت 11 شب گرفتید چطوری اون رو در ساعت 12 شب تغییرش میدی؟ از کجا می فهمید که ساعت 12 شب شده؟ پس یک بار اضافی رو به منظور تشخیص خواهید داشت.....
#
این هم صرفا یک استدلال بود برای اینکه بدانید حداقل این طرز تفکر اشتباه است.....
#
کپسوله سازی یکی از مفاهیم شی گرا در برنامه نویسی است.تا به حال دلیل استفاده از پراپرتی ها در کلاس های دات نت از خودتون پرسیدید؟ این در حالیه که شما فقط دلیل استفاده نکردن از متغیرهای سراسری رو از خودتون می پرسید.من که تا به حال ندیدم ولی شما یک کلاس دات نت برای من نام ببر که یک متغیر سراسری برای من برگردونه و اون متغیر قابل نوشتن باشه(read-only نباشه).
اینها و خیلی از مسائل مشابه این در حیطه مفهوم کپسوله سازی است که مثال شما و روش شما این مفوم رو نقض میکنه......
یه چیز دیگه:
اصول برنامه نویسی توسط کی پایه ریزی میشه؟
آیا شما اجازه وضع قانون در جامعه رو دارید؟
اینها برای کسانی هست که مراحلی رو پشت سر گذاشتن و اجازه وضع قانون رو داشته باشن.
اشتباه شما این بود که در یکی از پست ها این رو به کشتن خلاقیت تعبیر کردید.
به نظر شما خلاقیت چیه؟
به نظر من خلاقیت استفاده به بهترین نحو از قوانین موجود هست مگر اینکه خلاف اون ثابت بشه.آیا شما خلاف عدم استفاده از متغیرهای سراسری رو ثابت کردید.



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


بازم تاکید میکنم به متغییر نیاز دارم نه ثابت چون ممکنه در هر یک ثانیه روز جاری به اتمام برسه تاریخ عوض شه و اگه مقدار تاریخ از نوع یک ثابت باشه قابل تغییر نیست.
به جای استفاده از متغیر سراسری از Setting استفاده کن و بر حسب نیازتون که می خواین متغیر باشه یا ثابت scope اون رو روی user یا application تنظیم کنید...
....

alireza_tavakol
سه شنبه 07 مهر 1388, 01:21 صبح
واسه مشخص تر شدن موضوع ، موضع گیری رو مجددا" اعلام میکنم :
به نظر من : مفهوم متغییر سراسری مبرا از عیب فنی است
به نظر اساتید: در هیچ شرایطی نباید از متغییر سراسری استفاده کرد چون قوانین معماری شی گرا این طوری گفته

بهتر واسه روشن تر شدن بحث یک تعریف از متغییر سراسری بکنم ( شاید اصلا" این تعریفی که من از مفهوم متغییر سراسری دارم غلط باشه )
اگه اساتید این تعریف من رو به عنوان تعریف متغییر سراسری قبول دارن بعد بحث کنم که آیا این موجودیت می تونه مفیده واقع بشه یا سمی محلک است که بکلی مضر می باشد !
به نظر منغییر سراسری این طوری تعریف میشه :

اولا" متغییر سراسری یک مفهوم است بدون پیاده سازی خاصی ( هر کسی ممکنه به یک نحوی متغییر سراسری رو پیاده سازی کنه ).
دوما" هر جا که از متغییر سراسری استفاده شود در واقع داریم با یک قطعه از حافظه که بین همه بخش های برنامه مشترک است کار میکنیم.
سوما" متغییر سراسری باید از همه جای برنامه قابل خوندن باشه .
چهارما" همون طوری که از اسم موجودیت ( متغییر ) پیدا است باید امکان این وجود داشته باشه مقداری رو در اون واگذار کرد ( البته ممکنه در بعضی مواقع برنامه نویس برای جلوگیری از خطای احتمالی شرایط خاصی رو واسه نوشتن توی متغییر در نظر بگیره)

من تا حالا توی هیچ کدوم از پست هایی که توی این تاپیک ثبت کردم به روش پیاده سازی متغییر سراسری اصلا" اشاره ای نکردم تا کسی به روش پیاده سازی خورده نگیره و صرفا" روی مفهوم متغییر سراسری بحث داشتم و بحث دارم

اما واسه عملیات تر شدن ، این طوری مسئله رو ادامه میدم ( مسئله : ذخیره کردن مقدار تاریخ شمسی در یک متغییر سراسری )
در این مسئله من متغییر سراسری رو به شکل زیر پیاده سازی میکنم. ( امید وارم مشکلات و معایب این پیاده سازی رو در پست های بعد شاهد باشم )

برای پیاده سازی این مسئله من از روش زیر استفاده میکنم :
یک کلاس static با نام shamsiDate تعریف میکنم سطح دسترسی کلاس رو public در نظر می گیرم .
متد عضو کلاس shamsiDate : متدی با نام convertDate تعریف میکنم با سطح دسترسی private . امضا متد یه این شکل خواهد بود ، تاریخ میلادی رو به عنوان پارامتر ورودی دریافت میکند و مقداری که این متد بر میگرداند تاریخ شمسی معادل پارامتر ورودی خواهد بود.
پروپرتی عضو کلاس shamsiDate:پروپرتی با نام shamsiDateNow تعریف میکنم با سطح دسترسی public. در بخش get این پروپرتی:1- تاریخ جاری میلادی سیستم را دریافت میکنم . 2- متد convertDate رو با پارامتری که در مرحله 1 بدست آمد صدا میزنم . 3- خروجی متد convertDate رو return میکنم.

همن طوری که می دونید:
در این مسئله روش پیاده سازی مفهوم متغییر سراسری به شکل یک کلاس static و یک پروپرتی static پیاده سازی شده است. ( شرط اولا" که در تعریف متغییر سراسری بهش پرداخت شد ، در ایجا مفهوم متغییر سراسری به این شکل پیاده سازی شده است )
وقتی کلاسی به صورت static تعریف میشود فقط و فقط یک نسخه از آن کلاس در حافظه بارگذاری میشود و تمام استفاده کنندگان از آن کلاس به منبع مشترکی دسترسی دارند. ( شرط دوما" در تعریف متغییر سراسری حاصل شد )
چون کلاس به صورت public تعریف شده در سرتاسر پروژه قابل دسترس باشد و حتی اگر چندین پروژه در sulotion داشته باشیم باز به این کلاس دسترسی خواهند داشت.( شرط سوما" در تعریف متغییر سراسری حاصل شد )
واسه حاصل شدن شرط چهارما" می تونستیم متدد set این پروپرتی رو نیز شرح بدیم ولی به دلیل بی ربط بودن به مسئله و طولانی تر شدن سناریو از اون صرف نظر شده

به عنوان نکته آخر :
ممکنه بعضی از دوستان بگن این کاری که تو کردی استفاده از پروپرتی است و اصلا" ربطی به متغییر ها نداره ! من در جواب این دوستان عرض میکنم
دوستان عنایت داشته باشید اگه قرار باشه پروپرتی رو کالبد شکافی کنیم به سه چیز میرسیم الف- یک متغییر ب-متدی برای خواندن متغییر ج-متدی برای نوشتن متغییر

در نهایت بازم میگم معایب و مشکلات این نوع از پیاده سازی متغییر های سراسری رو ذکر کنید تا بیشتر از این مصدع اوقات شریف دوستان نشوم

در واقع بعد از این همه فلسفه بافی می خواستم به اینجا برسم که شاید اسم متغییر سراسری تغییر کرده باشه ولی در مفهوم هنوز ما بهش نیاز داریم شاید تحت یک قالبی به عنوان Setting تغییر نام پیدا کرده باشه(حتما می دونید Properties.Settings.Default خود نوعی کلاس استاتیک است)

saeeedft
سه شنبه 07 مهر 1388, 01:47 صبح
دوستان سلام، خیلی عالیه
من با اینکه تازه کارم اما حیفم اومد تو بحث شما شرکت نکنم، برا همین امروز با یکی از دوستانم که برنامه نویسی حرفه ای سی شارپ هست(خدایی رو دستش برنامه نویسی ندیدم،تو کل زمانی که تو دانشگاه بودم) این سوال رو مطرح کردم و در پاسخ به من گفت توی برنامه های بزرگ اصلا چنین چیزی نیست،یعنی از متغیر سراسری استفاده نمیشه، اما 2 تا از ساده ترین دلایلش رو برام گفت :
1-زمانی که یک متغیر سراسری تعریف میشه، بخشی از حافظه برای اون متغییر رزرو میشه که در این حالت(یعنی زمانی که متغییر سراسری تعریف میکنیم) حافظه بیشتری در مقایسه با زمانی که یک متغییر رو به صورت معمولی(ونه سراسری) تعریف میکنیم اشغال میشه.
2-حتی این کار تو کامپایل برنامه هم اثر میذاره و سرعت اجرای برنامه رو هم پایین میاره، از طرفی امکان اشتباه نیز وجود داره،یعنی امکان داره از این متغیر تو جایی استفاده بشه که نباید بشه، اقای توکل عالیه، شما هم دلایلتون رو مطرح کنید(اگر چیز تارهای برداشت میکنید، ضمن اینکه مثال شما هم در ظاهر درسته اما وقتی به صورت تئوری مسئله بررسی میشه و نام ها جلو میان بد برداشت میشه)

alireza_tavakol
سه شنبه 07 مهر 1388, 03:19 صبح
با تشکر از آقا سعید که ما رو از نظراتش محروم نکرد


زمانی که یک متغیر سراسری تعریف میشه، بخشی از حافظه برای اون متغییر رزرو میشه که در این حالت(یعنی زمانی که متغییر سراسری تعریف میکنیم) حافظه بیشتری در مقایسه با زمانی که یک متغییر رو به صورت معمولی(ونه سراسری) تعریف میکنیم اشغال میشه.

جمله شما ابهام داره
اگه منظورتون اینکه یک متغییر معمولی ( محلی ) از نوع int فضایی معادل 4 بایت اشغال میکنه ولی همین متغییر اگه از نوع سراسری تعریف شه بیشتر از 4 بایت فضا اشغال میکنه . فکر نمیکنم این حرف درستی باشه.
ولی اگه منظورتون اینکه متغییر وقتی سراسری تعریف میشه از نظر زمانی مقدار حافظه بیشتری اشغال میکنه یا به عبارت دیگه از ابتدای اجرای برنامه تا انتهای اجرای برنامه مقداری از حافظه رو اشغال کرده و امکان استرداد اون بخش از حافظه رو به ما نمیده.در جواب باید بگم من به عنوان یک برنامه نویس دل درد که ندارم وقتی یک متغییر در بازه زمانی خواصی به دردم می خوره اون رو از نوع سراسری پیاده سازی کنم . من وقتی یک متغییر رو سراسری تعریف میکنم که می دونم از همون ابتدای شروع برنامه به اون مقدار نیاز دارم و تا انتهای برنامه باید اون مقدار رو نگه دارم.پس اگه من بازهم از متغییر های محلی استفاده کنم باید در هر بخش از برنامه ام اون مقدار از حافظه رو به صورت مقطعی بلوکه کنم و این باز همون مشکل رو به وجود خواهد آورد.
اصلا" به نظر شما با وجود کامپیوتر های امروزی که چندین GB حافظه اصلی دارن و ده ها GB حافظه مجازی دارن ! حافظه می تونه عنصر تعیین کننده ای باشه واسه اینکه ما این قدر واسش جنجال به پا کنیم ؟



حتی این کار تو کامپایل برنامه هم اثر میذاره و سرعت اجرای برنامه رو هم پایین میاره

جمله شما توی بخش سرعت کامپایل و سرعت اجرا ابهام داره
اگه منظور شما اینکه وقتی قرار برنامه من کامپایل بشه سرعت ساخته شدن فایل اجرایی کند میشود . من در جواب میگم بگذار بشه ، مگه برنامه من چند بار قرار کامپایل بشه یا اصلا" برنامه که محصولی است برای کاربر استفاده کننده و کاربر یک بار هم با این بخش از برنامه درگیر نمی شود چرا باید واسش حسابی باز کنیم؟
ولی اگه منظور شما اینکه وقتی برنامه من اجرا میشه با افت سرعت رو به رو میشه ، باید به صورت تجربی ( عملی ) یا باید به صورت علمی ( کتاب و مقاله ) حرفتون رو ثابت کنید!
اصلا" این مقداری کاهش سرعت که می فرمایید در حد چند میلیونیم ثانیه است؟



از طرفی امکان اشتباه نیز وجود داره،یعنی امکان داره از این متغیر تو جایی استفاده بشه که نباید بشه

من یک نامه خصوصی از جناب اَرژنگ در این زمینه دریافت کردم و اونجا هم مفصلا" به این نکنه پاسخ دادم
برنامه نویس یک آدم معمولی نیست که بتونه خطا های معمولی مرتکب بشه !
شما می فرمایید ممکنه مقداری نا خواسته در متغییر سراسری قرار گیرد. من می گم همین قضیه برای متغییر های محلی مصداق داره و ممکنه مقداری نا خواسته در متغییری محلی ذخیره شود
می دونید این توجیه شبیه این می ماند که بگیم چون ممکنه کارد آشپز خانه دست کسی را ببرد پس هیچ کس حق استفاده از کارد را ندارد در صورتی که قافلیم از اینکه کارد آشپز خانه در دست کد بانویی ماهر است
اصلا" فرض رو بر این می گذاریم که کلام شما متین و مقداری نا خواسته در متغییر سراسری ما قرار گرفت . ولی زمین که به آسمون نیومده برنامه با خطای منطقی مواجه شده برای رفع خطاهای منطقی این قدر ابزار های خطایابی داریم که کمتر از چند پالس کاری مشکل حل میشود
درضمن فکر کنم به این قضیه توی بخش چهارما" از پست 17 (http://www.barnamenevis.org/forum/showpost.php?p=816878&postcount=17) همین تاپیک که تعریف متغییر سراسری را گفته بودم جواب دادم

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

saeeedft
سه شنبه 07 مهر 1388, 10:50 صبح
علی رضا خان خیلی عالیه

ولی اگه منظورتون اینکه متغییر وقتی سراسری تعریف میشه از نظر زمانی مقدار حافظه بیشتری اشغال میکنه یا به عبارت دیگه از ابتدای اجرای برنامه تا انتهای اجرای برنامه مقداری از حافظه رو اشغال کرده و امکان استرداد اون بخش از حافظه رو به ما نمیده.منظورم دقیقا همین بود

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

Sajjad.Aghapour
سه شنبه 07 مهر 1388, 11:37 صبح
من زیاد بحث نمی کنم.ولی به طور مختصر:



برای پیاده سازی این مسئله من از روش زیر استفاده میکنم :

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


دوستان عنایت داشته باشید اگه قرار باشه پروپرتی رو کالبد شکافی کنیم به سه چیز میرسیم الف- یک متغییر ب-متدی برای خواندن متغییر ج-متدی برای نوشتن متغییر

خوب منظورتون چیه؟
مگه قراره شما متغیری که در برنامه تعریف کردید رو تغییرش ندید.بحث ما سر اینه که به جای این پراپرتی از متغیر سراسری استفاده نکنید.حالا چرا؟
به اینجا یه سری بزنید جواب سوالتون رو پیدا می کنید:
http://msdn.microsoft.com/en-us/library/aa716305(VS.60).aspx


اصلا" به نظر شما با وجود کامپیوتر های امروزی که چندین GB حافظه اصلی دارن و ده ها GB حافظه مجازی دارن ! حافظه می تونه عنصر تعیین کننده ای باشه واسه اینکه ما این قدر واسش جنجال به پا کنیم ؟

این حرفتون اصلا منطقی نیست.جواب:


برنامه نویس یک آدم معمولی نیست که بتونه خطا های معمولی مرتکب بشه !




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

(من گفتم که وقت بحث ندارم)ولی توی برنامه نویسی جای این حرفا نیست دوست عزیز.این میشه همون کد سرهم کردن و فقط تایپیست بودن.....
...
موفق باشید/
...

اَرژنگ
سه شنبه 07 مهر 1388, 11:40 صبح
نمیدونم کسی تا حالا یک نجار حرفه‌ای را زمان کار تماشا کرده؟ مثلا اگر بخواهد یک صندلی درست کنه، گوشه‌ها را با صبوری سنباده میزنه. گرد و خاک را پاک میکنه، چسب میزنه، میخ میزنه، چسبهایه اضافی را پاک میکنه و کلی کار دیگه قبل از اینکه یک چیزی به اسمه صندلی اراعه بده. البته هرکی میتونه یک صندلی سرهم کنه، بدانه رعایت اصول نجاری، و حرفه‌ای. همان نجار میتونه فقط میخ بکوبه و یک چیزی را بندازه و بره سراغ کار بعدی. قانونی نیست که وادارش کنه با اصول نجاری کار کنه، ولی ماها بهتر میدونیم که اگر بخواهیم صندلی بخریم سراغ کی میریم. اصول برنامه‌نویسی هم قانون نیستند که قابل شکست نباشند، ولی این اصول بدست کسانی که قبل از ما امتحان کردند و با تجربه و زمانش به یک سری نتایج رسیدند اراعه داده شدند. راحتی برنامه نویس را با تنبلی و نداشتن دیسیپلین نباید اشتباه گرفته بشه، برانمه‌نویسی کار است تخصصی، همانطوری که هر کسی که میخ تخته کنه نجار نیست، همانطور هم هر چیزی که با کد سره هم بشه اسماً میشه بهش برنامه گفت. برنامه نویسی با اصول است، حرفه‌ میخواهد. کد نویسی برایه تفریح چیزه دیگریست. در انگلیسی ۲ کمله متفاوت استفاده میشه : پروگرمر و هکر. هکر آزاد است که هر چیزی را هر جوری سرهم کند، پروگرمر با اصول باید پیش بره، اگر نره، لقبش ازش صلب میشه و میشه همان هکر. یکی که کد سرهم میکنه. شکستن اصول هیچوقت با یک اصل تمام نمیشه، وقتی که کسی اصلی را بشکنه، همانطوری ادامه میده. اگر فکر کنید که یک متغییر گلوبال کارتان را دارد راحت میکنه، فقط موقتی است، با گذشت زمان یکی یکی اضافه میشن، و قبل از اینکه بداونید یک سری متغییرات هیلی پیلی در برنامه دارند عوض میشن. با مشکلاتی دیباگ کردنی روبرو میشید که تمام راحتی قبل را هم به شما و هم به برنامه‌نویسی که بخواهد کمکتان کند زهر میکنه. کی میخواهد جراحش برایه مثائل کوچک بیخیال اصول جراحی باشد و مثلا برایه راحتی خودش دستش را نشوره؟ این هم فرقی ندارد. اینکه کسی چراغ قرمز را رد میکنه، دارد با جان دیگران بازی میکنه، کسان دیگری هم که قوانین را رعایت میکنند را با خودش به خطر میندازه. پایبندی و دانستن اصول برنامه‌نویسی فرق بین یک هکر و برنامه‌نویس است. در ضمن در برنامه‌نویسی شئیگرا، متغییرات معنی ندارند. طراحی درست باید به اینکه چه اشیائی سیستم را تشکیل میدند ربط دارد. برنامه‌نویس شئی‌گرا سیستم را به یک سری اشیایه منطقی تقسیم میکنه. قبل از شکستن اصول یکی باید بتونه اصول را بدونه و برطوقشان کار کنه، وگرنه یکی که اصول را نمیدانه با کسی که اصول را میدانه و همینطوری زیر پا میگزاره فرقی نداره. یک برنامه‌نویس میدونه در چه زمانی باید اصول را زیره پا بزاره ولی نه یک لحظه زودتر. مثالی که فرستادند هیچ دلیلی برایه استفاده از یک متغییر سراسری ندارد، اگر سیستم از اولش با اصول درست طراحی و ساخته بشه، جایی برایه متغییر نخواهد داشت. برایه تمرین میتونیم یک پروژه شروع کنیم، یکیش با پایبندی به اصول و دیگری بدانه پایبندی، هر چند نفر هم میتوانند باهم کار کنند. بعد از مرحله اول پیاده سازی که همه قبول کنند که هر دو برنامه در ظاهر یک کار را انجام میدن، کاربران دیگر میتونند درخواست هایه جدیدی بدند، راحتی توسعه و نگهداری از سیستم بسیار زود معلوم میشه. اگر کاری راحت است، سختی‌اش بعدن معلوم میشه.

Sorenaa_s
سه شنبه 07 مهر 1388, 12:28 عصر
با سلام خدمت اساتید محترم
حالا که بحث داغ شده منم با اطلاعات حدود خودم وارد بحث بشم
همون طور که دوستان می دونند دو مفهوم مهم در برنامه نویسی هست:
هم بستگی (Cohesion)
وابستگی (Coupling)
یک کد استاندارد باید هم بستگی بالا، . وابستگی پایین داشته باشه. که این بالا و پایین بودن با "درجه" با "سطح" مشخص میشه.
موضوع مطرح شده در این بحث مطمعنا قابل انجامه و شاید به ظاهر مشکلی هم نداشته باشه ولی متاسفانه وابستگی کد رو بالا می بره. البته راه حل هایی هم ارائه شده برای حل این مسئله. حالا میشه از این راه حل ها استفاده کرد برای بالا بردن همبستگی، پایین آوردن وابستگی و کد استاندارد داشتن.
ولی میشه این کار رو انجام نداد! و نقطه قرآن هم جا بجا نخواهد شد! فقط درجه استاندارد کد پایین تر خواهد آمد، فقط همین :)


http://en.wikipedia.org/wiki/Cohesion_(computer_science)
http://en.wikipedia.org/wiki/Coupling_(computer_science)

ASKaffash
سه شنبه 07 مهر 1388, 13:18 عصر
سلام
کد ذیل توسط خود دات نت برای نگهداری در Setting تولید شده است یعنی اینکه از یک شی Static بنام defaultInstance استفاده کرده است ؟! (مثل یک فیلد Static درون یک کلاس Static)



[global::System.Runtime.CompilerServices.CompilerGe neratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttri bute("Microsoft.VisualStudio.Editors.SettingsDesigner.Se ttingsSingleFileGenerator", "9.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBa se {

private static Settings defaultInstance = ((Settings)(global::System.Configuration.Applicati onSettingsBase.Synchronized(new Settings())));

public static Settings Default {
get {
return defaultInstance;
}
}

[global::System.Configuration.UserScopedSettingAttr ibute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttr ibute()]
[global::System.Configuration.DefaultSettingValueAt tribute("Hello")]
public string MySetting1 {
get {
return ((string)(this["MySetting1"]));
}
set {
this["MySetting1"] = value;
}
}

[global::System.Configuration.ApplicationScopedSett ingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttr ibute()]
[global::System.Configuration.DefaultSettingValueAt tribute("Ok")]
public string MySetting2 {
get {
return ((string)(this["MySetting2"]));
}
}
}

saeeedft
سه شنبه 07 مهر 1388, 18:54 عصر
دوستان خیلی خوبه، اما خواهشا آخر حرفاتون یه نتیجه گیری هم کنید،بازم ممنون

alireza_tavakol
سه شنبه 07 مهر 1388, 20:45 عصر
با تشکر از دوست گرامی آقای sajjadlove

میگن اصرار و دفاع از عمل اشتباه ، اشتباهی است بزرگ تر از خود اشتباه


اصلا" به نظر شما با وجود کامپیوتر های امروزی که چندین GB حافظه اصلی دارن و ده ها GB حافظه مجازی دارن ! حافظه می تونه عنصر تعیین کننده ای باشه واسه اینکه ما این قدر واسش جنجال به پا کنیم ؟
[/B]
سپاسگذارم که پست های قبلی بنده رو کاملا" دقیق خوانده اید و تذکری نسبت اشتباه من مبذول داشتید ( البته بنده صراحا" این اشتباهات رو میپذیرم )





برای پیاده سازی این مسئله من از روش زیر استفاده میکنم :

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

ظاهرا" پیاده سازی مسئله مطرح شده از نظر شما خالی از شکال بوده ولی...


بحث ما سر اینه که به جای این پراپرتی از متغیر سراسری استفاده نکنید.


میشه بفرمایید از نظر شما : متغییر سراسری چطوری تعریف بشه غلطه و نباید ازش استفاده کرد؟

باز هم تشکر میکنم به خاطر وقتی که واسه این تاپیک گذاشتین و میگذارین

alireza_tavakol
سه شنبه 07 مهر 1388, 21:03 عصر
ظاهرا" نظر جناب اَرژنگ نسبت به پیاده سازی من منفی است:ناراحت:
لصفا کمی عملیاتی تر بحث رو ادامه بدیم


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

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


در ضمن میشه بفرمایید منظورتون از این جمله چی بوده؟


یک برنامه‌نویس میدونه در چه زمانی باید اصول را زیره پا بزاره ولی نه یک لحظه زودتر.

Amir Oveisi
چهارشنبه 08 مهر 1388, 02:55 صبح
با سلام خدمت همه دوستان

پس از خوندن مطالب همه دوستان مي خوام به يك ايراد فني متغير هاي گلوبال كه اشاره نشده و يك راهكار فني براي رفع نياز به استفاده از متغير گلوبال كه اينم اشاره نشده عرض كنم.

علاوه بر مشكلاتي كه دوستان فرمودن يك ايراد بسيار بزرگ در استفاده از متغيرهاي گلوبال زماني است كه برنامه شما multithread باشد. از انجايي كه متغير گلوبال يك instance نيست بنا براين هيچ كنترلي در برابر thread نخواهد داشت و ممكن هست مقدار اون هر لحظه دچار تغييرات ناخواسته بشه كه اين يعني فاجعه!

ما از مشكلات حرف زديم اما راه چاره ارايه نداديم.
يك راه حل براي مسايلي كه خيلي ها فكر مي كنند كه فقط با متغير سراسري قابل حله، استفاده از يك كلاس معمولي هست!
با استفاده از الگوي singleton در طراحي يك كلاس ميتونيم در تمام طول برنامه فقط يك instance از اون داشته باشيم و هر جا لازم باشه از اون كلاس يك شي بسازيم و استفاده كنيم. چون از singleton استفاده شده، هميشه به يك object خواهيم رسيد كه همون مقادير قبلي رو داره.
با اين كار نيازي به static تعريف كردن كلاس هم نداريم و هم چنين اصول شي گرايي رو هم رعايت كرديم.

موفق باشيد

saeeedft
چهارشنبه 08 مهر 1388, 03:01 صبح
اقای برمودا احسنت، من دیشب توی پستم این یک قلم رو جا انداخته بودم، خوب شد که گفتید، فکر کنم اصولیترین راه همین باشه(استفاده از سینگلتون)

JaguarXF
چهارشنبه 08 مهر 1388, 03:41 صبح
سلام
چطور میشه یک کلاس یا یک متغییر تعریف کرد که در کل پروژه به آن دسترسی داشته باشیم. یعنی در همه فرم ها و کلاسهای دیگه بتونیم مقدار آن متغییر را استفاده کنیم یا متغییر را مقدار دهی کینم.
با تشکر

سوال واضح نیست.
بالاخره کلاس میخواهیم تعریف کنیم یا متغیری داخل کلاس؟
کلاس که مقدار ندارد!

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

ESG_Esfahan
چهارشنبه 08 مهر 1388, 05:35 صبح
با تشکر از همه ی دوستان و اساتید گرامی

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

من فکر می کنم اگه پیشنهاد اَرژنگ را عملی کنیم بهترین نتیجه را می گیریم (با یک تیر چندتا نشون زدیم )
خواهش می کنم یکی از اساتید موضوعی را مطرح کنند و پیاده سازی با دو روش را شروع کنیم (من هم قول می دم در پایبند نبودن به اصول کم نیارم:لبخند:)

از همه دوستان و اساتید ممنونم که وقت گذاشتند

alireza_tavakol
چهارشنبه 08 مهر 1388, 07:52 صبح
با تشکر از bermooda :تشویق:


ما از مشكلات حرف زديم اما راه چاره ارايه نداديم.
يك راه حل براي مسايلي كه خيلي ها فكر مي كنند كه فقط با متغير سراسري قابل حله، استفاده از يك كلاس معمولي هست!
با استفاده از الگوي singleton در طراحي يك كلاس ميتونيم در تمام طول برنامه فقط يك instance از اون داشته باشيم و هر جا لازم باشه از اون كلاس يك شي بسازيم و استفاده كنيم. چون از singleton استفاده شده، هميشه به يك object خواهيم رسيد كه همون مقادير قبلي رو داره.
با اين كار نيازي به static تعريف كردن كلاس هم نداريم و هم چنين اصول شي گرايي رو هم رعايت كرديم.


من از این پست این طوری برداشت کردم که شما با مفهوم متغییر سراسری مشکلی ندارید و قبول دارین که در جایگاه خودش لازمه از متغییر سراسری استفاده بشه ( علت این برداشت راه کاری بود که واسه رسیدن به هدف ارائه دادین )

ولی ظاهرا" با روش پیاده سازی متغییر های سراسری توسط یک کلاس static موافق نیستید و معتقدین بهتر مفهوم متغییر متغییر سراسری توسط الگوی singleton پیاده سازی بشه

کالبد شکافی ( تشریح ) الگوی سینگلتون :

یک کلاس معمولی که سازنده اش به صورت private تعریف شده . ( سازنده private باعث میشه امکان ساخت نمونه توسط کلمه کلیدی new وجود نداشته باشد )
یک فیلد با نامی شبیه به Instance که از جنس همان کلاس ولی از نوع static و private .
یک متد با نامی شبیه به GetInstance که اگه مقدار فیلد Instance برابر با null است عمل new رو انجام بده و در نهایت خروجی این متد شی Instance است. این متد باید از نوع static و public تعریف شود.

همان طوری که مشاهد فرمودید در اینجا شاید به ظاهر از یک روش پیاده سازی خاصی استفاده کرده باشیم ولی درواقع داریم سر خودمون رو شیره می مالیم:لبخند: چون در پشت پرده باز هم داریم با یک کلاس static کار میکنیم :کف:( چون فیلد Instance از جنس همان کلاس و static تعریف شده و این دقیقا میشه کلاس استاتیک :متعجب:)
البته من این موضوع رو یک بار به طور مفصل توی یک تاپیک (http://barnamenevis.org/forum/showthread.php?t=179300) مطرح کردم ولی در اون تاپیک بحث به گفتن کلمات کلی ختم شد و من به هیچ نتیجه عملیاتی نرسیدم:عصبانی++:

saeeedft
چهارشنبه 08 مهر 1388, 12:05 عصر
با سلام مجدد، حالا اگه توی یک کلاس اگوی سینگلتون رو پیاده سازی نکنیم و بخواهیم متدهای اون کلاس رو استاتیک تعریف کنیم چی؟آیا این کار مشکلی داره؟ممنون میشم اگه جوابم رو بدید

alireza_tavakol
چهارشنبه 08 مهر 1388, 14:18 عصر
با سلام مجدد، حالا اگه توی یک کلاس اگوی سینگلتون رو پیاده سازی نکنیم و بخواهیم متدهای اون کلاس رو استاتیک تعریف کنیم چی؟آیا این کار مشکلی داره؟ممنون میشم اگه جوابم رو بدید
البته این سوال شما ربطی به بحث متغییر سراسری نداشت مگه اینکه بخواهید از جواب این سوال نتیجه گیری خواصی بکنید:چشمک:

من بار ها و بارها توی تاپیک های این تالار دیدم و خواندم که اساتید محترم اصلا" دیدگاه مناسبی نسبت به کلمه static ندارن و تقریبا static رو منطقه ممنوعه می دانند.
من مطمئم اگه توی یک تاپیک معمولی این سوال رو می پرسیدی همه بهت میگفتن شما راه غلطی رو پیش گرفتی و بهتر اصل مسئله رو توضیح بدی تا روش مناسب رو بهت پیشنهاد کنیم

ولی اگه از من بپرسی میگم static یکی از بهترین قابلیت های برنامه نویسی o با تشدید ( OO ) است که باید در جایگاه مناسب ازش استفاده کرد :ناراحت:

اَرژنگ
چهارشنبه 08 مهر 1388, 19:55 عصر
واسه مشخص تر شدن موضوع ، موضع گیری رو مجددا" اعلام میکنم :
به نظر من : مفهوم متغییر سراسری مبرا از عیب فنی است
به نظر اساتید: در هیچ شرایطی نباید از متغییر سراسری استفاده کرد چون قوانین معماری شی گرا این طوری گفته

بهتر واسه روشن تر شدن بحث یک تعریف از متغییر سراسری بکنم ( شاید اصلا" این تعریفی که من از مفهوم متغییر سراسری دارم غلط باشه )
اگه اساتید این تعریف من رو به عنوان تعریف متغییر سراسری قبول دارن بعد بحث کنم که آیا این موجودیت می تونه مفیده واقع بشه یا سمی محلک است که بکلی مضر می باشد !
به نظر منغییر سراسری این طوری تعریف میشه :

من تا حالا توی هیچ کدوم از پست هایی که توی این تاپیک ثبت کردم به روش پیاده سازی متغییر سراسری اصلا" اشاره ای نکردم تا کسی به روش پیاده سازی خورده نگیره و صرفا" روی مفهوم متغییر سراسری بحث داشتم و بحث دارم

اما واسه عملیات تر شدن ، این طوری مسئله رو ادامه میدم ( مسئله : ذخیره کردن مقدار تاریخ شمسی در یک متغییر سراسری )
در این مسئله من متغییر سراسری رو به شکل زیر پیاده سازی میکنم. ( امید وارم مشکلات و معایب این پیاده سازی رو در پست های بعد شاهد باشم )

برای پیاده سازی این مسئله من از روش زیر استفاده میکنم :
یک کلاس static با نام shamsiDate تعریف میکنم سطح دسترسی کلاس رو public در نظر می گیرم .
متد عضو کلاس shamsiDate : متدی با نام convertDate تعریف میکنم با سطح دسترسی private . امضا متد یه این شکل خواهد بود ، تاریخ میلادی رو به عنوان پارامتر ورودی دریافت میکند و مقداری که این متد بر میگرداند تاریخ شمسی معادل پارامتر ورودی خواهد بود.
پروپرتی عضو کلاس shamsiDate:پروپرتی با نام shamsiDateNow تعریف میکنم با سطح دسترسی public. در بخش get این پروپرتی:1- تاریخ جاری میلادی سیستم را دریافت میکنم . 2- متد convertDate رو با پارامتری که در مرحله 1 بدست آمد صدا میزنم . 3- خروجی متد convertDate رو return میکنم.

همن طوری که می دونید:
در این مسئله روش پیاده سازی مفهوم متغییر سراسری به شکل یک کلاس static و یک پروپرتی static پیاده سازی شده است. ( شرط اولا" که در تعریف متغییر سراسری بهش پرداخت شد ، در ایجا مفهوم متغییر سراسری به این شکل پیاده سازی شده است )
وقتی کلاسی به صورت static تعریف میشود فقط و فقط یک نسخه از آن کلاس در حافظه بارگذاری میشود و تمام استفاده کنندگان از آن کلاس به منبع مشترکی دسترسی دارند. ( شرط دوما" در تعریف متغییر سراسری حاصل شد )
چون کلاس به صورت public تعریف شده در سرتاسر پروژه قابل دسترس باشد و حتی اگر چندین پروژه در sulotion داشته باشیم باز به این کلاس دسترسی خواهند داشت.( شرط سوما" در تعریف متغییر سراسری حاصل شد )
واسه حاصل شدن شرط چهارما" می تونستیم متدد set این پروپرتی رو نیز شرح بدیم ولی به دلیل بی ربط بودن به مسئله و طولانی تر شدن سناریو از اون صرف نظر شده

به عنوان نکته آخر :
ممکنه بعضی از دوستان بگن این کاری که تو کردی استفاده از پروپرتی است و اصلا" ربطی به متغییر ها نداره ! من در جواب این دوستان عرض میکنم
دوستان عنایت داشته باشید اگه قرار باشه پروپرتی رو کالبد شکافی کنیم به سه چیز میرسیم الف- یک متغییر ب-متدی برای خواندن متغییر ج-متدی برای نوشتن متغییر

در نهایت بازم میگم معایب و مشکلات این نوع از پیاده سازی متغییر های سراسری رو ذکر کنید تا بیشتر از این مصدع اوقات شریف دوستان نشوم

در واقع بعد از این همه فلسفه بافی می خواستم به اینجا برسم که شاید اسم متغییر سراسری تغییر کرده باشه ولی در مفهوم هنوز ما بهش نیاز داریم شاید تحت یک قالبی به عنوان Setting تغییر نام پیدا کرده باشه(حتما می دونید Properties.Settings.Default خود نوعی کلاس استاتیک است)


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

جای که میگید :
"واسه حاصل شدن شرط چهارما" می تونستیم متدد set این پروپرتی رو نیز شرح بدیم ولی به دلیل بی ربط بودن به مسئله و طولانی تر شدن سناریو از اون صرف نظر شده"
با نداشتن set , متغییر بودن را نقض کردید، بدونه اینکه متوجهش باشید، اگر set داشت اونوقت متغییر بود، و اینکه set ندارد برایه این است که منطقا بهش احتیاجی نیست و نباید set داشته باشد.
اگر set داشته بود، منطقا نمیتونستید دلیل داشتنش را توجیح کنید، میتونستید؟
طراحیتان برایه این سناریو درست است، و فلسفه بافی نکرده‌اید، مسئله را کاملا درست شرح دادید.
تا زمانی که یک set استفاده نکنید، نمیتونید بگید که دارید از یک متغییر استفاده میکنید (اگر هم set استفاده کنید ، بازهم روشتان از روش اشتباه استفاه از متغییرهایه سراسری و استاتیک کلی فاصله دارد و به سختی میشه به هم ربطشان داد.)

Sajjad.Aghapour
پنج شنبه 09 مهر 1388, 00:50 صبح
میشه بفرمایید از نظر شما : متغییر سراسری چطوری تعریف بشه غلطه و نباید ازش استفاده کرد؟

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


public class sample
{
public int variable;
.
.
.
}

نه اینکه هر متدی یا سازنده ای یا اینکه یک پرارپرتی که modifier اون public باشه شما رو از اصل شی گرایی دور کنه.
برای همین فکر کنم در همان اولین پستی که من در این تاپیک دادم به encapsulation به عنوان یکی از مفاهیم اساسی در شی گرایی اشاره کردم.این اصل به شما نمی گه که از public استفاده نکن بلکه میگه کاربر به هیچ عنوان نباید به طور مستقیم داده های شما رو تغییر بده.برای همین به شما private رو در نظر گرفته و در کنار اون استفاده از متدها،سازنده ها و پراپرتی های public .
...
موفق باشید/
...

alireza_tavakol
پنج شنبه 09 مهر 1388, 01:53 صبح
با تشکر از همه دوستان :لبخندساده: من کاملا" متوجه شدم و قانع شدم

اما سوال آخر پس به نظر شما فیلد public که static تعریف میشه به چه دردی می خوره؟

static public int variable;
منظورم اینکه چرا باید یک همچین قابلیتی در زبان C#‎‎‎‎‎‎ وجود داشته باشه ولی منفور باشه؟ ( آیا خود زبان C#‎‎‎‎ دوست داره بی قانونی رو ترویج بده ؟ )
اگه تعریف فیلد پابلیک و استاتیک خیلی بده ، حداقل باید یک warning از طرف IDE واسه برنامه نویس اعلام میشد!

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

اَرژنگ
پنج شنبه 09 مهر 1388, 07:39 صبح
با تشکر از همه دوستان :لبخندساده: من کاملا" متوجه شدم و قانع شدم

اما سوال آخر پس به نظر شما فیلد public که static تعریف میشه به چه دردی می خوره؟

static public int variable;منظورم اینکه چرا باید یک همچین قابلیتی در زبان C#‎‎‎‎‎‎‎ وجود داشته باشه ولی منفور باشه؟ ( آیا خود زبان C#‎‎‎‎‎ دوست داره بی قانونی رو ترویج بده ؟ )
اگه تعریف فیلد پابلیک و استاتیک خیلی بده ، حداقل باید یک warning از طرف IDE واسه برنامه نویس اعلام میشد!

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

JaguarXF
پنج شنبه 09 مهر 1388, 10:05 صبح
اگه تعریف فیلد پابلیک و استاتیک خیلی بده ، حداقل باید یک warning از طرف IDE واسه برنامه نویس اعلام میشد!

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

saeeedft
پنج شنبه 09 مهر 1388, 11:29 صبح
البته این سوال شما ربطی به بحث متغییر سراسری نداشت مگه اینکه بخواهید از جواب این سوال نتیجه گیری خواصی بکنید:چشمک:

من بار ها و بارها توی تاپیک های این تالار دیدم و خواندم که اساتید محترم اصلا" دیدگاه مناسبی نسبت به کلمه static ندارن و تقریبا static رو منطقه ممنوعه می دانند.
من مطمئم اگه توی یک تاپیک معمولی این سوال رو می پرسیدی همه بهت میگفتن شما راه غلطی رو پیش گرفتی و بهتر اصل مسئله رو توضیح بدی تا روش مناسب رو بهت پیشنهاد کنیم

ولی اگه از من بپرسی میگم static یکی از بهترین قابلیت های برنامه نویسی o با تشدید ( OO ) است که باید در جایگاه مناسب ازش استفاده کرد :ناراحت:
اقای علیرضا خان اتفاقا عمدا این سوال رو توی این تاپیک پرسیدم، چون میدونستم خیلی ها مخالف ان هستند، من هم با نظر شما موافقم، حالا از اساتید میخوام بگن اگه این روش اشتباه هست چرا و به چه دلیل،اگه اشتباه پس چرا همچین چیزی هست و هیچ کجا اشاره ای به اشتباه بودن اون نمیکنه،ممنون میشم اگه جواب بدین

اَرژنگ
پنج شنبه 09 مهر 1388, 13:18 عصر
اقای علیرضا خان اتفاقا عمدا این سوال رو توی این تاپیک پرسیدم، چون میدونستم خیلی ها مخالف ان هستند، من هم با نظر شما موافقم، حالا از اساتید میخوام بگن اگه این روش اشتباه هست چرا و به چه دلیل،اگه اشتباه پس چرا همچین چیزی هست و هیچ کجا اشاره ای به اشتباه بودن اون نمیکنه،ممنون میشم اگه جواب بدین

منظورتان از " این روش اشتباه هست" کدام روش؟ استفاده کردن و نکردن از یک کلمه کلیدی به خودی خود نه درست و نه اشتباه است. اگر منظور استفاده از یک همچین چیزی است: static public int variable; داستان یک چیزه دیگر است، مثال اشتباه همیشگیش هم جوبهایه اشتباه برایه رد و بدل اطلاعات بین دو فرم (اشیاء) است. لطفا یک پروژه مثالی کوچک که بشه سر اینکه منظور از این روش چی هست را دقیقا بازگو کنیم سرهم کنید، یا هم اینکه مانند جناب توکلی کالمتر "این روش" را تشریح کنید. اول باید اینکه مشکلی که داریم سرش بحث میکنیم را درست مشخص کنیم، وگرنه دوباره سر درست بودم یک روش بحث نمیکنیم، و سر برداشت جداگانه از مهفومات بحث میکنیم (که نتیجه‌اش را در همین توپیک دیدید).

saeeedft
پنج شنبه 09 مهر 1388, 14:49 عصر
منظورتان از " این روش اشتباه هست" کدام روش؟ استفاده کردن و نکردن از یک کلمه کلیدی به خودی خود نه درست و نه اشتباه است. اگر منظور استفاده از یک همچین چیزی است: static public int variable; داستان یک چیزه دیگر است، مثال اشتباه همیشگیش هم جوبهایه اشتباه برایه رد و بدل اطلاعات بین دو فرم (اشیاء) است. لطفا یک پروژه مثالی کوچک که بشه سر اینکه منظور از این روش چی هست را دقیقا بازگو کنیم سرهم کنید، یا هم اینکه مانند جناب توکلی کالمتر "این روش" را تشریح کنید. اول باید اینکه مشکلی که داریم سرش بحث میکنیم را درست مشخص کنیم، وگرنه دوباره سر درست بودم یک روش بحث نمیکنیم، و سر برداشت جداگانه از مهفومات بحث میکنیم (که نتیجه‌اش را در همین توپیک دیدید).ممنون از توجهتون اقای ارژنگ، من خیلی جاها میبینم که که یک تابع و یا متغییر رو static تعریف میکنند و در فرمهای دیگه ازش استفاده میکنند، اما طبق بحث هایی که شد مشخصه که این روش اشتباهه یا اینکه باید در جاهای خاص از اون استفاده کرد،حالا میخوام بدونم اگه میشه به این طریق عمل کرد که در چه جاهایی باید تابع یا متغییر رو به این صورت تعریف کرد ،یعنی تا کجا مجازیم که اونهارو به صورت static تعریف کنیم،ضمن اینکه به نظر من موضوع سراسری تعریف کردن یک متغیر مختومه است و نباید یک متغییر رو سراسری تعریف کنیم

alireza_tavakol
پنج شنبه 09 مهر 1388, 16:06 عصر
encapsulation به عنوان یکی از مفاهیم اساسی ، به شما نمی گه که از public استفاده نکن بلکه میگه کاربر به هیچ عنوان نباید به طور مستقیم داده های شما رو تغییر بده.برای همین به شما private رو در نظر گرفته و در کنار اون استفاده از متدها،سازنده ها و پراپرتی های public .

شما دقیقا" به مفهوم Information hiding اشاره کردین ، استنباط که از این مفهوم میشه اینکه تقریبا" نقطه مقابل تعریف فیلد به صورت public است.


مروری بر نهان سازی اطلاعات ( چون می خواهم ازش نتیجه گیری کنم لازم بود قید میکردم )
برای جلوگیری از دسترسی غیر مجاز به محتویات فیلد ها باید فیلد به صورت private تعریف شود و در صورتی که لازم است محتویات فیلد خوانده شود از متدی با نامی شبیه به getValueVariable استفاده شود که این متد به صورت public تعریف شده است.
برای جلوگیری از واگذاری مقادیر نامعتبر به یک فید ، لازم است فیلد را به صورت private تعریف کنید و برای واگذار کردن مقدار در فیلد از متدی با نامی شبیه به setValueVariable استفاده شود ، این متد به صورت public تعریف می شود و در این متد قبل از واگذاری مقدار در فیلد عملیلت اعتبار سنجی رو انجام میدهد.

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

تا اینجا من همه این حرفا رو قبول دارم ولی توی C#‎‎ 3.5 مفهومی به اسم پروپرتی اتوماتیک مطرح شد و به نظر من همه حرف های بالا رو نقض کرده برای مثال دو تا کد می نویسم

public int variable;
اگه واسه کد بالا نظر سنجی بکنم همه اساتید می گن کدی بر خلاف اصول شی گرا نوشته ایم حالا کد بالا رو من به شکل زیر تغییر میدم ( پروپرتی اتوماتیک )


public int variable
{
set;
get;
}

اگه حالا نظر اساتید رو بپرسیم ممکنه بعضی ها بگویند کدی کاملا" اصولی است ! ( چون داره از پروپرتی استفاده میکنه و جز دستاورد های جدید برنامه نویسی با C# 3 است ) . من از این دسته خواهش میکنم تفاوت این دو تا کد رو واسه من توضیح بدن
ولی ممکنه بعضی از اساتید بفرمایند این دو تا کد هیچ فرقی باهم ندارند و هر دو کاملا" غیر اصولی هستند ! من از این دسته خواهش میکنم توضیح دهند که آیا دستاور پروپرتی اتوماتیک رو غیر اصولی ارزیابی میکننه؟

اَرژنگ
پنج شنبه 09 مهر 1388, 16:11 عصر
یعنی چه؟ چرا بد باشه؟
فیلدی که لازم داشته ایم استتیک باشه رو میخواهیم دسترسی عمومی بهش داشته باشیم
مشکلش کجاست؟
مثالهای خود ام اس دی ان هم پابلیک استیتک هست.

منظورتان کدام مثال‌هاست و برایه چه کاری؟
یک مثال برایه فیلدی که لازم داشته ایم که استتیک باشه بزنید.

اَرژنگ
پنج شنبه 09 مهر 1388, 16:36 عصر
ممنون از توجهتون اقای ارژنگ، من خیلی جاها میبینم که که یک تابع و یا متغییر رو static تعریف میکنند و در فرمهای دیگه ازش استفاده میکنند، اما طبق بحث هایی که شد مشخصه که این روش اشتباهه یا اینکه باید در جاهای خاص از اون استفاده کرد،حالا میخوام بدونم اگه میشه به این طریق عمل کرد که در چه جاهایی باید تابع یا متغییر رو به این صورت تعریف کرد ،یعنی تا کجا مجازیم که اونهارو به صورت static تعریف کنیم،ضمن اینکه به نظر من موضوع سراسری تعریف کردن یک متغیر مختومه است و نباید یک متغییر رو سراسری تعریف کنیم

استفاده از استاتیک برایه راحتی (تنبلی) نیست، اگر ۲ شئی با هم کاردارند لازم نیست یک واسطه که هیچ ربطی به کار ندارد و فقط برایه نگهداری مقادیر تعریف بشه.
فیلده استاتیک، تا حالا ندیدم بکار بره (نه فقط من، بلکه برنامه‌نویسهایه عالی). یک متد استاتیک در یک کلاس فقط برایه مفهومیه که مرتبط به همان کلاس است، مانند DateTime.Now ، یا مثال جناب توکلی در همینجا ShamsiDate.Now (اگرچه با داشتن اکستنشن متدها احتیاجی برایه یک کلاس جداگانه برایه شمسی نیست و یک متد ToShamsi کافی میبود ولی فرض کنیم که اکستنشن متدها را نداشتیم).
معمولا کسانیکه که هرجا دستشان میرسه، هر چیزی را استاتیک اعلام میکنند، و بی منطق هر جا یک کلاس میزنند که متدهایه استاتیک را یک جا بریزند.
به جایه اینکه به یک کلاس نگاه کنند و متد و یا پروپرتی که لازماً به هر شئی از آن کلاس ربطی ندارد ولی منتقاً به کل اشیاء آن کلاس ربط دارند را استاتیک اعلام کنند. مانند یک استاتیک پروپتی که تعداد اشیا بوجود آمده از یک کلاس را در خودش نگهداری میکنه، منطقاً میتونه استاتیک باشد (اگرچه اگر از یک فاکتوری استفاده میشه لازم ندارد).

ولی معمولا به پستهایه این فروم نگاه کنید ، میبینید که هر بار یک میپرسه چطوری بین ۲ فرم اطلاعات رد و بدل کنه، هر کی از راه میرسه میگه یک کلاس استاتیک بزن، مقدار را بریز توش! این سواستفاده از این قابلیت است چونکه:
۱.چرا یک کلاس جدید ساخته میشه وقتی که بهش احتیاجی نیست؟
۲.وظیفه این کلاس چی هست؟ منطقاً چه لزنمی را بر آورده میکنه؟ به جز اینکه یک آشغالدونی باشه که مقادیر را بدانه هیچ منطقی از هر جا ممکنه برزند توش و تغییر بدند.

اَرژنگ
پنج شنبه 09 مهر 1388, 16:45 عصر
شما دقیقا" به مفهوم Information hiding اشاره کردین ، استنباط که از این مفهوم میشه اینکه تقریبا" نقطه مقابل تعریف فیلد به صورت public است.



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

تا اینجا من همه این حرفا رو قبول دارم ولی توی C#‎‎‎‎ 3.5 مفهومی به اسم پروپرتی اتوماتیک مطرح شد و به نظر من همه حرف های بالا رو نقض کرده برای مثال دو تا کد می نویسم

public int variable;اگه واسه کد بالا نظر سنجی بکنم همه اساتید می گن کدی بر خلاف اصول شی گرا نوشته ایم حالا کد بالا رو من به شکل زیر تغییر میدم ( پروپرتی اتوماتیک )


public int variable
{
set;
get;
}
اگه حالا نظر اساتید رو بپرسیم ممکنه بعضی ها بگویند کدی کاملا" اصولی است ! ( چون داره از پروپرتی استفاده میکنه و جز دستاورد های جدید برنامه نویسی با C#‎‎ 3 است ) . من از این دسته خواهش میکنم تفاوت این دو تا کد رو واسه من توضیح بدن
ولی ممکنه بعضی از اساتید بفرمایند این دو تا کد هیچ فرقی باهم ندارند و هر دو کاملا" غیر اصولی هستند ! من از این دسته خواهش میکنم توضیح دهند که آیا دستاور پروپرتی اتوماتیک رو غیر اصولی ارزیابی میکننه؟

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

http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

alireza_tavakol
پنج شنبه 09 مهر 1388, 19:24 عصر
کد به خودی خود اصولی را نقض نمیکنه، بلکه اینکه برایه چه کاری استفاده میشه و به چه شکلی استفاده میشه است که اصول را نقض میکنه.
اگر همان پروپتی را در کلاس که منطقا بهش احتیاجی نیست تعریف کنند (چه فیلد، چه اتوماتیک پروپرتی و یا نه)، نقض اصول است.
همانطوری که نمیشه به یک ابزار اشکال گرفت، یک تیکه کد در جاهایه مختلف ممکن است درست یا اشتباه باشد.
بدانه داشتن اینکه این کد در کجا و برایه چه کاری بکار میره، نمیشه به شکل کلی نفی و یا قبولش کرد.

http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx

به نظر من جناب اَرژنگ خان دارن فرافکنی میکنند:خجالت:

Information hiding معتقد است : خواندن و نوشتن در یک فیلد باید مدیریت شده انجام شود.
پروپرتی اتوماتیک معتقد است : هیچ نوع از پیاده سازی نمیشه واسه بخش های set و get در نظر گرفت و همچنین داشتن بخش set و get را اجباری می داند.

دوستان قضاوت کنند:عصبانی++: ، آیا این دو تا نظریه برخلاف هم هستند یا در جهت هم!

اگه در خلاف هم هستند پس یکی داره اون یکی رو نقض میکنه!

JaguarXF
پنج شنبه 09 مهر 1388, 22:28 عصر
به نظر من جناب اَرژنگ خان دارن فرافکنی میکنند:خجالت:

Information hiding معتقد است : خواندن و نوشتن در یک فیلد باید مدیریت شده انجام شود.
پروپرتی اتوماتیک معتقد است : هیچ نوع از پیاده سازی نمیشه واسه بخش های set و get در نظر گرفت و همچنین داشتن بخش set و get را اجباری می داند.

دوستان قضاوت کنند:عصبانی++: ، آیا این دو تا نظریه برخلاف هم هستند یا در جهت هم!

اگه در خلاف هم هستند پس یکی داره اون یکی رو نقض میکنه!

information hiding یعنی همین که یک سری چیزها رو مثلا private میکنی که از دید اعضای بیرونی HIDE بشوند
برای auto imple,emted properties هم وقتی استفاده میشه که no additional logic لازم داشته باشند.

public string Address { get; private set; }که در مثال فوق به وضوح استفاده از private داره دیده میشه

کلا این دو موضوع چه ربطی بهم داشتند که مقایسشان کرده اید؟

JaguarXF
پنج شنبه 09 مهر 1388, 22:32 عصر
شما دقیقا" به مفهوم Information hiding اشاره کردین ، استنباط که از این مفهوم میشه اینکه تقریبا" نقطه مقابل تعریف فیلد به صورت public است.



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

تا اینجا من همه این حرفا رو قبول دارم ولی توی C#‎‎‎ 3.5 مفهومی به اسم پروپرتی اتوماتیک مطرح شد و به نظر من همه حرف های بالا رو نقض کرده برای مثال دو تا کد می نویسم

public int variable;اگه واسه کد بالا نظر سنجی بکنم همه اساتید می گن کدی بر خلاف اصول شی گرا نوشته ایم حالا کد بالا رو من به شکل زیر تغییر میدم ( پروپرتی اتوماتیک )


public int variable
{
set;
get;
}
اگه حالا نظر اساتید رو بپرسیم ممکنه بعضی ها بگویند کدی کاملا" اصولی است ! ( چون داره از پروپرتی استفاده میکنه و جز دستاورد های جدید برنامه نویسی با C#‎ 3 است ) . من از این دسته خواهش میکنم تفاوت این دو تا کد رو واسه من توضیح بدن
ولی ممکنه بعضی از اساتید بفرمایند این دو تا کد هیچ فرقی باهم ندارند و هر دو کاملا" غیر اصولی هستند ! من از این دسته خواهش میکنم توضیح دهند که آیا دستاور پروپرتی اتوماتیک رو غیر اصولی ارزیابی میکننه؟

یه کلمه private بگذارید بغل set ، کل مشکلتون حل میشه.

مثالهای بیشتر :
http://msdn.microsoft.com/en-us/library/bb383979.aspx

saeeedft
جمعه 10 مهر 1388, 03:24 صبح
ولی معمولا به پستهایه این فروم نگاه کنید ، میبینید که هر بار یک میپرسه چطوری بین ۲ فرم اطلاعات رد و بدل کنه، هر کی از راه میرسه میگه یک کلاس استاتیک بزن، مقدار را بریز توش! این سواستفاده از این قابلیت است چونکه:
۱.چرا یک کلاس جدید ساخته میشه وقتی که بهش احتیاجی نیست؟
۲.وظیفه این کلاس چی هست؟ منطقاً چه لزنمی را بر آورده میکنه؟ به جز اینکه یک آشغالدونی باشه که مقادیر را بدانه هیچ منطقی از هر جا ممکنه برزند توش و تغییر بدند.

با حرفتون موافقم،ما اصولی پیش نمیریم،من الان 1 سال برنامه نویسی رو شروع کردم،اما شاید براتون خنده دار باشه که هنوز یک دفترچه تلفون ساده رو نتونستم بنویسم،نه اینکه بلد نباشم، تا میخوام یک پروژه بنویسم همش دنبال اینم که ایا روشی که میخوام دنبال کنم درسته یا نه، برا همین الان فکرم فقط متمرکز روی یاد گرفتن اصولی هست تا اینکه بخوام یه چیزی بنویسم و دلم به این خوش باشه که برنامه نویسم، بدبختانه این روش ها رو توی هیچ کتابی هم عنوان نمیکنند و یا اینکه زود ازش می گذرند

اَرژنگ
یک شنبه 12 مهر 1388, 15:53 عصر
به نظر من جناب اَرژنگ خان دارن فرافکنی میکنند:خجالت:

Information hiding معتقد است : خواندن و نوشتن در یک فیلد باید مدیریت شده انجام شود.
پروپرتی اتوماتیک معتقد است : هیچ نوع از پیاده سازی نمیشه واسه بخش های set و get در نظر گرفت و همچنین داشتن بخش set و get را اجباری می داند.

دوستان قضاوت کنند:عصبانی++: ، آیا این دو تا نظریه برخلاف هم هستند یا در جهت هم!

اگه در خلاف هم هستند پس یکی داره اون یکی رو نقض میکنه!
سوایه اینکه میشه این دو را باهم مقایسه کرد و یا نکرد، در هر جایی که قوانینی وجود دارند، هیچ تضمینی نیست که همه قوانین همدیگر را در شرایطی نقض نکنند (این نظر من نیست، در منطق اثبات شده).
ایده اینکه که بشه یک سیستمی داشت که کامل و نقض کننده نباشند اشتباه و قدیمی شده.
به جایه اینکه سعی کنیم که با یک سیستم کامل و بدانه ضد و نقیض کار کنیم، باید سعی کنیم که مقدار ضد و نقیض را کم کنیم و یک جوری مدیریت کنیم.
هیچ گارانتی‌ای نداریم که مختصات هیچ زبان برنامه‌نویسی غیره قابل سواستفاده نباشند، مثلا همان ارث بری که برنامه‌نویسی شئیگرا بهش تکیه دارد را میشه راحت ازش سو‌استفاده کرد (inheritance vs composition).

اَرژنگ
یک شنبه 12 مهر 1388, 16:12 عصر
ظاهرا" نظر جناب اَرژنگ نسبت به پیاده سازی من منفی است

در ضمن میشه بفرمایید منظورتون از این جمله چی بوده؟
نقل قول:
نوشته شده توسط اَرژنگ http://barnamenevis.org/forum/images/buttons/viewpost.gif (http://barnamenevis.org/forum/showthread.php?p=817044#post817044)
یک برنامه‌نویس میدونه در چه زمانی باید اصول را زیره پا بزاره ولی نه یک لحظه زودتر.



نه نظر من منفی نبود! اون پستتان و پیاده سازی شما را ندیده بودم، بعد از اینکه دیدم هیچ اشکالی ندارد و شما از مفهومی که به عنوان متغییر سراسری شناخته مشیه استفاده نمیکنید.
( با اینکه با داشتید با اصول درست پیش میرفتید و با روش درست کار میکردید بدانه اینکه من آگاه باشم ) میگفتید که همیشه نباید به اصول خودمان را زنجیر کنیم (که در مواردی درست هم هست) ، به نظرم (اشتباهاً) اومد که از اول میخواهید با شکست اصول پیش برید! برایه همین هم گفتم که:یک برنامه‌نویس میدونه در چه زمانی باید اصول را زیره پا بزاره ولی نه یک لحظه زودتر، چونکه فکر کردم از اول میخواهید اصول را بشکنید!

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

FastCode
دوشنبه 24 اسفند 1388, 16:37 عصر
public int variable
{
set;
get;
}

من فکر میکنم شما قبلا" برنامه نویس vb6 بودی به دو دلیل:{
1.vb6 ها خیلی استاتیک رو دوست دارن.
2.vb6 ها اول set رو مینویسن بعد get(دقیقا" عکس #C و VB.Net)
}

در ضمن من هم هنوز از public static استفاده نکردم.
فقط یک مورد از یک private static PersianCalendar که اون رو هم به شدت sync کردم.

HOSSEINGHOLI
دوشنبه 24 اسفند 1388, 17:02 عصر
کسی اخرش نگفت چطوری تعریف کنیم کلاس عمومی
مثلا یک connection string یا تنظیمات data source را بهتره در یک کلاس داشته باشیم تا از ان استفاده کنیم به جای ااینکه با باز شدن هر فرم connection string را set کنیم.

FastCode
دوشنبه 24 اسفند 1388, 17:26 عصر
کسی اخرش نگفت چطوری تعریف کنیم کلاس عمومی
مثلا یک connection string یا تنظیمات data source را بهتره در یک کلاس داشته باشیم تا از ان استفاده کنیم به جای ااینکه با باز شدن هر فرم connection string را set کنیم.

اگر 200 تا کاربر داشته باشی--> sql will hang --> از یک کانکشن در تمام برنامه استفاده کن.(singleton)

ok.baby
چهارشنبه 20 دی 1391, 23:28 عصر
کل پست های این تاپیکو خوندم. منتها جوابی که تو برنامه نویسی استفاده کنم ندیدم.

من میخوام توی فرم اولی که باز میشه یه رشته ای رو از تکست باکس بگیرم، و از این رشته تا لحظه ای که پروژه بسته نشده، توی همه ی فرم های دیگه میخوام استفاده کنم.
از چه روشی باید استفاده کنم؟

Amir Oveisi
پنج شنبه 21 دی 1391, 16:25 عصر
http://msdn.microsoft.com/en-us/library/aa730869%28v=vs.80%29.aspx

Ashkanan9937
چهارشنبه 24 اردیبهشت 1393, 17:47 عصر
با سلام خدمت تمامی استادان گرامی

هر چند که از ایجاد این تاپیک زمان زیادی میگذره ولی
من 90درصد پست ها رو خوندم ولی جوابی دستگیرم نشد.شاید سطح من اونقدر بالا نبود که نتونستم به جوابی برسم.
خیلی عالی بود که در مورد یک سوال اینچنین بحث هایی بشه چون اونایی که حرفه ای تر هستن یک الگو برای ماها که مبتدی هستیم هستن
دوستومن پرسیده بود که اگر بخواهیم یک رشته ثابت رو تو کل پروژه استفاده کنیم باید چکار کرد
هر کدوم یه روش خاصی رو مطرح کرده بودن
-متغیر سراسری
-
(singleton)
و.............

حالا نتیجه چه شد.به کدام شیوه باید عمل کرد که اصولی باشه