PDA

View Full Version : سوال: ايجاد رويداد براي يك متغير



رافعی مهدی
پنج شنبه 13 تیر 1387, 23:56 عصر
با عرض سلام خدمت دوستان
چطور ميشه براي يك متغير دلخواه، رويداد تعريف كرد؟
بطور مثال يك متغير از نوع decimal داريم و مي خواهيم هر موقعي كه در زمان اجراي برنامه مقدار اين متغير تغيير كرد خود بخود يك متد مشخص اجرا بشه.

mohammad272005
جمعه 14 تیر 1387, 00:59 صبح
از property استفاده كنيد.

mohammad272005
جمعه 14 تیر 1387, 01:02 صبح
private int _Variable;
public int Variable
{
get
{
return _Variable;
}
set
{
_Variable = value;
}
}

رافعی مهدی
جمعه 14 تیر 1387, 02:10 صبح
جناب آقاي mohammad272205
عرض شود كه تصور مي كنم استفاده از property خواسته ي من رو برآورده نمي كند!
چون به نظر مي رسد كه بايد property نوشته شده را در مواقعي كه احساس نياز مي شود قبلاً در متن كد بكار برده باشيم تا در زمان اجرا با رسيدن cursor به خطي كه property فراخواني شده، دستورات داخل بلوكهاي get و set آن اجرا شوند، در حالي كه سوال من اينه كه بدون اينكه صريحاً دستوري در جاي خاصي نوشته شده باشد، به محض تغيير در مقدار متغير خود بخود متد از پيش تعيين شده اي اجرا بشه! (شايد مشابه اينكه قبلاً جايي register شده باشه)

mohammad272005
جمعه 14 تیر 1387, 02:16 صبح
والله راستش نفهميدم منظور شما چيه.

رافعی مهدی
جمعه 14 تیر 1387, 02:28 صبح
فرض كنيم متغير

bool Change=false;
تعريف شده باشد. و در متدي مقدار اين متغير true شود. حالا (بدليل تغيير اين متغير) انتظار داريم مثلاً متدي به نام IsChanged فراخواني شود، چه كار بايد كرد؟

رافعی مهدی
جمعه 14 تیر 1387, 02:32 صبح
توضيح بيشتر اينكه:
فرض كنيم در يك برنامه هزار بار مقدار يك متغير در جاهاي مختلف تغيير كند. مي خواهم ببينم آيا راهي هست كه يك متد به عنوان event تغيير مقدار اين متغير ايجاد كنم كه به صورت اتوماتيك با تغيير اين متغير فراخواني شود؟

لطفاً اگر باز هم مي فرماييد با property ميشه اين كار رو كرد يه مقدار بيشتر راجع به اون توضيح بديد.

mohammad272005
جمعه 14 تیر 1387, 03:49 صبح
private int _Variable;
public int Variable
{
get
{
return _Variable;
}
set
{
if(_Variable == value)
return;
_Variable = value;
if(IsChanged!=null)
IsChanged(this, EventArgs.Empty);
}
}
به همين سادگي به همين خوشمزگي

رافعی مهدی
جمعه 14 تیر 1387, 04:53 صبح
راه حلي رو كه ارائه داديد امتحان كردم ولي با تغيير متغير variable_ متد IsChanged فراخواني نشد.

اَرژنگ
جمعه 14 تیر 1387, 13:06 عصر
راه حلي رو كه ارائه داديد امتحان كردم ولي با تغيير متغير variable_ متد IsChanged فراخواني نشد.
یک پروژه ضمیمه کنید. راه اراعه داده شده کاملا درست است، بدون دیدن کد شما از این بیشتر نمیشه کمک کرد.

رافعی مهدی
جمعه 14 تیر 1387, 13:34 عصر
فرمايش شما درست است.
راه حل آقاي mohammad272005 كاملاً درسته و برداشت اشتباه من رو نسبت به قضيه ي property تصحيح كرد. ولي تا به امروز من فقط كاربرد property رو در مورد كلاس ها و ساختارها (structure) ديدم. واسه همين نتونستم يك خاصيت براي يك متغير تنها تعريف كنم. ممنون مي شوم اگر يكي از دوستان كد ساده اي رو براي اين كار بذاره.

اَرژنگ
جمعه 14 تیر 1387, 13:56 عصر
فرمايش شما درست است.
راه حل آقاي mohammad272005 كاملاً درسته و برداشت اشتباه من رو نسبت به قضيه ي property تصحيح كرد. ولي تا به امروز من فقط كاربرد property رو در مورد كلاس ها و ساختارها (structure) ديدم. واسه همين نتونستم يك خاصيت براي يك متغير تنها تعريف كنم. ممنون مي شوم اگر يكي از دوستان كد ساده اي رو براي اين كار بذاره.
قسمتی را که زیرش خط کشیدم معنی نمیده، یعنی چی برایه متغییر خاصیت تعریف کنید؟

رافعی مهدی
جمعه 14 تیر 1387, 15:55 عصر
مسئله اينه كه در يك پروژه ي بزرگ تعداد زيادي متغير دارم كه تغيير هر كدام از آنها، بر روي سايرين مي تونه اثر غير مستقيم بذاره، از طرفي تعريف آنها به صورت كلاس چندان جالب به نظر نمي رسه.(چون كار رو بسيار حجيم مي كنه) اينه كه به دنبال پيدا كردن راهي براي تعريف متدي تحت عنوان 'رويداد تغيير متغير' هستم.
مشكل اينه كه با استفاده از روشي كه mohammad272005 عزيز ارائه داده، نتونستم property رو واسه يك متغير ساده مثل

