گفتگو هایی در باب سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد :rose:
استاد ، شما استراتژیِ ساختار کلاس هایی که در پروژه هاتون مینویسید (منظورم بر اساس لایه هاست) را بر چه اساسی ترتیب میدید؟
و توصیه تون بهم برای ساخت کلاس ، چیه؟


یعنی مثلا اگه من بخوام از متد FindParentElements<T> (که در پست شماره 599 تاپیک wpf این متد را دادم) (که متدی هست که بچه های یک المنت والد را برمیگردونه) ، استفاده کنم ، بهتره در کجا بنویسیم تا در پروژه های بعدی که مورد نیازم بشه ، دوباره نیاز به کپی کردن نباشه و ازش در اونجا هم استفاده کنم؟


این مسئله اینجا مهم تر میشه که مثلا خیلی از متدهای این جوری هستن که کاربردی هستن و بعضی هاش ممکنه در بعضی پروژه های دیگه استفاده بشن (ممکنه هم بعضی هاشون در بعضی از پروژه ها استفاده نشن) .
و البته چندان ربطی به هم ندارن (یا ممکنه نداشته باشن) . مثلا یکی ، همین متد FindParentElements<T> . یکی دیگه هم مثلا متدی که لیست درایوهای یک کامپیوتر را به عنوان خروجی بده و از این دست متدهایی که ممکنه ربطی به هم نداشته باشن (و ممکنه چند ده ها از این نمونه متدها باشن و بعضی هاش در بعضی از پروژه ها استفاده بشن و کلا کاربردی هستن) .


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

کلا استاد نظرتون در این رابطه چیه؟ شما در پروژه هاتون با این متدها ، با چه استراتژی ای رفتار میکنید؟ توی کلاس استاتیک میذارید یا کلاس شی گرا یا کار دیگه ای میکنید؟
و اگه کلاسی برای این نوع متدها مینویسید ، اسم کلاس را چی میذارید؟ :) چون متدهای مختلف هستن و کارشون شبیه هم نیست ، انتخاب اسم اش آسون نیست . اسم Utility ، چطوره؟

تشکر استاد .
 

the_king

مدیرکل انجمن
استاد ، شما استراتژیِ ساختار کلاس هایی که در پروژه هاتون مینویسید (منظورم بر اساس لایه هاست) را بر چه اساسی ترتیب میدید؟
و توصیه تون بهم برای ساخت کلاس ، چیه؟
هر کسی باید بر اساس دید خودش عمل کنه، استراتژی دلخواه من بر اساس دید خودمه، الزاما برای شخص دیگری مطلوب نیست.
توصیه ام اینه که اولا اصول شیء گرایی رو جستجو کنید و بخونید و رعایت کنید. نتیجه اش ساده است، فرضا اگر موردی میتونست private باشه نباید public باشه، اگر موردی میتونست static باشه نباید non static باشه، اگر مواردی کار مشترکی انجام می دهند نباید در چند جا کد تکراری وجود داشته باشه.

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

یعنی مثلا اگه من بخوام از متد FindParentElements<T> (که در پست شماره 599 تاپیک wpf این متد را دادم) (که متدی هست که بچه های یک المنت والد را برمیگردونه) ، استفاده کنم ، بهتره در کجا بنویسیم تا در پروژه های بعدی که مورد نیازم بشه ، دوباره نیاز به کپی کردن نباشه و ازش در اونجا هم استفاده کنم؟
اول کار که نه، هیچ کاری لازم نیست بکنید، اصلا بهش فکر نکنید. اوایل صرفا کدش رو از اینجا کپی می کنید به جایی که لازمه و تغییری که میخواد هم می دهید.
طول می کشه تا یک کد به یک ماژول ایده آل برای استفاده مجدد تبدیل بشه، همینکه اصول شیء گرایی رو رعایت کنید برای کد مناسب انتقال کفایت می کنه.
اگه بخواهید از اول روی این مسائل فکر کنید فقط وقت تون تلف میشه. به تدریج که استفاده تون ازش بیشتر شد و ایراداتش رو برطرف کردید و روال تکمیل شد، خود به خود به یک روال مناسب می رسید. ماژولی که شما می سازید بر اساس سلایق شما طراحی میشه و ماژولی که من میسازم بر اساس سلایق من، لازم نیست سلیقه شخص دیگری رو در طراحی ماژول خودتون بکار ببرید مگر وقتی در یک پروژه تیمی براتون الگو مشخص می کنند.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد
یه چیز دیگه نظرم رسید اینکه این متد و کلا روال هایی که به رابط کاربریِ پروژه مربوط میشن ، چون در پروژه های بعدی هم ممکنه مورد استفاده قرار بگیرن را ببرم توی یه کلاسِ شی گرایی (مثل تحت نام UI) بذارم .
هر چند الان فقط همین متد به این قضیه مربوط میشه اما احتمالا جلوتر که برم ، متدهای بیشتری مربوط به رابط کاربری برنامه نیاز دارم تا بسازم .
نظرتون چیه؟

بعد استاد ، اگه اشتباه نکنم گفته بودین اعضای استاتیک ، مصرف بیشتر از حافظه را دارن . درست میگم؟
اگه آره ، حدودا نمیدونین چند برابر بیشتر از اعضای غیر استاتیک هست (فرض کنید دو متد با بدنه ای کاملا یکسان که فقط یکی استاتیک هست و یکی دیگه نیست) ؟
چون بجای این متد LogicalTreeHelper.GetChildren ، پروپرتیِ شی گرایِ Window.LogicalChildren هست که همین کار را میکنه اما چون IEnumerator را برمیگردونه ، تبدیلش به List ، یه کم کد بیشتری میخواد که میخوام بدونم اگه تفاوت محسوسی (حتی در تعداد فراخونی های زیاد مثلا چند صد بار) نداره ، پس همون از متد LogicalTreeHelper.GetChildren استفاده کنم .

تشکر
 

the_king

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

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

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
پیشنهادی ندارم.


شگفتا، ابدا همچین مطلبی رو از من نشنیدید.

خیلی ممنون استاد .
یعنی هیچ تفاوتی از لحاظ ساختاری بین اعضای استاتیک و شی گرا نیست؟
از لحاظ سرعت دسترسی و اجرای کد و همچنین مصرف حافظه و سربار پردازنده و ...؟
پس فرقی نداره که از متد استاتیکِ LogicalTreeHelper.GetChildren یا پروپرتیِ شی گرایِ Window.LogicalChildren استفاده کنم؟

