PDA

View Full Version : مقید کردن به استفاده از یک تابع



Mrs.Net
شنبه 03 آذر 1386, 22:40 عصر
من یک کلاس دارم و تابعی هم داخل اون هست
در هرجای پروژه که از اون کلاس استفاده میشه . حتما باید اون تابع هم اونجا صدا زده بشه.
آیا راهی هست که این الزام توسط دیباگر چک بشه؟
ممنون

Alireza Orumand
شنبه 03 آذر 1386, 23:00 عصر
اگر منظورتون از اینکه هرجای پروژه اینه که هر جا که از اون کلاس یه شی ساخته شد خوب این تابع رو constructor بگذارید یا از داخل constroctor صداش بزنید.
حالا این وسط نقش دیباگر چی میتونه باشه دیگه خدا عالمه. :گیج:

hassan razavi
شنبه 03 آذر 1386, 23:01 عصر
می تونید اون تابع رو در متد Construction کلاستون صدا بزنید.

Mrs.Net
شنبه 03 آذر 1386, 23:45 عصر
متوجه سوال من نشدید
مثل باز کردن یک کانکشن. وقتی کانکشن باز میکنید باید اون بعد از اتمام کارتون ببندید
یعنی تابع close صدا بزنید. خوب اینجا اگر close صدا نزنید دیباگر از شما ایراد نمیگیره ولی برنامه تون درست نیست و ممکنه با این اشتباه یجای دیگه برنامه تون مشکل پیدا کنه
من قبلا خونده بودم که یک نوع تعریف وجودداره که با اون تعریف وقتی از کلاسی استفاده میکنیم باید اون تابع از کلاس هم تو همون کلاسی که استفاده کردیم صدا زده بشه.
یعنی دیباگر وقتی خواست کامپایل کنه چک کنه که آیا صدا زده شده یا نه

اَرژنگ
یک شنبه 04 آذر 1386, 03:53 صبح
من یک کلاس دارم و تابعی هم داخل اون هست
در هرجای پروژه که از اون کلاس استفاده میشه . حتما باید اون تابع هم اونجا صدا زده بشه.

جواب خیر است، لازم نیست.
مثال اینکار را در http://barnamenevis.org/forum/showthread.php?t=81952 برایتان فرستاده بودم.




آیا راهی هست که این الزام توسط دیباگر چک بشه؟
ممنون

تا جایی که من دیدم نه، استفاده از Delegate در پیاده کردن احتیاجی به اضافه کردن این کار به دیباگر نمیزاره.

اگر کسی چیزه دیگری در مورد اینکار دیده بگه.

Alireza Orumand
یک شنبه 04 آذر 1386, 08:02 صبح
سلام.
همونطور که بالا خدمت شما عرض کردم اگر نیازی به این داشتید که در هنگام ساختن یک object کار خاصی انجام بگیره اون کارها رو تو متد constrctor انجام بدید یا اون کار ها رو تو یه متد انجام بدید و این متد رو داخل constrctor صدا بزنید.
اما اگر برعکس نیاز به این داشتید که هنگام از بین رفتن یک object کار خاصی انجام بشه این کار رو میتونید داخل متد destructor انجام بدید یا مثل بالا داخل یه متد دیگه انجام بدید و از Destructor صداش بزنید.
ولی در مجموع اگر نگران این هستید که از منابع سیستم بهینه استفاده کنید و یا اینکه منبعی از سیستم بگیرید و به اون بازگشت داده نشه باید بگم نگرانیتون بی مورده. .net زحمت این کار رو خودش میکشه.
موفق باشید.

hassan razavi
یک شنبه 04 آذر 1386, 08:26 صبح
فکر کنم منظور دوستمون استفاده از constrctor و Destructor نیست.
من چیزی رو که میگید تا حالا نشنیدم ولی اگه باشه بحث جالبی هست.
فکر کنم شما چیزی شبیه تعریف متغیر و مقداردهی اولیه می خواهید که اگه یک متغیر مقداردهی اولیه نشه کامپایلر ایراد میگیره. شما می خواهید برای یک کلاس یک Member ایجاد کنید که کامپایلر بر روی اون کنترل داشته باشه. مثلا اینکه حتما باید یکبار اجرا شده باشه.
اگه درست منظورتون رو فهمیدم ، تائید کنید تا بحث برای دوستام بازتر شده باشه.

Mrs.Net
یک شنبه 04 آذر 1386, 09:23 صبح
ممنون از همه

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


فکر کنم منظور دوستمون استفاده از constrctor و Destructor نیست.
من چیزی رو که میگید تا حالا نشنیدم ولی اگه باشه بحث جالبی هست.
فکر کنم شما چیزی شبیه تعریف متغیر و مقداردهی اولیه می خواهید که اگه یک متغیر مقداردهی اولیه نشه کامپایلر ایراد میگیره. شما می خواهید برای یک کلاس یک Member ایجاد کنید که کامپایلر بر روی اون کنترل داشته باشه. مثلا اینکه حتما باید یکبار اجرا شده باشه.
اگه درست منظورتون رو فهمیدم ، تائید کنید تا بحث برای دوستام بازتر شده باشه.
کاملا درسته من این کنترل میخوام