;int IntegerValue
تعريف كنم.
(منظور از متغير تنها يا ساده يعني نه در غالب اينستنس يك كلاس يا يك ساختار.
هدف: يك متغير تغيير مي كنه و خود بخود يك متد مشخص فراخواني ميشه.)

اَرژنگ
جمعه 14 تیر 1387, 16:20 عصر
مسئله اينه كه در يك پروژه ي بزرگ تعداد زيادي متغير دارم كه تغيير هر كدام از آنها، بر روي سايرين مي تونه اثر غير مستقيم بذاره، از طرفي تعريف آنها به صورت كلاس چندان جالب به نظر نمي رسه.(چون كار رو بسيار حجيم مي كنه) اينه كه به دنبال پيدا كردن راهي براي تعريف متدي تحت عنوان 'رويداد تغيير متغير' هستم.
مشكل اينه كه با استفاده از روشي كه mohammad272005 عزيز ارائه داده، نتونستم property رو واسه يك متغير ساده مثل

;int IntegerValue
تعريف كنم.
(منظور از متغير تنها يا ساده يعني نه در غالب اينستنس يك كلاس يا يك ساختار.
هدف: يك متغير تغيير مي كنه و خود بخود يك متد مشخص فراخواني ميشه.)
۱. قسمتی که قرمز و ضخیم کردم ، خصوصیتی است که در برنامه‌ها نباید باشد (مهم نیست زرگ و یا کوچک).طراحی درست برنامه برایه جلوگیری از همین نوع مشکلات است
۲.قسمتی که سبز کردم، برداشت اشتباه است ، متغییرها به کلاس تبدیل نمیشند، کلاسها برایه نگه داشتن کدهایی که بهم ربط دارند هستند و اگر برنامه درست طراحی و پیاده شده باشد همین طوری یک سری متغییر در برنامه پخش نمیشه.
۳.قسمتی که سورتی و ضخیم و زیرش خط کشیدم، کم اهمیت‌ترین قسمت است، کار چی هست که شما فکر میکنید با استفاده از کلاسها حجیم میشه؟
۴.قسمتی که آبی و ضخیم کردم، راه حل اشتباه است، حتی اگر شدنی باشد مشکل اصلی ربطی به هدف ندارد.
این که تعریف کردید معمولا مشخصات یک برنامه که از متغییرات زیادی استفاده میکند و هر جا هر کدی دلبخواهی مقادیر را عوض میکند (استفاده از متغییرات سراسری).

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

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

رافعی مهدی
جمعه 14 تیر 1387, 21:03 عصر
هميشه استفاده از متغيرهاي زياد در برنامه نويسي اجتناب پذير نيست.
اينكه گفتم : تعداد زيادي متغير دارم كه تغيير هر كدام از آنها، بر روي سايرين مي تونه اثر غير مستقيم بذاره به معناي اين نيست كه همین طوری یک سری متغیر در برنامه پخش شده باشد.
بعيد مي دونم در فيلدي كه من در اون برنامه نويسي مي كنم شما اطلاعات زيادي (يا حتي كمي) داشته باشيد. ولي خب چون ممكنه اينطور نباشه مي پرسم: به نظر شما نرم افزاري مثل Catia با تعداد متغير كم قابل نوشتن است؟ مسلماً در بخشهايي از زير نرم افزارهاي اين نرم افزار غول پيكر چنين امري غير ممكن است. (در اين موارد متغيرهاي زياد به طور مديريت شده در كنار هم و مؤثر بر هم عمل مي كنند و اين تاپيك به منظور پيداكردن راهي براي مديريت آسانتر در اين موارد مطرح شده است.)
كاري كه من دارم انجام مي دهم همچين چيزيه، بنابراين فكر نمي كنم طراحي الگوريتم مشكلي داشته باشه. اين پيچيدگي در ذات چنين برنامه هايي است. بگذريم...
:
:
در هر صورت ترجيح مي دهم موضوع تاپيك منحرف نشود. بنابراين سؤال رو تكرار مي كنم:
هدف: يك متغير تغيير مي كنه و خود بخود يك متد مشخص فراخواني ميشه. چطوري؟

اَرژنگ
شنبه 15 تیر 1387, 02:34 صبح
در هر صورت ترجيح مي دهم موضوع تاپيك منحرف نشود. بنابراين سؤال رو تكرار مي كنم:
هدف: يك متغير تغيير مي كنه و خود بخود يك متد مشخص فراخواني ميشه. چطوري؟
چیزی به اسم متغییر در سی شارپ وجود ندارد، یا متد و یا فیلد داریم که در کلاس تعریف شدند.
متغییر خالی را در برنامه ‌تان چگونه بوجود آوردید؟
در دلفی میشد متغیر تنها داشت ولی در سی شارپ این مفهوم وجود ندارد.
در ضمن هر چقدر نرم افزار بزرگتر باشد طراحی درست هم مهمتر است.
اگر فیلدی که درش برنامه نویس میکنید اینقدر اختصاصی هست توضیحات بیشتر بدید بفرستیمتان جایی که بتوانند کمکتان کنند، تا اینکه یک مثال کوچیک بفرستید که درستش کنیم. ولی دوباره تاکید میکنم : بدون اینکه تمام شرایط لازم برایه برنامه‌تان بدید همینطوری این سوال به خودی خود در مورد طراحی اشتباه است.