تشکر استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد .
یعنی هیچ تفاوتی از لحاظ ساختاری بین اعضای استاتیک و شی گرا نیست؟
نه. فرضا a فیلد static باشه و b فیلد غیر static، دیگه فرقی نمی کنه که اول در a یک مقدار قرار بدهید و کپی اش کنید در b یا اول در b یک متغیر قرار بدهید و بعد کپی اش کنید در a. ساختار مقدار که عوض نمیشه.

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

پس فرقی نداره که از متد استاتیکِ LogicalTreeHelper.GetChildren یا پروپرتیِ شی گرایِ Window.LogicalChildren استفاده کنم؟
از لحاظ کارکرد که هیچ فرقی نداره چون LogicalTreeHelper.GetChildren در واقع از همون پیاده سازی LogicalChildren در کلاس شیء میخواد که فرزندش رو معرفی کنه، دو روال متفاوت رو طی نمی کنند. اما این رجوع با واسطه به این معنا است که فرضا اگه این دو کد میلیون ها بار تکرار بشن در مجموع شاید یکی دو درصد Window.LogicalChildren سریعتر باشه، که در کل نامحسوسه و به حساب نمیاد.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلامی مجدد
خیلی ممنون استاد .
نه ، مبحث اون چنانی جایی نخوندم . فقط لینک زیر درباره ی رابطه ی اعضای استاتیک با Call و اعضای شی گرا با CallVir میگه که دقیق متوجه نشدم حالا مهم هم نیست (مهم این بود که گفتید از این لحاظ فرقی ندارن چون فکر میکردم که قبلا گفته بودید یه فرق هایی دارن اما اشتباه میکردم) :



--------------------------------------------------------------------


استاد ، در لینک زیر :


اون پایین میگه :

کد:
What happens when I run out of space?
Shadow copies for the volume are deleted, beginning with the oldest shadow copy.

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


الان اینی که میگه ، بخاطر اینه که حداکثر فضایی که برای vss برای یک درایو در نظر گرفته شد ، طرف اون درایو را بیشتر از این فضا پر میکنه ؟

یعنی مثلا درایوش 200 گیگابایت ظرفیت داره . و حداکثرِ فضایی که برای vss در اون درایو مد نظر میگیره ، 20 گیگابایت هست . 150 گیگابایت از این درایوش هم پر هست . و حالا 40 گیگابایت به اون درایو اضافه میکنه (که کلا 190 گیگابایت اش پر میشه) . در اینجا ، چون 10 گیگابایت از حداکثر فضایی که برای vss درون اون درایو تعیین کرده بود ، کم اومد ، باعث میشه که آخرین بکاپ یا کلا بکاپ هایی از vss اش اتوماتیک حذف بشه؟
این سناریو که گفتم برای حذف بکاپ درست هه؟ (طبق چیزی که اون لینک و اون نوشته میگه ، منظورش همچین چیزی هست)؟


یا اینکه فرض کنید همون درایوش 200 گیگ حجم داره . و باز هم حداکثرِ فضایی که برای vss در اون درایو مد نظر میگیره ، 20 گیگابایت هست . این بار ، 100 گیگابایت از اون درایوش پر هست و در این زمان که 100 گیگابایت از اون درایو پر هست ، یه بکاپِ vss میگیره . بعد از این (یعنی از این به بعد) ، تغییراتی که در این درایو انجام داد (یعنی فایل هایی را مثلا حذف کرد که درون بکاپ وجود داشت و همه ی اون اطلاعات اوررایت هم شد و بنابراین سرویس vss میخواد از اون میزان از تغییراتی که اتفاق افتاد ، بکاپ تهیه کنه تا اطلاعاتش از دست نره) ، فرض میکنیم که این تغییرات 40 گیگابایت بود .
حالا چون حداکثرِ فضایی که برای vss در اون درایو مد نظر گرفت ، 20 گیگابایت بود و میزانِ این تغییرات (ای که باعث اوررایت شدن اطلاعاتش شد) ، 40 گیگابایت بود ، پس در اینجا آخرین بکاپ ، اجبارا حذف میشه؟
منظور گفته و لینک بالا ، این سناریو هه؟ یا سناریوی بالا؟ یا هر دو سناریو؟


و یه چیز دیگه اینکه حجم بکاپِ جاریِ vss در یک درایو (منظورم حداکثرِ فضایی که برای vss در نظر گرفتیم ، نیست) ، همون چیزی هست که سرویس vss از اطلاعاتِ اون درایو ، بکاپ گرفته دیگه . درسته؟ (حالا اون اطلاعات میخواست به علت اینکه اطلاعاتِ حذف شده ، اوررایت شده باشن یا هر علت دیگه ای) . درسته؟
یعنی با تریس کردن و رهگیری کردنِ مدامِ حجم بکاپِ جاریِ vss در یک درایو و نزدیک شدنش به حداکثرِ حجم بکاپ vss در اون درایو ، متوجه بشیم که بکاپ در سناریوی دوم احتمال داره حذف بشه تا خودمون حداکثرِ حجم بکاپ vss در اون درایو را افزایش بدیم یا به کاربر هشدار بدیم . درست میگم؟
سناریو اول هم که هشدار دادن و متوجه شدنش ، آسونه .

ببخشید زیاد شد . تشکر استاد .
 

the_king

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



--------------------------------------------------------------------


استاد ، در لینک زیر :


اون پایین میگه :

کد:
What happens when I run out of space?
Shadow copies for the volume are deleted, beginning with the oldest shadow copy.

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


الان اینی که میگه ، بخاطر اینه که حداکثر فضایی که برای vss برای یک درایو در نظر گرفته شد ، طرف اون درایو را بیشتر از این فضا پر میکنه ؟
نه مستقیما، وقتی بیشتر درایو پر میشه ممکنه اجرای خودکار Disk Cleanup اون backup ها رو پاک کنه.
اما این مطلب مربوط به پر شدن هارد دیسک نیست، مربوط به خود اون فضای حداکثری است که به Shadow copies اختصاص پیدا کرده، اگه بخواد backup جدیدی بسازه و دیگه فضای کافی برایش نباشه backup های قدیمی تر رو پاک می کنه. کاری به این نداره که نصف هارد دیسک خالی هست یا نه. قرار نیست از اون فضای حداکثری فراتر بره.