سلام.
همونطور که بالا خدمت شما عرض کردم اگر نیازی به این داشتید که در هنگام ساختن یک object کار خاصی انجام بگیره اون کارها رو تو متد constrctor انجام بدید یا اون کار ها رو تو یه متد انجام بدید و این متد رو داخل constrctor صدا بزنید.
اما اگر برعکس نیاز به این داشتید که هنگام از بین رفتن یک object کار خاصی انجام بشه این کار رو میتونید داخل متد destructor انجام بدید یا مثل بالا داخل یه متد دیگه انجام بدید و از Destructor صداش بزنید.
ولی در مجموع اگر نگران این هستید که از منابع سیستم بهینه استفاده کنید و یا اینکه منبعی از سیستم بگیرید و به اون بازگشت داده نشه باید بگم نگرانیتون بی مورده. .net زحمت این کار رو خودش میکشه.
موفق باشید.
هیچ کدام از موضوعاتی که گفتید مورد سوال من نبود.

Alireza Orumand
یک شنبه 04 آذر 1386, 12:58 عصر
سلام.


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



کاملا درسته من این کنترل میخوام

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

Mrs.Net
یک شنبه 04 آذر 1386, 13:16 عصر
Alireza Orumand تا موقعی که به این constructor فکر کنید متوجه سوال من نمیشید.
اون جمله هم نمیدونم چرا اون قسمتشو و اونم از وسط نقل قول کردید.

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

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

اینم مثال:


calss A
{
public A()
{
....
}
....
publicvoid AddComand()
{
....
}
publicvoid NowRunCommand()
{
....
}
.......
}

تابع NowRunCommand از کلاس A همون تابعی هست که من میخوام.
و استفاده کردن A در B :


calss B
{
public B()
{
....
}
publicvoid Load()
{
A runner = new A();
runner.Addcomand(....);
runner.Addcomand(....);
runner.Addcomand(....);
runner.Addcomand(....);
....
runner.NowRunCommand();
}
}

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

نکته: این موضوع یک خطا یا مشکل نیست بلکه یه راه جالب برای جلوگیری از خطای برنامه نویس هست.

hassan razavi
یک شنبه 04 آذر 1386, 13:21 عصر
خیلی عالی بود. مثالتون کامل بود.
منهم دقیقا همین برداشت رو از منظورتون کرده بودم. هنوزهم دنبالش هستم ولی به نتیجه رسیدم.

Alireza Orumand
یک شنبه 04 آذر 1386, 14:59 عصر
سلام


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

نکته: این موضوع یک خطا یا مشکل نیست بلکه یه راه جالب برای جلوگیری از خطای برنامه نویس هست.

حالا دوزاریم افتاد. واقعا هم شما خسته نباشید هم من هم این حسن آقای گل که بنده خدا کلی تلاش کرد که من متوجه بشم قضیه از چه قراره.
ببخشد اینو میگم ولی یاد آوری یه نکته شاید بد نباشه و کمک کنه که از این بحث یه نتیجه ای بگیریم. البته میدونم که شما خودتون این بحث رو میدونید ولی فکر میکنم به خاطر بی توجهی به این نکته باشه که شما دنبال یه انجام این کار هستید.
خطا های برنام نویسی سه دسته هستن
1- خطای دستوری
2- خطای منطقی
3- خطای زمان اجرا
خوب اگر منظور شما از دیباگر همون کامپایلر باشه(چون این کامپایلر هست که خطا ها رو تشخیص میده نه دیباگر) کامپایلر فقط خطا های دسته اول رو متوجه میشه و صدا شدن یا نشدن یک تابع به جز توابع خاص مانند همون constructor (الان با گفتن این constructor میخواید سر به تنم نباشه:بامزه:) یا تابع main نهایتاً میتونه باعث یکی از خطا های دسته دوم یا سوم بشه که این خطا ها به هیچ وجه توسط کامپایلر قابل تشخیص نیستن و فقط در زمان اجرا میشه متوجه این خطا ها شد که یا به کمک error handlig این مشکلات رو رفع و رجوع میکنیم یا چند وقت با برنام کار میکنیم تا متوجه بشیم که از نظر منطقی مشکل داره.
در کل اگر دنبال تولید شدن خطای کامپایلر برای استفاده نشدن از یک تابع هستید باید بگم که این اتفاق نمیوفته. مگر اینکه شما تو ساختار زبان دست ببرید و مثلا به جای تابع main بیاید NowRunCommand() رو قرار بدید.(این آخرش شوخی بود. امیدوارم ناراحت نشید:چشمک:).
موفق باشید.

manitack
دوشنبه 05 آذر 1386, 22:01 عصر
با استفاده از Attribute ها میشه کمی با کمپایلر گفتمان کرد. البته من کلاس مناسب با خواسته دوستمون رو نمیدونم اما به عنوان سر نخ بد نیست.

[Obsolete("This is Test ForObsoleteAttribute")]
private void TestAttribute()
{ }//end of function
این Attribute باعث میشه هر جا از این متد استفاده شد کمپایلر Warning بده که متد منسوخ شده است. امکان تبدیل Warning به Error هم هست.

اَرژنگ
چهارشنبه 05 دی 1386, 12:20 عصر
خیر، تا این ورژن دات نت (۳.۵) اینچنین کاری ممکن نیست.
قابلیت اینکار بستگی به استفاده از فریم ورکهایه ماورایه برنامه نویسی (Meta Programming FrameWorks) است. کارهایی که در این زمینه انجام شدند ممکن است که تا ۱۰ سال دیگر در اختیار برنامه نویسان قرار بگیرند.
فعلا یک روش دیگر ی برایه اینکار وجود دارد و آنهم درخواست رجسیتر کردن متدهایی که باید بعد از همدیگر اجرا بشند، و قابلیت اجرایه آنها را از کلاسهایه دیگر صلب کنید، و فقط از همان کلاس درخواست کنید که متدها را اجرا کند. به این طریق امکان اجرا نشدن متد از دست برنامه نویس خارج میشد و به خود کلاس واگذار میشد.