رافعی مهدی
شنبه 15 تیر 1387, 08:54 صبح
عزيز من! مگه نه اينكه در #C همه چيز شيء هستند؟
اگر مشكل در بكار گيري عبارت 'متغير' است، شما اون رو يك object در نظر بگير. چطور كامپايلر براي شيء اي مثل Button رويداد تعريف مي كنه و خودمان هم اگر بخواهيم مي تونيم رويدادي به ريدادهاي اون اضافه كنيم؟ اگر قضيه بر اين مبناست كه هر شيء داراي خصوصيات و رفتارهاي قابل طراحي است پس بايد بتوان براي يك متغير كه خود يك object است نيز خصوصيت و رفتار تعريف كرد و در نهايت اون رو به جنس دلخواه كست كرد.

اَرژنگ
شنبه 15 تیر 1387, 12:02 عصر
عزيز من! مگه نه اينكه در #C همه چيز شيء هستند؟
اگر مشكل در بكار گيري عبارت 'متغير' است، شما اون رو يك object در نظر بگير. چطور كامپايلر براي شيء اي مثل Button رويداد تعريف مي كنه
کمپایلر برایه شیئ‌ای روادید تعریف نمیکند، مثالی که mohammad272005 فرستادند کاملا روشن نشان میده که چطوری روادید تعریف میشه. روادید برایه شیئ تعریف نمیشه بلکه در کلاسی که شیئ ازش ساخته میشه تعریف میشه.

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


int myInteger = new int(); int متغییر نیست، تعریف جنس متغییر است.
myInteger متغییری از جنس int است.
بعد از اینکه کد اجرا میشه myInteger به یک شیئ از جنس اینت نشانه میکند.


و خودمان هم اگر بخواهيم مي تونيم رويدادي به ريدادهاي اون اضافه كنيم؟ اگر قضيه بر اين مبناست كه هر شيء داراي خصوصيات و رفتارهاي قابل طراحي است پس بايد بتوان براي يك متغير كه خود يك object است نيز خصوصيت و رفتار تعريف كرد و در نهايت اون رو به جنس دلخواه كست كرد.
همینطوری نمیشه روادید اضافه کرد،
هر شيء داراي خصوصيات و رفتارهاي قابل طراحي است به شرط اینکه به کلاسش دسترسی داشته باشید و یا از کلاسش ارث ببرید.
شرایط نیتیجه گیریتان درست نیست، همینطوری نمیتوانید یک ابجکت را بگریید و بهش خصوصيت و رفتار تعريف کنید، این چیزی که میخواهید مربوط‌ به زبانهایه داینامیک است، فعلا این قسمت در سی شارپ وجود ندارد.

hdv212
شنبه 15 تیر 1387, 13:11 عصر
اگر اشتباه نکرده باشم، شما میخواهید زمانی که مقدار متغیری در کلاستون تغییر کرد، از اون آگاه بشید و میخواهید به جای کنترل دستی، وظیفه رو به event ها منتقل کنید.
برای اینکار، شما باید یک CustomEventArgs بسازید تا مقدار جدید رو بتونید در eventHandler تعیین شده بخونید، کد زیر رو ببینید :

public class ValueEventArgs : System.EventArgs
{
private decimal _value;

public decimal Value
{
get { return _value; }
}

public ValueEventArgs(decimal value)
{
this.Value = value;
}
}
خب، این CustomEventArgs جدید، زمانی که رویداد ValueChanged اتفاق میفته، مقدار جدید پراپرتی مورد نظر رو در اختیار ما قرار میده.
حالا نوبت به تعریف کلاسی میرسه که نیاز دارید ازش آبجکت بسازید، این کلاس، یک Property به نام Number داره و زمانی که تغییر میکنه، رویدادی به نام ValueChanged اتفاق میفته که میتونید اون رو مدیریت کنید، خب کلاس رو به صورت زیر بسازید :

public class MyClass
{
public delegate void ValueChangedEventHandler(object sender, ValueEventArgs e);
public event ValueChangedEventHandler ValueChanged;

decimal _number;

public decimal Number
{
get { return _number; }
set
{
if (_number != value)
{
_number = value;
this.OnValueChanged(new ValueEventArgs(this.Number));
}
}
}

public MyClass(decimal number)
{
this._number = number;
}

public void OnValueChanged(ValueEventArgs e)
{
ValueChangedEventHandler handler = ValueChanged;
if (handler != null)
handler(this, e);
}
}

حالا باید مثل یک کنترل، در سورس کدتون از این کلاس یک آبجکت بسازید و Event Handler مورد نظر رو به لیست Event Handlerهای سورس کدتون اضافه کنید، اینطوری :

private void button2_Click(object sender, EventArgs e)
{
MyClass mc = new MyClass(12);
mc.ValueChanged += new MyClass.ValueChangedEventHandler(mc_ValueChanged);
mc.Number = 10;
}