یعنی مثلا درایوش 200 گیگابایت ظرفیت داره . و حداکثرِ فضایی که برای vss در اون درایو مد نظر میگیره ، 20 گیگابایت هست . 150 گیگابایت از این درایوش هم پر هست . و حالا 40 گیگابایت به اون درایو اضافه میکنه (که کلا 190 گیگابایت اش پر میشه) . در اینجا ، چون 10 گیگابایت از حداکثر فضایی که برای vss درون اون درایو تعیین کرده بود ، کم اومد ، باعث میشه که آخرین بکاپ یا کلا بکاپ هایی از vss اش اتوماتیک حذف بشه؟
این سناریو که گفتم برای حذف بکاپ درست هه؟ (طبق چیزی که اون لینک و اون نوشته میگه ، منظورش همچین چیزی هست)؟
احتمالا نه، حداقل نه به این خاطر که هارد دیسک پر شده. اما اگر بخواد backup جدیدی بسازه و جا برایش نباشه backup های قدیمی رو پاک می کنه.

یا اینکه فرض کنید همون درایوش 200 گیگ حجم داره . و باز هم حداکثرِ فضایی که برای vss در اون درایو مد نظر میگیره ، 20 گیگابایت هست . این بار ، 100 گیگابایت از اون درایوش پر هست و در این زمان که 100 گیگابایت از اون درایو پر هست ، یه بکاپِ vss میگیره . بعد از این (یعنی از این به بعد) ، تغییراتی که در این درایو انجام داد (یعنی فایل هایی را مثلا حذف کرد که درون بکاپ وجود داشت و همه ی اون اطلاعات اوررایت هم شد و بنابراین سرویس vss میخواد از اون میزان از تغییراتی که اتفاق افتاد ، بکاپ تهیه کنه تا اطلاعاتش از دست نره) ، فرض میکنیم که این تغییرات 40 گیگابایت بود .
حالا چون حداکثرِ فضایی که برای vss در اون درایو مد نظر گرفت ، 20 گیگابایت بود و میزانِ این تغییرات (ای که باعث اوررایت شدن اطلاعاتش شد) ، 40 گیگابایت بود ، پس در اینجا آخرین بکاپ ، اجبارا حذف میشه؟
منظور گفته و لینک بالا ، این سناریو هه؟ یا سناریوی بالا؟ یا هر دو سناریو؟
backup ای که بخواد 40 گیگابایت تغییرات رو در نظر بگیره طبعا در فضای 20 گیگابایتی ایجاد شدنی نیست، نهایتش 20 گیگابایت ذخیره میشه و بخاطرش backup های قبلی پاک میشن.

و یه چیز دیگه اینکه حجم بکاپِ جاریِ vss در یک درایو (منظورم حداکثرِ فضایی که برای vss در نظر گرفتیم ، نیست) ، همون چیزی هست که سرویس vss از اطلاعاتِ اون درایو ، بکاپ گرفته دیگه . درسته؟ (حالا اون اطلاعات میخواست به علت اینکه اطلاعاتِ حذف شده ، اوررایت شده باشن یا هر علت دیگه ای) . درسته؟
یعنی با تریس کردن و رهگیری کردنِ مدامِ حجم بکاپِ جاریِ vss در یک درایو و نزدیک شدنش به حداکثرِ حجم بکاپ vss در اون درایو ، متوجه بشیم که بکاپ در سناریوی دوم احتمال داره حذف بشه تا خودمون حداکثرِ حجم بکاپ vss در اون درایو را افزایش بدیم یا به کاربر هشدار بدیم . درست میگم؟
سناریو اول هم که هشدار دادن و متوجه شدنش ، آسونه .
ایده خوبی نیست اما یک نرم افزار میتونه بابت هر شرایط دلخواهی هشدار بده.
ارتباط مستقیمی بین ظرفیت باقی مونده و مقدار احتمالاتی که میگید وجود نداره، از طرف دیگه افزایش ظرفیت هم تضمین کننده بقای backup ها نیست.
نرم افزاری ممکنه روزی چند بار هشدار بده که فقط ده درصد از فضای درایو SSD خالی مونده، اما نمی تونه پیش بینی کنه که اون فضا کی پر میشه، یه ساعت دیگه یا یک سال دیگه.
در ضمن کاربر اگه نگران حذف شدن backup ها باشه که از VSS استفاده نمی کنه، VSS که سیستم مناسبی برای حفاظت از اطلاعات حیاتی کاربر نیست.
بجای اینکار بهتره به همچین کاربری پیشنهاد کنید که از پشتیبانگیری دوره ای با یک نرم افزار مناسب و روی دیسک سیار مجزا استفاده کنه.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
نه مستقیما، وقتی بیشتر درایو پر میشه ممکنه اجرای خودکار Disk Cleanup اون backup ها رو پاک کنه.
اما این مطلب مربوط به پر شدن هارد دیسک نیست، مربوط به خود اون فضای حداکثری است که به Shadow copies اختصاص پیدا کرده، اگه بخواد backup جدیدی بسازه و دیگه فضای کافی برایش نباشه backup های قدیمی تر رو پاک می کنه. کاری به این نداره که نصف هارد دیسک خالی هست یا نه. قرار نیست از اون فضای حداکثری فراتر بره.



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


backup ای که بخواد 40 گیگابایت تغییرات رو در نظر بگیره طبعا در فضای 20 گیگابایتی ایجاد شدنی نیست، نهایتش 20 گیگابایت ذخیره میشه و بخاطرش backup های قبلی پاک میشن.


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

خیلی ممنون استاد .
ولی من هنوز دقیق متوجه نشدم که منظورِ اون متن (در لینک مایکروسافت) ، منظورش از فضا ، چه فضایی بود؟
و همچنین دقیقا چه سناریویی هست (مثلا ، مثالش چی میشه) ؟

البته طبق توضیحات خطوط بالا در همون سایت ، فکر کنم منظورش از فضا ، حداکثرِ فضای ذخیره سازی بکاپ باشه (نه فضای جاری ای که بکاپ اون مقدار از فضا را مصرف کرد) . نمیدونم درست متوجه شدم اینو یا نه؟

تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
سلام
استاد ، چجوری میشه در یه اعداد اعشاری ، فلان مقدار اعدادِ بعد از اعشار را بدون رند کردن ، دریافت کرد؟
مثلا اگه عدد 5.982465 داریم :
اگه 0 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5
و اگه 1 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.9
و اگه 2 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.98
و اگه 3 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.982
و اگه 4 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.9824 و ... را برگردونه .

مثلا کد زیر را نوشتم :

کد:
            double abc = 5.982465;
            string text = abc.ToString("N0");
            MessageBox.Show(text);

این کد ، گاها عدد را رند میکنه و همون عدد را تحویل نمیده . مثلا در بالا ، عدد 6 را تحویل میده .
یا وقتی کد abc.ToString("N4"); را مینویسم ، عددِ 5.9825 را که عددِ رند شده هست را برمیگردونه .
آیا جوری میشه کرد که دقیقا همون عدد را برگردونه بدون اینکه رند کنه؟

