<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های آیدین مولوی نژاد</title>
        <link>https://virgool.io/feed/@ideenmolavi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-19 05:06:14</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>آیدین مولوی نژاد</title>
            <link>https://virgool.io/@ideenmolavi</link>
        </image>

                    <item>
                <title>روشی برای نوشتن کدی بهتر با استفاده از کلاسه های Nested &amp; Partial</title>
                <link>https://virgool.io/@ideenmolavi/%D8%B1%D9%88%D8%B4%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%DA%A9%D8%AF%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%DA%A9%D9%84%D8%A7%D8%B3%D9%87-%D9%87%D8%A7%DB%8C-nested-partial-vbe0pbbqcjy6</link>
                <description>این مقاله درباره یکی از تجربیاتی است که من در هنگام ساخت چارچوبی(Framework) با زبان سی شارپ در موتور بازی سازی یونیتی به اون رسیدم. البته این تجربه به صورت مستقیم ربطی به یونیتی نداره و صرفا  درباره یک الگوی طراحی(Design Pattern) در زبانی شی گرا است.چرا چارچوب؟در واقع این چارچوب ساخته شد تا کنترل بهتری بر روی روند اجرا شدن کد ها داشته باشم با وجود اینکه این چارچوب کارهای زیادی انجام میداد ولی واسط بسیار ساده ای داشت.این واسط  از دو تابع Register و Unregister تشکیل شده بود که نمونه ای از کلاس ها را در چارچوب ثبت و یا حذف می کرد. اما از اونجایی که کارهای زیادی انجام میداد تعداد خط های کد این کلاس به چیزی نزدیک به هزار خط رسیده بود که اصلا خوب نبود و نگهداریش رو سخت می کرد.در جستجوی راه حل…همونطور که همگی اطلاع داریم یکی از ویژگی های یک کلاس خوب رعایت نمودن اصل تک مسئولیتی است(Single Responsibility Principle)، مشخصا کلاس چارچوب در حال رعایت نمودن این اصل نبود چون کار های زیادی رو انجام میداد ولی با این حال از دو تابع بیشتر تشکیل نشده بود پس نمیشد اون رو به چندین کلاس عمومی(Public) تقسیم کرد تا هر کدوم از این کلاس ها یکی از وظایف رو به عهده بگیرند و یکی از کارها رو انجام بدن چون همه کارها کاملا درون چارچوب رخ میداد.من به کلاسی احتیاج داشتم که عمومی نباشه و همچنین به عناصر خصوصی کلاس چارچوب نیز دسترسی داشته باشه تا مجبور نباشم برای دسترسی به اطلاعات چارچوب اون ها رو به صورت عمومی تعریف کنم (اصل Encapsulation) و همینطور قابلیت این رو داشته باشه که توی یک فایل دیگر قابل تعریف باشه. خوشبختانه سی شارپ همه چیز هایی که من احتیاج داشتم رو داشت.راه حل: کلاس تودرتو (Nested Class) + کلاس Partial این دو قابلیت سی شارپ با هم پتانسیل بسیار زیادی برای اعمال Encapsulation و اصل تک مسئولیتی دارن، مخصوصا در شرایطی که من باهاش مواجه بودم.ابتدا کلاس چارچوب رو به صورت Partial تعریف کردم  این کار باعث میشد کلاس های دیگه که به صورت تو در تو قرار بود تعریف بشن در فایل های جداگانه قرار بگیرند و نه این که همگی در فایل کلاس چارچوب قرار بگیرند که خودش باعث میشد که فایل کلاس چارچوب خیلی شلوغ بشه.بعدش کلاس های دیگه که قرار بود وظایف چارچوب رو انجام بدن  رو به صورت تو در تو و همچنین به صورت خصوصی(Private) در فایل های جداگانه تعریف کردم.این کار باعث می شد که فایل کد های منبع نظم بهتری داشته باشند و همچنین این کلاس ها در خارج از کلاس چارچوب در دسترس نباشند یعنی دنیای بیرون خبری از این کلاس های نداشت انگار این کلاس ها اصلا وجود ندارند که از دیدگاه Encapsulation عالی هستش.بعد از انجام تمامی این کارها کلاس چارچوب از هزار خط کد به چیزی کمتر از 300 خط کد رسید که از دیدگاه نگهداری خیلی بهتر بود و نزدیک به ده کلاس به وجود اومد که تک تک وظایف چارچوب رو انجام می دادند.الان دیگه اگه می خواستم مثلا در یکی از ویژگی های چارچوب تغییر ایجاد کنم لازم نبود که کل کلاس چارچوب رو تغییر بدم میرفتم مستقیم اون کلاسی که مسئول انجام اون کار بود تغییر میداد که بعدها خیلی به درک تغییر که داده بودم کمک می کرد و خوانایی کد رو افزایش میداد.نتیجه گیریاز دیدگاه من این روش یک الگوی طراحی(Design Pattern) هستش که من قبلا بهش بر نخورده بودم و تو شرایطی که بهتون توضیح دادم خوانایی و نگهداری کد رو به صورت فوق العاده ای افزایش داد. اگه میخواین کدی با قابلیت نگهداری و خوانایی بیشتر تولید کنید در هنگام نوشتن کد این الگو رو  هم مد نظر قرار بدید.</description>
                <category>آیدین مولوی نژاد</category>
                <author>آیدین مولوی نژاد</author>
                <pubDate>Thu, 24 Jan 2019 23:43:02 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر ECS در Unity</title>
                <link>https://virgool.io/GameWorld/introduction-to-ecs-in-unity-pwtxq8cidakz</link>
                <description>اولین باری که با ECS آشنا شدم توی یکی از نشست های Unity درباره نوشتن کد هایی با کارایی بالا بود. توی اون ویدیو صحنه بزرگی با کلی جزییات در حال پردازش بود، ده ها هزار اشیا با جزییات زیاد در حال حرکت به سمت همدیگر بودن. صحنه پر از جلوه های بصری سنگین بود ولی Unity به راحتی از پس اجرای چنان صحنه عظیمی بر اومده بود!خب Unity چطور چنین کاری رو ممکن کرد؟ با باز نویسی کامل یکی از اصلی ترین قسمت های انجین.باید گفت ECS تغییر بزرگی در نحوه کار با یونیتی بوجود خواهد آورد نتنها نحوه کار ما با یونیتی بلکه بخش زیادی از کد های انجین هم نیاز به بازنویسی دارن و احتمالا به کد سی شارپ تبدیل بشن. از اونجایی که یونیتی ادعا می کنه اگه کد های سی شارپ رو با رویکرد ECS بنویسید سرعتشون از کدهای سی پلاس پلاس هم بیشتر میشه پس چندان هم غیر منطقی نیست اگه بخش زیادی از کد های انجین رو با سی شارپ دوباره بنویسن که خب برای ما خیلی خوب چون حالا استفاده کنندهای یونیتی و کسانی که یونیتی رو میسازن با زبان مشترکی کد ها شون رو می نویسن. نکته مثبت دیگه اینه که اون بخش هایی از انجین که با سی شارپ نوشته میشه از طریق Package Manager یونیتی در دسترس خواهد بود(البته برای کاربران Unity Pro).با تمام این حرف ها حالا ECS چی هست؟یک روش نسبتا قدیمی برای طراحی سیستم های نرم افزاری که یونیتی در روش سنتیش(GameObject+MonoBehavior) تقریبا از همین روش استفاده می کرد ولی نه با رویکرد داده گرا(Data Oriented). این روش برای اولین بار در سال 1998 توی یه بازی به کار برده شد ولی تا سال 2007 طول کشید تا به چیزی که یونیتی در حال حاضر به عنوان ECS ازش یاد میکنه برسه.در اصل ECS روشی است که یونیتی برای پیاده سازی مدل برنامه نویسی داده گرا بکار بسته و قبلا هم توسط شرک هایی مانند  Dice و یا Naughty Dog مورد استفاده قرار گرفته پس میشه گفت امتحانش رو پس داده.البته باید گفت که در یونیتی ECS به تنهایی کارایی رو چندان بالا نمیبره و برای اینکه تفاوت رو کاملا حس کنید باید از C# Job System و کامپایلری که بچه های یونیتی زحمتش رو کشیدن به نام Burst استفاده کنی تا از تمامی توانمندی های این سیستم بهره مند بشید.کدام روش، Hybrid یا Pure؟از اونجایی که ECS خط بطلانی بر روی روش سنتی پیاده سازی منطق بازی در یونیتی که بر اساس Game Object و MonoBehavior است می کشه، یه روش بینابینی هم معرفی می کنه که به روش Hybrid معروفه که بیشتر به درد کاربرانی می خوره که میخوان کدهای سنتی شون تبدیل به ECS کنن. نظر شخصیم اینه که روش Hybrid کمی پیچیده تر هست و روش Pure که کلا از المانهای ECS استفاده می کنه هماهنگی و سادگی بیشتری دارن.پس اگه می خواین یه پروژه رو از اول شروع کنید روش Pure مناسبتر.چقدر رو کارایی تاثییر داره؟این تا حدود زیادی بستگی به این داره که چقدر پروژه ای که دارید میسازید از CPU استفاده می کنه و به قولی آیا پروژه CPU Bound هستش و یا GPU Bound. مثلا بازی هایی شبیه سازی و یا بازی های Real-time strategy که امکان داره استفاده زیادی از CPU داشته باشند بیشترین افزایش کارایی رو تجربه می کنن.با توجه به  آموزشی که یونیتی تهیه کرده باید گفت میشه هشت تا ده برابر افزایش کارایی رو  بدست آورد. اگه روی اون آموزش کمی دقیق بشین متوجه میشین که درآخر کار GPU داشت با 100 درصد توان خودش کار میکرد ولی CPU فقط کمی بیشتر از 30 درصد. پس می شه به صورت نظری بگی که افزایش کارایی میتونست توی اون سیستم تا 30 برابر هم پیش بره اگه GPU  قوی تری داشت.پس استفاده از ECS رو بازی های کوچیک موبایلی تاثیری نداره؟از اون جایی که بازی های کوچکتر موبایل معمولا  GPU Bound هستن پس شاید افزایش فریم چندان زیادی رو تجربه نکنند ولی روی مصرف باطری و کمتر داغ شدن دستگاه می تونه تاثیر مثبت داشته باشه.ایا از ECS برای پروژه جدیدمون استفاده کنیم؟باید بگم که نه. در زمان نوشتن این مقاله ECS همچنان خیلی کار داره تا بشه توی یه پروژه جدی ازش استفاده کرد قسمت های زیادی از انجین نیاز به منطبق شدن با اون رو دارن و خود ECS هم در حالت Preview به سر میبره. ولی از الان باید به فکرش باشید. نظر شخصیم اینه که خیلی از توسعه دهنده ها  خودشون رو درگیر ECS نمی کنن مخصوصا برای پروژه های کوچکتر.در آخر باید گفت که از دیدگاه یک برنامه نویس ECS میتونه نحوه کار با یونیتی رو به کلی متحول کنه که باید بسته به پروژه ای که شروع می کنیم تصمیم بگیریم آیا ارزشش رو داره یا نه.</description>
                <category>آیدین مولوی نژاد</category>
                <author>آیدین مولوی نژاد</author>
                <pubDate>Fri, 05 Oct 2018 08:45:32 +0330</pubDate>
            </item>
            </channel>
</rss>