private void mc_ValueChanged(object sender, ValueEventArgs e)
{
MessageBox.Show("Value Changed : " + e.Value.ToString());
}
الان وقتی مقدار 10 رو به پراپرتی Number میدم، رویداد ValueChanged اتفاق میفته.
لازم به ذکر است که زمانی که مقدار _number رو از طریق سازنده بهش پاس میکنم، رویداد ValueChanged ایجاد نمیشه، چون از پراپرتی Number استفاده نکردم، اگر شما میخواهید در زمان ساخت آبجکت هم این رویداد فراخوانی بشه، به جای دادن مقدار مستقیم به _number از پراپرتی Number استفاده کنید.
موفق باشید

رافعی مهدی
شنبه 15 تیر 1387, 22:01 عصر
hdv212 ! از كد بسيار مفيدتان خيلي ممنونم. واقعاً راه گشا بود.
منتهي كلاس ValueEventArgs داراي پراپرتي read-only است و هنگام كامپايل error اتفاق مي افتاد. از طرفي اين كد محدود به نوع decimal است. بنابراين اون رو به شكل زير استفاده كردم:



class ValueEventArgs
{
private object _value;
public object Value
{
get { return _value; }
set
{
_value = value;
}
}
public ValueEventArgs(object value)
{
this.Value = value;
}
}



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

hdv212
شنبه 15 تیر 1387, 22:40 عصر
البته دو موردي كه در بالا نوشتم به هيچ وجه ارزش كار فوق العاده شما رو پايين نمياره و فقط ميشه گفت كه من اينطوري ديگه مجبور نيستم براي هر نوعي از متغيرها يك كلاس مجزا تعريف كنم و كار عموميت بيشتري پيدا مي كنه.
درسته، چون شما توی پستهای قبلی نوع decimal رو گفته بودی، منم بر اساس اون کلاس رو ساختم، حالا شما میتونی از هر نوعی که بخوای استفاده کنی، به هر صورت خوشحالم که مشکلت حل شد.

اَرژنگ
یک شنبه 16 تیر 1387, 02:12 صبح
اينطوري ديگه مجبور نيستم براي هر نوعي از متغيرها يك كلاس مجزا تعريف كنم و كار عموميت بيشتري پيدا مي كنه.

۱.روشهایی که قبلا فرستاده شد هم لازم نداشت که برایه هر متغییر یک کلاس تعریف کنید،منتها شما گفتید که مشکلتان چیزه دیگری است.
۲.برنامه‌ای که به این شکل پیاده بشد طراحیش اشباه است.
۳.اینکه متغییرها را بریزید تویه یک کلاس فقط برایه اینکه در زمان عوض شدن باخبر بشید روش اشتباهی است که اشبتاه بودنش را بهتان تاکید کردم
این نوع برنامه نویسی شئیگرا نیست بلکه از خصوصیات شئیگرایی سی‌شارپ استفاده میکند که یک چیزی سرهم کند، در دراز مدت مشکلات بیشتری خواهید داشت.
به دیزاین پترنها قبل از پیاده کردن یک برنامه با این اصول نگاه بندازید.
موفق باشید

رافعی مهدی
یک شنبه 16 تیر 1387, 09:47 صبح
نمي دونم چرا اصرار داريد اين طراحي رو اشتباه بدونيد. با اين حال فرض كنيم حرف شما درست باشه و طراحي من كاملاً غلط. خب مشكلي نيست!!! شما براي مسئله ي زير يك الگوريتم درست طراحي كنيد تا من هم ياد بگيرم:

براي اينكه موضوع روشن بشه ميشه گفت كه مسئله در غالب يك الگوريتم ژنتيك ساده و به روش Elitism قابل مطرح شدنه. ولي واقعاً اين طور نيست يعني نمي خواهيم از GA استفاده كنيم. بلكه با استفاده از استدلال رياضي مي خواهيم به وضعيت بهينه دست پيدا كنيم.

خب، هفت متغير مستقل در مسئله وجود دارند كه تغييرات آنها بر نتيجه ي نهايي و گاه بر ساير متغيرها اثر مي ذاره. حالا مي خواهيم اين هفت متغير به شكل بهينه در كنار هم قرار بگيرند و در عين حال ميخواهيم تغييرات آنها رو مديريت كنيم.

چون در موارد متعددي لازم است مقدار يك يا چند تا از اين 7 متغير تغيير كند، بايد در هر مورد وضعيت هر هفت تا رو كنار هم در نظر بگيريم تا بتوانيم بفهميم كه حالا بايد كدام يكي از آنها رو تصحيح كنيم. (كه البته تصحيح كردن همانا و تلقي وضعيت تغيير متغير همان. يعني دوباره بايد اين تصحيح رو وضعيت جديد در نظر بگيريم و دوباره اون رو تصحيح كنيم!) پس به چند فاكتوريل if احتياج داريم؟

خب حالا من منتظر طراحي شما هستم...:متفکر:

اَرژنگ
یک شنبه 16 تیر 1387, 15:02 عصر
نمي دونم چرا اصرار داريد اين طراحي رو اشتباه بدونيد. با اين حال فرض كنيم حرف شما درست باشه و طراحي من كاملاً غلط. خب مشكلي نيست!!! شما براي مسئله ي زير يك الگوريتم درست طراحي كنيد تا من هم ياد بگيرم:

براي اينكه موضوع روشن بشه ميشه گفت كه مسئله در غالب يك الگوريتم ژنتيك ساده و به روش Elitism قابل مطرح شدنه. ولي واقعاً اين طور نيست يعني نمي خواهيم از GA استفاده كنيم. بلكه با استفاده از استدلال رياضي مي خواهيم به وضعيت بهينه دست پيدا كنيم.