تشکر استاد .
 

the_king

مدیرکل انجمن
سلام
استاد ، چجوری میشه در یه اعداد اعشاری ، فلان مقدار اعدادِ بعد از اعشار را بدون رند کردن ، دریافت کرد؟
مثلا اگه عدد 5.982465 داریم :
اگه 0 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5
و اگه 1 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.9
و اگه 2 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.98
و اگه 3 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.982
و اگه 4 عدد بعد از اعشار را خواستیم ، بهمون عددِ 5.9824 و ... را برگردونه .

مثلا کد زیر را نوشتم :

کد:
            double abc = 5.982465;
            string text = abc.ToString("N0");
            MessageBox.Show(text);

این کد ، گاها عدد را رند میکنه و همون عدد را تحویل نمیده . مثلا در بالا ، عدد 6 را تحویل میده .
یا وقتی کد abc.ToString("N4"); را مینویسم ، عددِ 5.9825 را که عددِ رند شده هست را برمیگردونه .
آیا جوری میشه کرد که دقیقا همون عدد را برگردونه بدون اینکه رند کنه؟
C#:
        private string Truncated(double value, int digit)
        {
            var exp = Math.Pow(10, digit);
            return (Math.Truncate(value * exp) / exp).ToString("N" + digit);
        }
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
آها خیلی ممنون استاد . :rose:
ولی هنوز متوجه نشدم که چرا format ئه متد ToString ، گاها خودِ همون چیزی که میخواستیم را برمیگردوند و گاها عدد را رند میکرد (در مثالی که زده بودم) .

تشکر استاد .
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
C#:
        private string Truncated(double value, int digit)
        {
            var exp = Math.Pow(10, digit);
            return (Math.Truncate(value * exp) / exp).ToString("N" + digit);
        }

آها خیلی ممنون استاد . :rose:
ولی هنوز متوجه نشدم که چرا format ئه متد ToString ، گاها خودِ همون چیزی که میخواستیم را برمیگردوند و گاها عدد را رند میکرد (در مثالی که زده بودم) .

--------------------------------------

ویرایش :

استاد ، تفاوت دو کد زیر چیه که در کد اول :

C#:
            CultureInfo ci = CultureInfo.CreateSpecificCulture(Thread.CurrentThread.CurrentCulture.Name);
            ci.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
            Thread.CurrentThread.CurrentCulture = ci;

میشه CurrentCulture ئه CurrentThread را تغییر داد اما در کد زیر :

C#:
 CultureInfo.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;

ارورِ read only میده .
در کد دوم ، یعنی نمیشه NumberFormat ئه CurrentCulture را تغییر داد؟
بخاطر اینکه CurrentCulture ، فقط readonly هست؟ بخاطر اینه؟
اگه آره ، پس CurrentThread در کد اول هم readonly هه . پس چرا CurrentCulture اش را میشه تغییر داد؟

تشکر استاد .
 
آخرین ویرایش:

the_king

مدیرکل انجمن
آها خیلی ممنون استاد . :rose:
ولی هنوز متوجه نشدم که چرا format ئه متد ToString ، گاها خودِ همون چیزی که میخواستیم را برمیگردوند و گاها عدد را رند میکرد (در مثالی که زده بودم) .

تشکر استاد .
چرا میگید گاهی؟ گاهی نداره، گرد کردنش روال عادیشه، توضیحاتش رو بخونید و ببینید چی نوشته :
When precision specifier controls the number of fractional digits in the result string, the result string reflects a number that is rounded to a representable result nearest to the infinitely precise result.​


استاد ، تفاوت دو کد زیر چیه که در کد اول :

C#:
            CultureInfo ci = CultureInfo.CreateSpecificCulture(Thread.CurrentThread.CurrentCulture.Name);
            ci.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
            Thread.CurrentThread.CurrentCulture = ci;

میشه CurrentCulture ئه CurrentThread را تغییر داد اما در کد زیر :

C#:
 CultureInfo.CurrentCulture.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;

ارورِ read only میده .
در کد دوم ، یعنی نمیشه NumberFormat ئه CurrentCulture را تغییر داد؟
بخاطر اینکه CurrentCulture ، فقط readonly هست؟ بخاطر اینه؟
اگه آره ، پس CurrentThread در کد اول هم readonly هه . پس چرا CurrentCulture اش را میشه تغییر داد؟
به خود مشخصه CurrentCulture ربطی نداره، مربوط به CultureInfo ئه.
یکسری ساختار ها یک عضو داخلی دارند که مشخص می کنه که این شیء که حالا به طریقی ایجاد شده readonly هست یا نه.
یعنی ساختار ئه میتونه اشیاء قابل ویرایش یا غیر قابل ویرایش بسازه.
اگه شیء توسط روال هایی تولید شده باشه که اشیاء readonly ایجاد می کنه، اون عضو true میشه و مشخصه ها موقع تغییر مقدار جلوی این تغییر رو می گیرند.
مثلا System.Collections.IList یا System.Text.Encoding این عضو رو دارند.
فرضا توضیحات CultureInfo.GetCultureInfo رو بخونید، داره میگه A read-only instance of a culture رو بر میگردونه، یعنی شیء ای نیست که بخواهید بعدا ویرایش کنید و مشخصاتش رو تغییر بدهید، قابل ویرایش نیست.
اما فرضا توضیحات CultureInfo.Clone رو بخونید، بهتون یک شیء writable تحویل میده، یعنی می توانید از یک شیء readonly یک کپی قابل ویرایش بگیرید تا نسخه کپی رو تغییر بدهید.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون استاد :rose:
استاد ، میگم درباره ی thread safe که قبلا هم صحبت کردیم و در اون تاپیک هم الان صحبتش را برای دوستمون کردین ، یونیتی ، یه چیزی به نام Job System داره . توی سایتش که توضیحاتش را خوندم ، چیزِ دقیقی متوجه نشدم . یه چیزهایی فهمیدم که میگه مثلا وقتی میخواد اطلاعات را از نخی به نخ دیگه ای بفرسته ، بجای اینکه reference اش را بفرسته ، یه کپی از اون اطلاعات را میفرسته (اگه چیزی که فهمیدم ، درست باشه) .
ولی در توضیحِ این سایت زیر درباره ی Job System ئه یونیتی ، نوشته :

کد:
Overall, it allows you to run processes over multiple cores safely and simply, without worrying about race conditions, deadlocks and other issues that usually arise.