خب، هفت متغير مستقل در مسئله وجود دارند كه تغييرات آنها بر نتيجه ي نهايي و گاه بر ساير متغيرها اثر مي ذاره. حالا مي خواهيم اين هفت متغير به شكل بهينه در كنار هم قرار بگيرند و در عين حال ميخواهيم تغييرات آنها رو مديريت كنيم.

چون در موارد متعددي لازم است مقدار يك يا چند تا از اين 7 متغير تغيير كند، بايد در هر مورد وضعيت هر هفت تا رو كنار هم در نظر بگيريم تا بتوانيم بفهميم كه حالا بايد كدام يكي از آنها رو تصحيح كنيم. (كه البته تصحيح كردن همانا و تلقي وضعيت تغيير متغير همان. يعني دوباره بايد اين تصحيح رو وضعيت جديد در نظر بگيريم و دوباره اون رو تصحيح كنيم!) پس به چند فاكتوريل if احتياج داريم؟

خب حالا من منتظر طراحي شما هستم...:متفکر:
اگر حقوق و یا مدرکی که قرار است از اینکار برایتان عاید شود را بهم بدید شاید در مورد طراحیش فکر کنم (اگر کاره دیگه‌ای نداشتم)، در ضمن طراحی الگریتم درست ربطی به پستهایی که تا قبل از این فرستاده بودید و یا روشی که برایه حل کردنش در نظر گرفتید ندارد. مخصوصا با توضیحاتتان در آخرین پست ربط نداشتن هدفی که بیان کرده بودید را به حل مسئله‌ای که باهاش مواجه هستید میبینم (اگر که نه بعد از اینکه کارتان تمام شد اینجا گذارش بدید من هم یک چیزی یاد بگیرم).
از اینکه بالاخره مشکلتان را کاملتر بیان کردید متشکرم، ببینید این فقط شما نیستید که دنبال جواب میگرده، ما هم میخواهیم ببینیم چه سوالات متفاوتی وجود دارند و دلایل استفاده کردن و یا نکردن از بعضی روشها چیه.
ببینید این لینک به کارتان میاد، اگر که ازش هیچ‌ چیزه جدیدی یاد نگرفتید و به کارتان نیامد خبر بدید دنبال مطالبی که به کارتان بیاد بگردیم (کمکمان کنید که مشکل شما را بهتر درک کنیم که بتونیم یاریتان کنیم، )
http://www.codeproject.com/KB/recipes/simplegenalg.aspx
در ضمن شما در پستهایه قبلیتان هدفتان را بیان نکرده بودید، اینکه به نظرتان راه حل چیه را گفته بودید. ما اینجا عادت داریم که ببینیم یکی میاد فکر میکنه که میدونه جوابش چیه و بدونه در نظر گرفتن تمام مطالب دیگر یک روش عجیب و غریب و غیره استاندارد را میخواهد، ولی بعد از اینکه مشکلش را توضیح میده میبینیم که اصلا جوابی که دنبالش بوده ربطی به چیزی که میگشته نداشته.
اگر پرس و جوتان میکنیم و میگیم یک کاری به عقل جور در نمیاد برایه این است که با شرایطی که به ما دادید کاری که میخواهید انجام بدید به عقل جور درنمیامد، حالا که میگید در مورد پیاده ریزی الگریتم ژنتیک هست یکمی جواب بهتر میشه بهتان داد.
موفق باشید
یادتان نره نتیجه کارتان و اینکه چه مسئلات دیگری را باهاش مواجه شدید اینجا پست کنید.

رافعی مهدی
یک شنبه 16 تیر 1387, 16:31 عصر
دلايل زيادي وجود داره كه يك برنامه نويس حتي نخواهد موضوع كاري رو كه انجام مي دهد بيان كنه. از طرفي من نيازي به طراحي الگوريتم توسط شما يا سايرين نداشتم در غير اين صورت عنوان تاپيك رو عوض مي كردم و همون چيزي كه دنبالش مي گشتم رو مطرح مي كردم.
انتقادي كه به نحوه ي جواب دادن شما دارم اينه كه جواب سوالي كه از شما شده رو نمي دهيد و به حواشي بيش از اصل موضوع توجه مي كنيد. مطمئن باشيد اگر لازم بود خودم اطلاعات بيشتري براي گرفتن جواب ارائه ميكردم. از طرفي مسلماً عده ي زيادي از دوستان با GA ، NN و ... آشنا نيستند. بنابراين دليلي نميبينم وقتي ميشه سوالي رو بطور ساده مطرح كرد بيخود با دادن اطلاعات غير ضروري و گيج كننده مسئله رو پيچيده كنم. به نظر من اين يك اصل مهم در پرسيدن سوال و دادن پاسخ است. جوابي كه hdv212 داد ايده آل بود. حداقل از نظر من. چون در اولين جمله برداشت خودش رو از موضوع تاپيك نوشته بود كه 100% درست بود و بعد يه جواب خوب داده بود كه مسئله رو همون طوري كه هست حل ميكرد. بدون اينكه بخواهد سر در بياره كه چرا اصلاً همچين سوالي مطرح شده.
ممكنه شما بگيد كه در برنامه نويسي بايد يك مسئله به طور كامل مطرح بشه تا به بهترين جواب برسه. اونوقت من جواب مي دهم در عين حال كه درسته كليّت نداره. ما اينجا WalkThrough كه برگزار نكرديم كه همه ي مسئله رو موشكافي كنيم و مثلاً بفهميم كه طراحي الگوريتمش چطوري بايد باشه.