اونجایی که میگه بصورت safely ، چندین پروسه و نخ را اجرا میکنه ، به این معناست که مثلا میتونه چندین شیِ بصری را در چندین نخ ، اجرا کنه (بدون اینکه شیِ بصری را در نخِ اصلی Invoke و فراخوانی کنه) ؟
منظورشون اینه؟
اگه آره ، پس چرا مایکروسافت همچنان از thread safe در نخ اصلی اش استفاده نمیکنه و مجبوریم کنترل های بصری را در همون نخِ اصلی (ای که window یا form مون ایجاد شده بود) ، اجرا و فراخونی کنیم؟
اگه این درست باشه ، یعنی این محدودیت سیستم عامل نیست که برای نخ اصلی اش thread safe نذاره . محدودیتی هه که ویژال استودیو گذاشت .
اگه نیاز به تکنولوژی خاص داره ، نهایتا برای آسونیِ کار ، مایکروسافت چرا یونیتی را نمیخره یا خودش که ویندوز را درست کرد ، همچین تکنولوژی ای را نمیسازه؟

تشکر استاد .
 

the_king

مدیرکل انجمن
استاد ، میگم درباره ی thread safe که قبلا هم صحبت کردیم و در اون تاپیک هم الان صحبتش را برای دوستمون کردین ، یونیتی ، یه چیزی به نام Job System داره . توی سایتش که توضیحاتش را خوندم ، چیزِ دقیقی متوجه نشدم . یه چیزهایی فهمیدم که میگه مثلا وقتی میخواد اطلاعات را از نخی به نخ دیگه ای بفرسته ، بجای اینکه reference اش را بفرسته ، یه کپی از اون اطلاعات را میفرسته (اگه چیزی که فهمیدم ، درست باشه) .
طبق توضیحات لینکی که درج کردید از دو شیوه متفاوت استفاده می کنه، یکی value type هایی است که مقدارشون همونطور که گفتید میتونه برای هر نخ کپی بشه و در واقع اشتراک داده نیست، تکثیر داده است، و دومی NativeContainer ئه که یک فضای اشتراکی برای نگهداری اشتراکی داده ها است که شامل reference type ها هم میتونه باشه که thread safe طراحی شده.

ولی در توضیحِ این سایت زیر درباره ی Job System ئه یونیتی ، نوشته :

کد:
Overall, it allows you to run processes over multiple cores safely and simply, without worrying about race conditions, deadlocks and other issues that usually arise.


اونجایی که میگه بصورت safely ، چندین پروسه و نخ را اجرا میکنه ، به این معناست که مثلا میتونه چندین شیِ بصری را در چندین نخ ، اجرا کنه (بدون اینکه شیِ بصری را در نخِ اصلی Invoke و فراخوانی کنه) ؟
منظورشون اینه؟
نمیدونم اجرای شیء بصری از نظر شما به چه معنا است اما صحبت اشتراک داده است، نه اجرا. اینکه Button در چندین نخ اجرا بشه چه معنی داره؟ مثلا در یک نخ MouseDown بشه و در نخ دیگری MouseUp بشه و در نخ دیگری Paint بشه؟ بی معنیه، چیزی که صحبتش هست اشتراک داده است، مثلا اینکه به Button.Enabled در چندین نخ دسترسی داشته باشید، این اجرای اشتراکی نیست، دسترسی اشتراکی به داده است.

اولا شیء هر چیزی که هست همزمان مورد دسترسی قرار نمی گیره مگر اینکه اون دسترسی همزمان تداخلی ایجاد نکنه. ثانیا این دسترسی اشتراکی فقط در صورتی عملی است که از اون Native Container استفاده بشه.
a *= 4 و a += 5 که نمی توانند همزمان اجرا بشن، بالاخره یکی شون باید اول انجام بشه و تا تموم شدنش هیچ دسترسی اشتراکی صورت نمی گیره و بعد دومی میتونه انجام بشه.
Native Container نمی تونه کاری بکنه که a * = 4 و a += 5 همزمان انجام بشن،
یا نمی تونه کاری کنه که Button.Enabled = true و Button.Enabled = false همزمان انجام بشن، یکی شون باید زودتر از اون یکی انجام بشه.
هیچ معجزه ای رخ نمیده که اینها همزمان باشن. توضیحات کلاس Interlocked رو بخونید، یک مثال از اینجور راه کار های دسترسی اشتراکی ئه.
ساختار SpinLock رو ببینید، از اساس thread safe ئه. اینها هیچکدوم باعث نمیشه که یک دسترسی اشتراکی که نیاز به انحصار متقابل داره همزمان صورت بگیره، همیشه یکی شون منتظر اتمام اجرای اون یکی میمونه.

اگه آره ، پس چرا مایکروسافت همچنان از thread safe در نخ اصلی اش استفاده نمیکنه و مجبوریم کنترل های بصری را در همون نخِ اصلی (ای که window یا form مون ایجاد شده بود) ، اجرا و فراخونی کنیم؟
کنترل های ویندوز فقط داده نیستند، Button.Enabled فقط یک boolean نیست که عوضش کنید، باید بر اساس تغییر مقدارش کار هایی انجام بده، تغییر رفتار داشته باشه، تغییر یک مقدار روی سایر اجزاء میتونه تاثیر بذاره.
سیستم ویندوز هم event driven ئه، رخداد گرا است، داده های پنجره از طریق تبادل پیام بدست میاد، شما نمی توانید Button.Enabled رو تغییر بدهید مگر اینکه به نخ صاحب اون پنجره Button پیام بدهید و جواب بگیرید. اینجا فقط صحبت اشتراک داده نیست، باید با یک نخ در ارتباط باشید.
توضیحات EnableWindow و WM_CANCELMODE و WM_ENABLE رو بخونید، فقط تغییر یک داده boolean که نیست.

اگه این درست باشه ، یعنی این محدودیت سیستم عامل نیست که برای نخ اصلی اش thread safe نذاره . محدودیتی هه که ویژال استودیو گذاشت .
اگه نیاز به تکنولوژی خاص داره ، نهایتا برای آسونیِ کار ، مایکروسافت چرا یونیتی را نمیخره یا خودش که ویندوز را درست کرد ، همچین تکنولوژی ای را نمیسازه؟
از اساس اشتباهه، نه پیشفرض و نه استدلال و نه نتیجه گیری هیچکدوم درست نیستند.
تاریخ ارائه Component Object Model (COM) و Visual Basic 5/6 رو بررسی کنید، ببینید صحبت چند سال پیشه، اینها اون موقع هم تکنولوژی هایی thread safe از مایکروسافت بودند اما کنترل های ویندوز thread unsafe بودند و همچنان هستند، اصلا ربطی به دلیل thread unsafe بودن کنترل ها نداره که بگید مایکروسافت باید چیزی میخرید یا تکنولوژی ای طراحی می کرد تا کنترل ها thread safe باشن.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
طبق توضیحات لینکی که درج کردید از دو شیوه متفاوت استفاده می کنه، یکی value type هایی است که مقدارشون همونطور که گفتید میتونه برای هر نخ کپی بشه و در واقع اشتراک داده نیست، تکثیر داده است، و دومی NativeContainer ئه که یک فضای اشتراکی برای نگهداری اشتراکی داده ها است که شامل reference type ها هم میتونه باشه که thread safe طراحی شده.


نمیدونم اجرای شیء بصری از نظر شما به چه معنا است اما صحبت اشتراک داده است، نه اجرا. اینکه Button در چندین نخ اجرا بشه چه معنی داره؟ مثلا در یک نخ MouseDown بشه و در نخ دیگری MouseUp بشه و در نخ دیگری Paint بشه؟ بی معنیه، چیزی که صحبتش هست اشتراک داده است، مثلا اینکه به Button.Enabled در چندین نخ دسترسی داشته باشید، این اجرای اشتراکی نیست، دسترسی اشتراکی به داده است.

اولا شیء هر چیزی که هست همزمان مورد دسترسی قرار نمی گیره مگر اینکه اون دسترسی همزمان تداخلی ایجاد نکنه. ثانیا این دسترسی اشتراکی فقط در صورتی عملی است که از اون Native Container استفاده بشه.
a *= 4 و a += 5 که نمی توانند همزمان اجرا بشن، بالاخره یکی شون باید اول انجام بشه و تا تموم شدنش هیچ دسترسی اشتراکی صورت نمی گیره و بعد دومی میتونه انجام بشه.
Native Container نمی تونه کاری بکنه که a * = 4 و a += 5 همزمان انجام بشن،
یا نمی تونه کاری کنه که Button.Enabled = true و Button.Enabled = false همزمان انجام بشن، یکی شون باید زودتر از اون یکی انجام بشه.
هیچ معجزه ای رخ نمیده که اینها همزمان باشن. توضیحات کلاس Interlocked رو بخونید، یک مثال از اینجور راه کار های دسترسی اشتراکی ئه.
ساختار SpinLock رو ببینید، از اساس thread safe ئه. اینها هیچکدوم باعث نمیشه که یک دسترسی اشتراکی که نیاز به انحصار متقابل داره همزمان صورت بگیره، همیشه یکی شون منتظر اتمام اجرای اون یکی میمونه.


کنترل های ویندوز فقط داده نیستند، Button.Enabled فقط یک boolean نیست که عوضش کنید، باید بر اساس تغییر مقدارش کار هایی انجام بده، تغییر رفتار داشته باشه، تغییر یک مقدار روی سایر اجزاء میتونه تاثیر بذاره.
سیستم ویندوز هم event driven ئه، رخداد گرا است، داده های پنجره از طریق تبادل پیام بدست میاد، شما نمی توانید Button.Enabled رو تغییر بدهید مگر اینکه به نخ صاحب اون پنجره Button پیام بدهید و جواب بگیرید. اینجا فقط صحبت اشتراک داده نیست، باید با یک نخ در ارتباط باشید.
توضیحات EnableWindow و WM_CANCELMODE و WM_ENABLE رو بخونید، فقط تغییر یک داده boolean که نیست.


از اساس اشتباهه، نه پیشفرض و نه استدلال و نه نتیجه گیری هیچکدوم درست نیستند.
تاریخ ارائه Component Object Model (COM) و Visual Basic 5/6 رو بررسی کنید، ببینید صحبت چند سال پیشه، اینها اون موقع هم تکنولوژی هایی thread safe از مایکروسافت بودند اما کنترل های ویندوز thread unsafe بودند و همچنان هستند، اصلا ربطی به دلیل thread unsafe بودن کنترل ها نداره که بگید مایکروسافت باید چیزی میخرید یا تکنولوژی ای طراحی می کرد تا کنترل ها thread safe باشن.

خیلی ممنون استاد از توضیح مفصل تون :rose:
الان ببینید ، یعنی در عکس زیر که در همون لینک ، این بازی را نوشت ، این همه ماهی را در یک نخ رندر میکنه (نخ اصلی) یا در نخ های خودش (یعنی در چندین نخ) ، بصورت مجزا چندین ماهی را رندر میکنه؟ :

12_5000Fish.gif


چون من از بازی سازی چیزی نمیدونم ، کدهاش رو خوب نگاه نکردم اما در نگاه اجمالی ، چیز خاصی از تعداد نخ ها متوجه نشدم (البته میگه که بجای نخ ، از Job System استفاده میکنه) .
اگه همه را فقط توی یه نخ رسم میکنه ، که هیچ . اما اگه در چندین نخ رندرِ این ماهی ها صورت میگیره ، پس چرا مایکروسافت نمیتونه رندرِ شیِ بصری (مثل دکمه و ...) در سی شارپ را این طور کنه؟
منظورم اینه .
تشکر استاد .
 

the_king

مدیرکل انجمن
خیلی ممنون استاد از توضیح مفصل تون :rose:
الان ببینید ، یعنی در عکس زیر که در همون لینک ، این بازی را نوشت ، این همه ماهی را در یک نخ رندر میکنه (نخ اصلی) یا در نخ های خودش (یعنی در چندین نخ) ، بصورت مجزا چندین ماهی را رندر میکنه؟ :

12_5000Fish.gif