اَرژنگ
یک شنبه 16 تیر 1387, 16:53 عصر
البته من همه ي اينها رو حساب دلسوزي شما ميذارم و از اين بابت از شما تشكر مي كنم. اميدوارم طبق بند اول مقرراتي كه وضع كرديد از اين انتقاد ناراحت نشويد.
داخل از تپیک جواب دادید و مرسی،
فقط در آخرین پستتان دلیلتان را گفتید:" ميخواهيم تغييرات آنها رو مديريت كنيم".
پیاده سازی الگریتم با طراحیش فرق دارد. اینطور که معلومه این الگریتم را اول دارید پیاده میکنید چونکه خودتان بهتر میدانید چی براش درست است (اگر در جایی یک رفرانس به استفاده از روادید برایه پیاده کردن الگریتم را دیدید بفرستید متشکر میشم، اگر که نه، جایی پیدا نکردید که از روادید برایه پیاده کردن الگریتمی مانند اینکه به دنبالش هستید استفاده میکنند دلیلش را وقتی که امتحان کردید درک میکنید ).
خواهش میکنم، لینکی که فرستادم قابل شما را نداشت.

موفق باشید.

Mahdi.Kiani
یک شنبه 16 تیر 1387, 19:37 عصر
private int _Variable;
public int Variable
{
get
{
return _Variable;
}
set
{
if(_Variable == value)
return;
_Variable = value;
if(IsChanged!=null)
IsChanged(this, EventArgs.Empty);
}
}
به همين سادگي به همين خوشمزگي


راه حلي رو كه ارائه داديد امتحان كردم ولي با تغيير متغير variable_ متد IsChanged فراخواني نشد.

جواب فوقی که بهتون داده شده، درست است.. فقط همه کد را براتون نگذاشتند... این که نتونستید مشکلتون را با راه حل ارائه شده حل کنید، عدم درک صحیح یا بی اطلاعی شما نسبت به event ها ونحوه تعریف آن ها در یک کلاس و هندل کردن آن ها درون یک کلاس دیگه است...
چون IsChanged یک متد نیست !!! بلکه یک event است..!!! ( گرچه بهتر بود نامی مناسب تر برای آن انتخاب میشد، مثلا DataChanged) که شما می بایستی، اون در کلاست تعریف می کردین و سپس در کلاس دیگر استفاده می کردید..
چیزی شبیه به کد زیر :



class Test
{
public event EventHandler DataChanged;
private int custromData;

public int CustomData
{
get
{
return custromData;
}
set
{
custromData = value;
OnDataChanged(EventArgs.Empty);

}
}


public virtual void OnDataChanged(EventArgs e
{
if (this.DataChanged != null)
DataChanged(this, e);

}

}


.



منتهي كلاس ValueEventArgs داراي پراپرتي read-only است و هنگام كامپايل error اتفاق مي افتاد.
این موضوع ربطی به readonly بودن پروپرتی کلاس مذکور نداره ... اشکال از جای دیگه است.. و اتفاقا در بیشتر مواقع نیاز است که این گونه پروپرتی ها که در کلاس های مشتق شده از EventArgs تعریف می شوند، به صورت readonmly مورد استفاده قرارا بگیرند که بهترین مکان آن همانطور هم که در کد قبل (کد کاربر hvd) اشاره شده، فرستادن مقدار به Constructor کلاس Value.... می باشد..

موفق باشید

رافعی مهدی
یک شنبه 16 تیر 1387, 20:42 عصر
سلام آقاي كياني.
اين فرمايش شما كه:

... این که نتونستید مشکلتون را با راه حل ارائه شده حل کنید، عدم درک صحیح یا بی اطلاعی شما نسبت به event ها ونحوه تعریف آن ها در یک کلاس و هندل کردن آن ها درون یک کلاس دیگه است...

رو قبول دارم علتش بي اطلاعي من از نحوه ي تعريف event ها بوده. اما اينكه گفتيد:

این موضوع ربطی به readonly بودن پروپرتی کلاس مذکور نداره ... اشکال از جای دیگه است..
رو قبول ندارم. شما اون كد رو همونطوري كه فرستاده شده در يك solution بذاريد و اجرا كنيد. error گرفته نميشه؟ در پنجره ي error-list شرح داده كه علت خطا read-only بودن پراپرتي است. اگر اشتباه مي كنم، لطفاً بفرمائيد.
من solution رو به صورت فايل ضميمه اي كه فرستادم درست كردم.

Mahdi.Kiani
یک شنبه 16 تیر 1387, 22:11 عصر
سلام آقاي كياني.
اين فرمايش شما كه:

رو قبول دارم علتش بي اطلاعي من از نحوه ي تعريف event ها بوده. اما اينكه گفتيد:

رو قبول ندارم. شما اون كد رو همونطوري كه فرستاده شده در يك solution بذاريد و اجرا كنيد. error گرفته نميشه؟ در پنجره ي error-list شرح داده كه علت خطا read-only بودن پراپرتي است. اگر اشتباه مي كنم، لطفاً بفرمائيد.
من solution رو به صورت فايل ضميمه اي كه فرستادم درست كردم.

سلام دست عزیز
من فایل پیوست شما را نگاه نکردم.. اما یک بار دیگه با دقت بیشتری کدی که کاربر hdv212 براتون فرستاد را دیدم...
همانطور که قبلا هم اشاره کردم این اشکال به اون دلیلی که شما گفتید نیست.. اشکال مربوط به اینه که در constructor کلاس ValueEventArgs ، اشتباها به جای اینکه نوشته بشه





this._Value=value




نوشته شده




this.Value=value



در واقع اگر شما کد زیر را



public ValueEventArgs(decimal value)
{
this.Value = value;
}


( ایراد مربوط به کد قرمز رنگ هست)
به کد زیر تغییر دهید مشکل حل خواهد شد


public ValueEventArgs(decimal value)
{
this._value = value;
}



موفق باشید

اَرژنگ
چهارشنبه 19 تیر 1387, 04:00 صبح
دلايل زيادي وجود داره كه يك برنامه نويس حتي نخواهد موضوع كاري رو كه انجام مي دهد بيان كنه. از طرفي من نيازي به طراحي الگوريتم توسط شما يا سايرين نداشتم در غير اين صورت عنوان تاپيك رو عوض مي كردم و همون چيزي كه دنبالش مي گشتم رو مطرح مي كردم.

در بالایه همین انجمن یک تاپیک وجود دارد که دلایل به نتیجه رسیدن یک تاپیک را بیان میکند:
4)سوال خود را با ذکر جزییات و به طور دقیق ذکر کنید :
به خاطر داشته باشید تنها زمانی میتوان به یک سوال پاسخ داد که جزییات مسئله به طور صریح و روشن بیان شده باشد تا بتوان به آن جوابی منطقی و صحیح داد .

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