چون من از بازی سازی چیزی نمیدونم ، کدهاش رو خوب نگاه نکردم اما در نگاه اجمالی ، چیز خاصی از تعداد نخ ها متوجه نشدم (البته میگه که بجای نخ ، از Job System استفاده میکنه) .
اگه همه را فقط توی یه نخ رسم میکنه ، که هیچ . اما اگه در چندین نخ رندرِ این ماهی ها صورت میگیره ، پس چرا مایکروسافت نمیتونه رندرِ شیِ بصری (مثل دکمه و ...) در سی شارپ را این طور کنه؟
منظورم اینه .
تشکر استاد .
رسم کننده یک نخ ئه، همچین پردازش سنگینی هم نداره، دو نخ بودنش کمکی نمی کنه.
هیچ سیستمی برای رسم در یک ناحیه مشترک نخ های مجزا رو بصورت همزمان بکار نمی بره، چون بجای اینکه تقسیم وظایف بشه و کارایی افزایش پیدا کنه دوباره کاری میشه و کارایی رو کاهش میده. انگار دو نفر بخوان با یک مداد بنویسند. اصول رندر بلادرنگ و رسم اینجوریه که یک یا چند نخ در یک حافظه تصویری رندر رو ایجاد می کنند (یا در چند حافظه لایه ای رندر های مستقلی رو انجام میدهند که بعدا توسط یک روالی لایه ها با هم ترکیب میشه) و یک نخ هم که مسئول رسم کردنه در فواصل زمانی مشخصی این حافظه تصویری رو به سیستم گرافیکی منتقل می کنه. حتی در تکنولوژی هایی مثل SLI و CrossFire هم که بصورت سخت افزاری موازی سازی میشه، ناحیه رسم شون مشترک نیست، یا فریم های مجزا است یا فریم مشترک به ناحیه های مجزا تقسیم شده.
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
رسم کننده یک نخ ئه، همچین پردازش سنگینی هم نداره، دو نخ بودنش کمکی نمی کنه.
هیچ سیستمی برای رسم در یک ناحیه مشترک نخ های مجزا رو بصورت همزمان بکار نمی بره، چون بجای اینکه تقسیم وظایف بشه و کارایی افزایش پیدا کنه دوباره کاری میشه و کارایی رو کاهش میده. انگار دو نفر بخوان با یک مداد بنویسند. اصول رندر بلادرنگ و رسم اینجوریه که یک یا چند نخ در یک حافظه تصویری رندر رو ایجاد می کنند (یا در چند حافظه لایه ای رندر های مستقلی رو انجام میدهند که بعدا توسط یک روالی لایه ها با هم ترکیب میشه) و یک نخ هم که مسئول رسم کردنه در فواصل زمانی مشخصی این حافظه تصویری رو به سیستم گرافیکی منتقل می کنه. حتی در تکنولوژی هایی مثل SLI و CrossFire هم که بصورت سخت افزاری موازی سازی میشه، ناحیه رسم شون مشترک نیست، یا فریم های مجزا است یا فریم مشترک به ناحیه های مجزا تقسیم شده.


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

مثلا استاد ، بذارید یه بازی ای را نام ببرم تا درکش راحت تر باشه برام .
مثلا در بازی های هواپیمایی مثل hawx ، وقتی یه هواپیمایی را کنترل میکنیم و روی اون هواپیما ، موشکِ چهارتایی (که قابلیت همزمان شلیک 4 موشک هوا به هوا را دارن) را انتخاب و به سمت هواپیماهای دشمن شلیک میکنیم ، آیا این طوره که از زمانی که این 4 تا موشک که همزمان شلیک شدن ، در لحظه ی شلیک ، در برنامه ، 4 تا نخ ساخته میشه برای کنترل شون تا اینکه موشک یا برخورد نه به هدف یا کلا دیگه عمرش تمام بشه ؟

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

اما باز هم خیلی سئوالات هست که برام وجود داره و از اونجایی که خیلی از مطالب درباره ی گرافیک و کلیات گرافیک را هم نمیدونم ، حتی سئوال هایی هست که نمیدونم اون سئوالات چی هستن .



------------------------------------------------------------------


استاد ، میگم قراره یه پلتفرم جدید برای .net 6 (انگار برای سال بعد یا نهایتا دو سال دیگه) دربیاد بنام .Net MAUI که مخفف Multi Application UI هست .
اگه اشتباه متوجه نشده باشم ، این ، در واقع جایگزینی برای Xamarin.Form هست منتها Xamarin.Form از mono استفاده میکنه اما MAUI از .net 6 استفاده میکنه . و حالا ویژگی های دیگه ی دیگه ای که برای این پلتفرم در نظر گرفتن .
درست میگم؟


کلا میخواستم بگم که چرا حالا که .net core ساخته شد ، چرا بجای mono ، از .net core استفاده نمیکنن که انگار قصد دارن در آینده این کار را کنن .
حالا خوبی های .net core در مقابل mono را نمیدونم .
اما باز سئوال پیش میاد که چرا این برنامه را برای Xamarin.Form فقط میخوان اجرا کنن؟
چرا روی Xamarin.Android اجرا نمیکنن و روی .net منتقلش کنن؟
انگار مایکروسافت تمرکزش را مخصوصا وقتی مدیر عامل جدیدش اومد روی این گذاشت که سیستم عامل و برنامه نویسی و چهارچوبش را روی کاربردها بر روی چندین سیستم عامل متمرکز کنه . و انگار هم بر همین اساس .net core و .net و سیستم عامل windows core os و اینها را داره توسعه میده .


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

ببخشید زیاد شد .
تشکر استاد :rose:
 

the_king

مدیرکل انجمن
سلامی مجدد
خیلی ممنون استاد
استاد ، من زیاد درباره ی حوزه ی گرافیک و اینها چیزی نمیدونم . هر چند حدودا یه چیزهایی که گفتین را متوجه شدم اما بخاطر اشراف نداشتن ، دقیق نه .
روال کلی رسم در برنامه های کامپیوتری ، کلا چجوری هه؟ (کلیاتش مد نظرمه نه جزئیاتش) .
اشیاء بصری یکسری داده دارن، چه دو بعدی و چه سه بعدی، چه Bitmap و چه Vector، اون داده ها توسط رندر کننده در حافظه تصویری مشخصی رندر میشه، حالا با یک نخ یا چند نخ. بعد اون حافظه تصویری با نرخ فریم ثابت یا متغیر به حافظه کارت گرافیکی منتقل میشه تا نمایش بروز بشه. ممکنه رندر کننده GDI باشه، +GDI باشه، DirectX باشه و ...
اون بخش انتقال حافظه تصویری به حافظه کارت گرافیکی هم درایور کارت گرافیکی انجام میده.

این روال رسم برنامه ها ، در بازی ها که متفاوت نیست . درسته؟
اساس کار یکی ئه، اما طبعا در بازی هم رندر کننده و هم روال نمایش متفاوت ئه.
تا کدوم قسمت از کار رو پردازنده انجام میده و کدوم بخش را کارت گرافیک؟
کارت گرافیکی در هر جایی که به درایور کارت گرافیکی رجوع بشه نقش داره، بستگی به کدی داره که نوشته شده، الزاما هم کاری که با پردازنده کارت گرافیکی انجام میشه ربطی به نمایش نداره، ممکنه نقش محاسباتی داشته باشه.
البته نمیدونم در تاپیک معماری پردازنده بگم یا اینجا (که بحث برنامه هم هست) .
مثلا استاد ، بذارید یه بازی ای را نام ببرم تا درکش راحت تر باشه برام .
مثلا در بازی های هواپیمایی مثل hawx ، وقتی یه هواپیمایی را کنترل میکنیم و روی اون هواپیما ، موشکِ چهارتایی (که قابلیت همزمان شلیک 4 موشک هوا به هوا را دارن) را انتخاب و به سمت هواپیماهای دشمن شلیک میکنیم ، آیا این طوره که از زمانی که این 4 تا موشک که همزمان شلیک شدن ، در لحظه ی شلیک ، در برنامه ، 4 تا نخ ساخته میشه برای کنترل شون تا اینکه موشک یا برخورد نه به هدف یا کلا دیگه عمرش تمام بشه ؟
نیازی نیست که چهار تا نخ باشه، در هر ثانیه تعدادی فریم نمایشی هست، فرض کنیم 120 فریم در ثانیه، بیشتر که نیست. پردازنده همینکه بتونه در فاصله بین هر دو فریم همه پردازش های فریم بعدی رو به موقع انجام بده کفایت می کنه، لازم نیست برای کاری که میتونه در یک نخ بموقع انجام بده چندین نخ بسازه. فرضا در Lemmings با در نظر گرفتن سخت افزار اون زمان در هر فریم باید موقعیت و وضعیت و تاثیر حدود پنجاه تا کاراکتر رو تعیین کنه، که در یک حلقه به سادگی انجام میشه. نمیاد پنجاه تا نخ بسازه.
بعد هم cpu میاد منطقش را فقط پردازش میکنه نه گرافیکش را .
نه الزاما. بستگی به کد رسم و قابلیت های درایور داره.
یعنی اون نخ ها ، سرعت موشک ، سمت موشک (چون هدفش مدام در حال تغییر هست) و از این دست محاسبات را به پردازنده برای اجرا ارائه میکنن .
تا اینجا را درست گفتم؟
بستگی به کد داره، ممکنه از پردازنده کارت گرافیکی کمک بگیره.
بعد هم پردازنده بعد از این محاسبات ، روال کارت گرافیک را برای ترسیمات ، فراخونی میکنه . کارت گرافیک هم برخلاف cpu ، برای رسم ، هر بخش از تصویر را میشه گفت به تعداد پردازنده هایی که داره تقسیم میکنه برای رسم کردن . یعنی اگه 200 هسته داره ، تصویری که قراره رسم کنه را به 200 بخشِ مساوی تقسیم میکنه و رسم میکنه .
به شرطی که رندر کننده از قابلیت های کارت گرافیکی به خوبی استفاده کنه.
درسته؟
اگه آره ، برای ترسیمات کنترل های بصری در برنامه ها هم همینطوره؟
خود به خود اتفاقی نمی افته، فرضا GDI کاری به قابلیت های پیشرفته کارت گرافیکی نداره. از قوی ترین کارت گرافیکی ها هم در سطح حداقلی استفاده میکنه. اینکه کارت گرافیکی چه قدرتی داره وقتی اهمیت پیدا می کنه که کدی باشه که ازش استفاده مفید بکنه.
استاد ، میگم قراره یه پلتفرم جدید برای .net 6 (انگار برای سال بعد یا نهایتا دو سال دیگه) دربیاد بنام .Net MAUI که مخفف Multi Application UI هست .
اگه اشتباه متوجه نشده باشم ، این ، در واقع جایگزینی برای Xamarin.Form هست منتها Xamarin.Form از mono استفاده میکنه اما MAUI از .net 6 استفاده میکنه . و حالا ویژگی های دیگه ی دیگه ای که برای این پلتفرم در نظر گرفتن .
درست میگم؟
اطلاعی ندارم. هر وقت اومد معلوم میشه.
کلا میخواستم بگم که چرا حالا که .net core ساخته شد ، چرا بجای mono ، از .net core استفاده نمیکنن که انگار قصد دارن در آینده این کار را کنن .
حالا خوبی های .net core در مقابل mono را نمیدونم .
اما باز سئوال پیش میاد که چرا این برنامه را برای Xamarin.Form فقط میخوان اجرا کنن؟
چرا روی Xamarin.Android اجرا نمیکنن و روی .net منتقلش کنن؟
انگار مایکروسافت تمرکزش را مخصوصا وقتی مدیر عامل جدیدش اومد روی این گذاشت که سیستم عامل و برنامه نویسی و چهارچوبش را روی کاربردها بر روی چندین سیستم عامل متمرکز کنه . و انگار هم بر همین اساس .net core و .net و سیستم عامل windows core os و اینها را داره توسعه میده .
وقتی چیزی free & open source باشه دیگه وظیفه توسعه دهنده اش نیست که همه کار ها رو انجام بده.
هر شخص یا گروهی میتونه کاری که مناسب میدونه برای توسعه NET Core. انجام بده، حتی اگه مایکروسافت منحل بشه و یا دیگه پشتیبان پروژه نباشه.
در ضمن تکنولوژی های open source مادامی که مخاطب داشته باشن بقا شون تضمین شده است و توسعه پیدا می کنند.
وقتی هم پروژه هایی رو بر اساس یک تکنولوژی توسعه داده بشه استفاده کننده هاش به راحتی کنارش نمیذارن.
برای همین دلیلی نداره که بخاطر net core. برای mono اتفاقی بیافته یا برعکس.
و اینکه استاد ، برنامه های ابری مثل برنامه هایی که تحت مایکروسافت آژور ساخته میشن ، قضیه ی کلی شون اینه که اون برنامه ها تحت سرورهای آژور آپلود میشن و بجای اینکه مثل برنامه های عادی ، اون برنامه ، در هر کلاینتی مستقل اجرا بشه ، در برنامه های ابری ، هر کاربر میتونه با دادنِ یوزر و پسورد ، اون را از سرورِ آژور اجرا کنه .
بنابراین نیازی به درگیر شدن منبع سخت افزاریِ کاربر نهایی هم نیست و در اون سرور همه ی این کارها انجام میشه .
به روزرسانی هم برای توسعه دهنده راحت تره . چون دیگه لازم نیست اون برنامه ی معمولی که در همه ی کلاینت در سیستم کاربرهای نهایی نصب شده بودن ، دونه دونه اون به روزرسانی را دریافت کنن . چون این برنامه در سرور هست و کافی هه یکبار در همون سرور به روزرسانی بشه .
این برداشتی که از برنامه های ابری دارم ، درسته؟
بله، کاملا. البته هر چیزی فقط مزایا که نداره، همه چی در cloud-based applications گل و بلبل نیست.
 

جدیدترین ارسال ها

بالا