انتقادي كه به نحوه ي جواب دادن شما دارم اينه كه جواب سوالي كه از شما شده رو نمي دهيد و به حواشي بيش از اصل موضوع توجه مي كنيد. مطمئن باشيد اگر لازم بود خودم اطلاعات بيشتري براي گرفتن جواب ارائه ميكردم. از طرفي مسلماً عده ي زيادي از دوستان با GA ، NN و ... آشنا نيستند. بنابراين دليلي نميبينم وقتي ميشه سوالي رو بطور ساده مطرح كرد بيخود با دادن اطلاعات غير ضروري و گيج كننده مسئله رو پيچيده كنم. به نظر من اين يك اصل مهم در پرسيدن سوال و دادن پاسخ است.

انتقاد به این دارید که قبل فرستادن یک جواب هیچ چی در مورد سوال ندانیم ؟ سوال اصلی که غلط بود، بعد از کلی پست به اینکه میخواهید روادید را چطوری پیاده کنید پی بردید، این مطلب قبلا اینجا بحث شده بود و با جستجو پیدا میکردید. اگر شما نمیخواهید وقت بگذارید که سوالتان را با جزعیات توضیح‌ بدید از این ببعد خیلیها برایه جواب دادن درست و حسابی وقت نمیگذارند.
دوما، اینکه فکر میکنید خیلیها (از جمله من) در مورد الگریتمهایه ژنتیک و ... نمیدانند درست نیست. اگر مییاد جایی سوالی میپرسید که فکر میکنید بقیه از شما کم اطلاع‌ترند پس انتظار جواب ندارید.
همین روش اشتباهی را که میگشتید در سال ۹۸ با دلفی پیاده کرده بودم و دلیل اینکه چرا با الگریتم ژنتیک ازش نمیشه استفاده کرد را هم میتونم توضیح‌ بدم،ولی بر طبق گفته خودتان "دلايل زيادي وجود داره كه يك برنامه نويس حتي نخواهد موضوع كاري رو كه انجام مي دهد بيان كنه" .



.
.
.
مسئله اينه كه در يك پروژه ي بزرگ تعداد زيادي متغير دارم كه تغيير هر كدام از آنها، بر روي سايرين مي تونه اثر غير مستقيم بذاره، از طرفي تعريف آنها به صورت كلاس چندان جالب به نظر نمي رسه.(چون كار رو بسيار حجيم مي كنه)
.
.
.
جوابي كه hdv212 داد ايده آل بود. حداقل از نظر من. چون در اولين جمله برداشت خودش رو از موضوع تاپيك نوشته بود كه 100% درست بود و بعد يه جواب خوب داده بود كه مسئله رو همون طوري كه هست حل ميكرد. بدون اينكه بخواهد سر در بياره كه چرا اصلاً همچين سوالي مطرح شده.

من سر درنمیارم، در یک پستتان گفتید که از کلاس نمیخواهید استفاده کنید چونکه حجیم میشد، روشی که hdv212 در پستشان دادند دقیقا همین شرطی را که گفتید نقض میکند. پس چطوری روشی که شرایطی که خودتان را اراِه دادید نقض میکند برایتان ایده‌ال است!!!؟؟؟
اینجا یا یک چیزی هست که من هنوز سر دنیاوردم، با این روش چطوری بدانه استفاده از یک کلاس برایه برایه جایگزینی متغییرها استفاده میکنید و هم اینکه از کلاس استفاده نمیکنید؟



ممكنه شما بگيد كه در برنامه نويسي بايد يك مسئله به طور كامل مطرح بشه تا به بهترين جواب برسه. اونوقت من جواب مي دهم در عين حال كه درسته كليّت نداره. ما اينجا WalkThrough كه برگزار نكرديم كه همه ي مسئله رو موشكافي كنيم و مثلاً بفهميم كه طراحي الگوريتمش چطوري بايد باشه.
سوال گنگ بود، بر طبق سوال کاری که میخواستید انجام بدید در سی شارپ شدنی نیست، و بدانه پیاده کردن یک کلاس برایه ابجکتهایی که به جایه متغییرات استفاده خواهید کرد ممکن نیست، و خودتان هم در یک پست به اینب موضوع اشاره کردید "از کلاس استفاده کنم حجیم میشه".
این نیست که سوال باید به طور کامل مطرح بشد، شرایط که دنبال یک جواب میگردید هم به جواب ربط دارد.
۲ روش که من میدونم برایه مدیریت عوض شدن مقدار ژنها از روادید استفاده میکنند به در تئوری به نظر درست میان ولی کاربرد ندارند (مگر اینکه به شکل دیسیتربیوتد و یا پارالل پیاده بشند).
کسی نگفت که WalkThrough است، و کسی هم نپرسید که الگریتمان چیه که پیاده‌اش کند، ما گفتیم که برایه چه کاری میخواهید، اگر میگفتید که برایه پیاده سازی الگریتم ژنتیک هست بس بود، کلی از شرایط که در پیاده ریزی الگریتم ژنتیک مهم هستند به جواب دادن سوال کمک میکردند.

من انتقادی که از پستهایه شما دارم این است که
۱ـ سوال اولیتان گنگ بود، حداقل یک نفر دیگر هم متوجه نشد که چکار میخواهید انجام بدید. اگر کاره تخصصی انجام میدید دقیق بیان کردن اولا شرط است.
۲.طراحی الگریتم را با بیان مشکلی که الگریتمان را قراره حل کند اشتباه گرفتید.
۳.اگر هم فکر میکنید که کاری که انجام میدید تخصصی است بازهم برایه یادگیری بقیه هم که شده یک اطلاعاتی بدید.
۴.اگر در پست اول یک اشاره به الگریتم ژنتیک کرده بودید یک روش بهتر از هدفی که بیان کردید برایتان میفرستادم ولی بازهم به کارتان نمیامد چونکه پیاده نکردن الگریتم ژنتیک با استفاده از روادید دلیل دارد (۱۰ سال پیش ما هم فکر کردیم اگر از روادید امتحان کنیم هیچ کس دیگری اینکار را نکرده و برایه خوادمان اسمی درست میکنیم).

۵-اگر یک روش میخواهید که " یک آرایه متغییر دارید و اگر مقدار یکیش عوض شد باخبر بشید " بگید این را مینویسم و میفرستم .

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


موفق باشید

linux
چهارشنبه 19 تیر 1387, 07:58 صبح
سلام آقاي كياني.
اين فرمايش شما كه:

رو قبول دارم علتش بي اطلاعي من از نحوه ي تعريف event ها بوده. اما اينكه گفتيد:

رو قبول ندارم. شما اون كد رو همونطوري كه فرستاده شده در يك solution بذاريد و اجرا كنيد. error گرفته نميشه؟ در پنجره ي error-list شرح داده كه علت خطا read-only بودن پراپرتي است. اگر اشتباه مي كنم، لطفاً بفرمائيد.
من solution رو به صورت فايل ضميمه اي كه فرستادم درست كردم.
من تمام پستهای این بخش را خواندم ، گفته های ارژنگ کاملا درست.
1- زبان C# یک زبانی است که شما خارج از oop نمی توانید برنامه بنویسید. در هر صورت شما ملزم به طراحی آبجکتها هستید.
2- زبانهای بشری یک قراردادی هست که بین یک عده ای برای بیان اندیشه ها و ... در هر زمینه ای واژه هایی هستند که معنای ویژه دارند مثلا در برنامه نویسی oop متغیر با شی خیلی فرق دارد.
3- تعداد غلطهای املایی دوستان خیلی زیاد شده است و این برای یک عده از کسانی که تحصیل کرده هستند صورت خوشی نداره.
ارژنگ خان جزئیات را با ع می نویسد ، کاش حداقل یک غلط یاب املای فارسی هم روی این سایت نصب می شد.

sinpin
چهارشنبه 19 تیر 1387, 09:04 صبح
3- تعداد غلطهای املایی دوستان خیلی زیاد شده است و این برای یک عده از کسانی که تحصیل کرده هستند صورت خوشی نداره.
هرچند كه خارج از موضوع اصلي تاپيك است اما بسيار موضوع مهمي ست و من نيز با آن موافقم
البته آقاي ارژنگ كه نام برديد بيش از 20 سال است كه خارج از ايران زندگي ميكنند اما دوستاني كه در ايران زندگي ميكنند و "زمينه" را "ضمينه" مينويسند و بسياري موارد ديگر ... خوبه كه به اين نكات بيشتر توجه داشته باشند.

Xcalivorse
چهارشنبه 19 تیر 1387, 09:36 صبح
دستوراتی که شما دربلاک های Get یا Set می نویسید در زمانهای تغییر مقدار متغییر یا فراخوانی مقدار متغییر اجرا می شوند.

;public int _Variable
public int Variable
}
get
}
;return _Variable
{
set
}
(if(value > 10
}
; Variable = 0_
{
else
}
;Variable = Value_
{
{

{