<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های پیمان حاجی محمد</title><link>https://virgool.ir/feed/@peyman.eb15</link><description></description><language>fa</language><pubDate>2026-11-11 06:33:40</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>پیمان حاجی محمد</title><link>https://virgool.ir/@peyman.eb15</link></image><item><title>تفکر شئ‌گرا</title><link>https://virgool.ir/@peyman.eb15/تفکر-شئ-گرا-hfetuimwpnrp</link><description>تفکر شی گرا یک رویکرد مهم در برنامه‌نویسی و طراحی نرم‌افزار است که بر اساس آن، برنامه‌ها و سیستم‌ها به صورت مجموعه‌ای از اشیاء (Objects) مدلسازی می‌شوند. در این رویکرد، هر شیء دارای خصوصیات (Properties) و رفتارهای (Behaviors) خود است و این خصوصیات و رفتارها از طریق متدها (Methods) دسترسی پیدا می‌کنند.تفکر شی گرا به عنوان یک ابزار قدرتمند در توسعه نرم‌افزارهای بزرگ و پیچیده شناخته شده است. با استفاده از تفکر شی گرا، برنامه‌نویسان می‌توانند کدهای قابل استفاده، توسعه و نگهداری بسیاری را ایجاد کنند.در این مقاله، به بررسی مفاهیم و اصول تفکر شی گرا پرداخته، مزایا و معایب این رویکرد را بررسی کرده و روش‌های پیاده‌سازی آن را بررسی خواهیم کرد. همچنین، نحوه استفاده از تفکر شی گرا در زبان‌های برنامه‌نویسی پردازشی را نیز بررسی خواهیم کرد.مفهوم کلاسزبان‌های برنامه نویسی شی‌گرا متشکل از کلاس ها و اشیا هستند. کلاس ها ساختار و ویژگی های اشیا را مشخص می کنند. در واقع اشیا از روی کلاس ها ساخته می شوند و کلاس ها را می توان یک blueprint برای اشیا دانست. کلاس ها شامل خصوصیاتی هستند، مانند صفات، رفتار ها. هر کدام از این خصوصیات دارای سطح مشاهده پذیری مشخصی هستند مانند public, private.یک شیوه استاندارد برای نمایش کلاس ها، رفتار ها، ویژگی ها و روابطشان استفاده از نمودار (UML (Unified Modeling Language می باشد که در تصویر زیر قسمت های مختلف نمایش یک کلاس را مشاهده می کنید:نمودار UMLزیرکلاس و زبرکلاسدر برنامه نویسی شی گرا ما سلسله مراتب کلاس ها را داریم بدین معنا که کلاس هایی وجود دارند که ویژگی ها و رفتار های کلاس های پدر خود را به ارث می برند. کلاس های پدر را زبرکلاس (superclass) و کلاس های فرزند را زیرکلاس (subclass) می نامیم.نحوه نمایش زیرکلاس ها و زبرکلاس ها  در UMLاصول و پایه های برنامه نویسی شی گرابرنامه نویسی شی گرا بر چهار پایه اصلی بنا نهاده شده. انتزاع، کپسوله کردن، وراثت، چندریختی:انتزاع (Abstraction)در اکثر اوقات، اشیا و کلاس هایی که در برنامه خود تعریف می کنیم، مدلی از دنیای واقعی است. اما این مدل 100% همانند شی در دنیای واقعی نیس و در واقع انتزاعی از آن است. بر اساس نوع کاربرد و نیازمندی های برنامه این انتزاع می تواند متفاوت باشد. برای مثال یک کلاس هواپیما را در نظر بگیرید که برای یک برنامه فروش بلیط تنها شامل صفت تعداد صندلی است ولی همین هواپیما در برنامه تست پرواز شامل صفات بیشتری مانند سرعت، زاویه پرواز و .. خواهد بود.دو انتزاع مختلف از  کلاس هواپیماکپسوله کردن (Encapsulation)وقتی می خواهید ماشین خود را روشن کنید تنها کافیست سوئیچ را در محل مربوطه وارد کرده و بچرخانید و سپس ماشین روشن می شود دیگر لازم نیست دو تا سیم را به هم نزدیک کرده تا جرقه بزنند و ماشین روشن شود و یا نیازی به بالا و پایین کردن دستی سیلندر ها برای حرکت خودرو نیست. در واقع این جزئیات از دید ببرونی ماشین مخقی بوده و برای روشن کردن ماشین تنها یک رابط (واسط) مشخص در دسترس عمومی قرار داده شده است. کپسوله کردن ویژگی مخفی سازی حالات و رفتار های شی از سایر اشیا و بخش های برنامه و تنها راه دسترسی به درون شی، واسط های محدود تعریف شده برای آن شی می باشدوراثت (Inheritance)در برنامه نویسی شی گرا وراثت، توانایی تعریف کلاس های فرزند برای کلاس های موجود و به ارث بردن صفات و رفتار های کلاس پدر توسط کلاس فرزندان می باشد. این ویژگی باعث می شود reusability (توانایی استفاده مجدد از کد های یکسان برای مقاصد متفاوت) بالا برود.نکته1: در اکثر زبان های برنامه نویسی کلاس ها تنها می توانند از یک کلاس ارث بری کنند اما می توانند چندین واسط (interface) را پیاده سازی کنند.نکته2: اگر زبرکلاس، واسطی را پیاده سازی کرده باشد تمام زیرکلاس های آن نیز بایستی آن واسط ها را پیاده سازی کنند.ارث بری کلاس گربه از کلاس حیوانچندریختی (Polymorphism)تصور کنید دو کلاس سگ و گربه را داریم که هر یک از کلاس حیوان ارث بری می کنند. در کلاس حیوان یک متد abstract «تولید صدا» وجود دارد که زیرکلاس های سگ و گربه آن را override کرده اند و هر یک صدای مخصوص به خود را پس از صدا زده شدن این متد تولید می کنند. برای نگهداری اشیای حیوان و صدا زدن متد تولید صدا نیازی به دانستن دقیق نوع شی و کلاس آن نیست. این قابلیت به علت وجود پیاده سازی چندریختی در برنامه نویسی شی گرا است.استفاده از چندریختی در توللید صدای حیواناتالگوهای طراحیدر اینجا به بررسی الگوهای طراحی در تفکر شیءگرا خواهیم پرداخت. الگوهای طراحی به عنوان روش‌هایی برای حل مشکلات معمول در برنامه‌نویسی شیءگرا شناخته می‌شوند. این الگوها برای حل مسائلی که به طور متداول در برنامه‌نویسی شیءگرا وجود دارد، به کار می‌روند. این الگوها به عنوان راهکارهایی برای مشکلات معمول در طراحی نرم‌افزار مورد استفاده قرار می‌گیرند.الگوهای طراحی به سه دسته کلی تقسیم می‌شوند: الگوهای ساختاری، الگوهای رفتاری , الگوهای ایجادی.الگوهای ساختاری، الگوهایی هستند که به پیاده‌سازی ارتباطات بین کلاس‌ها کمک می‌کنند. این الگوها شامل الگوهای Bridge و Adapter می‌شوند.الگوهای رفتاری به دیگر الگوهایی اطلاق می‌شود که به مدیریت رفتارهای مختلف در کلاس‌ها کمک می‌کنند. این الگوها شامل Observer، Template Method و State می‌شوند.الگوهای ایجادی الگوهایی هستند که با هدف ایجاد بستر و سیاست های مناسب برای ساخت اشیا در برنامه به وجود آمده اند، الگوهایی مانند Singleton و Factory.الگوی Singleton به منظور ایجاد یک نمونه تنها از یک کلاس استفاده می‌شود. این الگو برای حل مشکلاتی مانند ایجاد چندین نمونه از یک کلاس در طول زمان و یا اشتراک یک منبع مشترک در سراسر برنامه استفاده می‌شود و باعث بالا رفتن سرعت اجرای برنامه و کاهش مصرف حافظه می‌شود. این الگو به این صورت است که فقط یک نمونه از یک کلاس در طول دوره اجرای برنامه ایجاد می‌شود و هر بار که نیاز به استفاده از آن کلاس وجود دارد، از آن نمونه استفاده می‌شود.الگو طراحی Singletonالگوی Factory برای ایجاد نمونه‌هایی از کلاس‌ها استفاده می‌شود. این الگو برای حل مشکلاتی مانند ایجاد نمونه‌های مختلف از یک کلاس با توجه به ورودی‌های مختلف استفاده می‌شود و باعث کاهش وابستگی به شیءهای ساخته‌شده در کد و افزایش قابلیت توسعه برنامه می‌شود. در این الگو، یک فابریک به عنوان یک متد در کلاس ایجاد می‌شود که به عنوان مسئول ایجاد و بازگشت شیء مناسب برای کاربرد موردنظر عمل می‌کند.الگو طراحی Factoryالگوی Observer برای مدیریت تغییرات در یک کلاس استفاده می‌شود. این الگو برای حل مشکلاتی مانند همگام‌سازی تغییرات در چندین کلاس در سراسر برنامه استفاده می‌شود. در این الگو، یک کلاس مشترک به عنوان چندین شیء به عنوان مشاهده‌گر به آن متصل می‌شود و هر زمان که وضعیت کلاس تغییر می‌کند، تمام مشاهده‌گرها از تغییر مطلع می‌شوند.الگو طراحی Observerاستفاده از الگوهای طراحی برای طراحی نرم‌افزار دارای مزایا و معایبی است:مزیت اصلی استفاده از الگوهای طراحی، کاهش زمان، کدهای بهینه تر، کاهش احتمال ایجاد خطا در کد نوشته شده است. این الگوها عموماً توسط توسعه‌دهندگان حرفه‌ای به کار می‌روند که قبلاً با استفاده از آن‌ها آشنا شده‌اند.معایب استفاده از الگوهای طراحی شامل پیچیدگی در کدنویسی، کاهش خوانایی کد و افزایش پیچیدگی درک کد، مسئله تناسب الگو با ویژگی‌های خاص پروژه و همچنین افزایش هزینه توسعه و نگهداری و افزایش زمان لازم برای طراحی و پیاده‌سازی می‌شود.به عنوان یک برنامه‌نویس، باید با استفاده از مهارت‌های فکری شیءگرا قادر باشید به طور مستمر به طراحی و پیاده‌سازی الگوهای طراحی در نرم‌افزار خود بپردازید. برای این کار، باید با منطق و رویکرد شیءگرایی آشنا شده و به خوبی درک کنید که چگونه می‌توانید از الگوهای طراحی برای حل مشکلاتی که در برنامه‌نویسی شیءگرا معمول استفاده شود، استفاده کنید.استفاده از الگوهای طراحی در طراحی نرم‌افزار به دو دلیل مهم است:بهبود قابلیت خوانایی کدبهبود قابلیت توسعه نرم‌افزاربا استفاده از الگوهای طراحی، می‌توانید کدی را طراحی کنید که به اندازه کافی مستقل است که در صورت نیاز به تغییر، تغییرات را در کد به راحتی انجام دهید.استفاده از الگوهای طراحی در طراحی نرم‌افزار به طور خاص در برنامه‌نویسی شیءگرا حائز اهمیت است. با استفاده از الگوهای طراحی، می‌توانید کدی با کیفیت بالا و قابلیت توسعه بیشتری طراحی کنید. اما باید به یاد داشته باشید که استفاده از الگوهای طراحی خود به تنهایی کافی نیست و باید با توجه به مسئله مورد نظر، الگوی مناسبی انتخاب کنید.چالش ها و محدودیت های تفکر شی گرابه طور کلی، تفکر شی گرا در برنامه نویسی، یک مدل فرآیندی است که برای ساخت برنامه‌های کامپیوتری استفاده می‌شود. در این مدل، داده‌ها و عملیات مربوط به آن داده‌ها را در قالب شیء یا اشیاء مجزا مدیریت می‌کنیم. این شی‌ها می‌توانند دارای ویژگی‌ها و رفتارهای خاص خود باشند و با هم در تعامل باشند.با وجود اینکه تفکر شی گرا در برنامه نویسی بسیار مفید است، اما همچنان چالش‌هایی وجود دارد که می‌تواند برای برنامه‌نویسان مشکل ساز باشد. به عنوان مثال، با افزایش تعداد شی‌ها، پیچیدگی برنامه‌های شی گرا افزایش می‌یابد و مدیریت آن‌ها سخت می‌شود. همچنین، تغییرات در یک شی ممکن است باعث تغییرات در سایر شی‌ها شود و این باعث سختی در مدیریت تغییرات می‌شود.به طور خلاصه، تفکر شی گرا یک روش مفید برای برنامه نویسی است که برای ساخت برنامه‌های بزرگ و پیچیده استفاده می‌شود. با این حال، برای دستیابی به بهترین نتیجه در برنامه‌نویسی شی گرا، باید با چالش‌ها و محدودیت‌های آن آشنا بود و الگوهای مناسب را برای طراحی برنامه‌های شی گرا به کار برد. در ادامه، به برخی از این چالش ها اشاره خواهیم داشت:پیچیدگییکی از چالش‌های تفکر شی گرا، پیچیدگی بالای برنامه‌های شی گرا است. در تفکر شی گرا، برای طراحی برنامه‌ها، از شی‌ها به عنوان واحدهای اصلی استفاده می‌شود که دارای ویژگی‌ها و رفتارهای خاص خود هستند و با هم در تعامل هستند. با افزایش تعداد شی‌ها و پیچیدگی برنامه‌ها، مدیریت آن‌ها سخت و پیچیده می‌شود.در برنامه‌نویسی شی گرا، ممکن است برای ایجاد یک شی بزرگ و پیچیده، باید از چندین شی کوچک‌تر استفاده کرد. به عنوان مثال، یک شی خودرو ممکن است شامل چندین شی مانند موتور، گیربکس، ترمز و ... باشد. همچنین، در برخی موارد، برای پیاده‌سازی یک ویژگی خاص، نیاز به ایجاد چندین شی مرتبط با هم داریم. به عنوان مثال، برای پیاده‌سازی یک سیستم بیمه، باید اطلاعات مربوط به بیمه‌گذار، بیمه شده، خودرو و... را مدیریت کنیم که می‌تواند موجب پیچیدگی برنامه شود.با افزایش تعداد شی‌ها، مدیریت آن‌ها و تعامل بین آن‌ها پیچیده‌تر می‌شود. همچنین، افزایش پیچیدگی برنامه‌ها ممکن است باعث افزایش حجم کد و کاهش خوانایی و قابلیت توسعه آن‌ها شود. برای رفع این مشکل، می‌توان از الگوهای طراحی مناسبی مانند الگوی ترکیب و الگوی تکرار استفاده کرد که به کاهش پیچیدگی و مدیریت بهتر شی‌ها کمک می‌کنند.به طور کلی، مدیریت پیچیدگی در تفکر شی گرا یکی از چالش‌های مهم در برنامه نویسی است که با استفاده از الگوهای طراحی مناسب، می‌توان به کاهش آن پرداخت.مشکلات در تست و اشکال‌زدایییکی دیگر از چالش‌های تفکر شی گرا، مشکلات در تست و اشکال‌زدایی برنامه‌های شی گرا است. در برنامه‌نویسی شی گرا، برای تست و اشکال‌زدایی برنامه‌ها، نیاز به ساختاری برای تست کردن و اشکال‌زدایی کد شی گرا وجود دارد.یکی از مشکلات مهم در تست برنامه‌های شی گرا، پیچیدگی ساختار آن‌ها است. در برنامه‌های شی گرا، شی‌ها با یکدیگر در تعامل هستند و وابستگی‌هایی با یکدیگر دارند که باعث می‌شود تست کردن یک شی به تنهایی، مشکل و پیچیده باشد. همچنین، طراحی نامناسب شی‌ها و عدم رعایت اصول SOLID ممکن است باعث کاهش خوانایی کد و افزایش مشکلات در تست و اشکال‌زدایی شود.در برنامه‌های شی گرا، شی‌ها می‌توانند حالت داشته باشند که باعث می‌شود تست کردن وضعیت و رفتار آن‌ها مشکل باشد. همچنین، به دلیل وجود وابستگی‌های بین شی‌ها، تست کردن یک شی ممکن است به تست کردن شی‌های دیگر نیز نیاز داشته باشد که باعث افزایش پیچیدگی و زمان تست می‌شود.همچنین، مشکلات در اشکال‌زدایی برنامه‌های شی گرا نیز وجود دارد. در واقع، با توجه به پیچیدگی بالای برنامه‌های شی گرا، پیدا کردن خطاها و اشکالات در آن‌ها ممکن است سخت و زمان‌بر باشد. همچنین، در برنامه‌های بزرگ شی گرا، خطاها ممکن است در قسمت‌های مختلفی از برنامه وجود داشته باشند که پیدا کردن و رفع آن‌ها نیازمند تست و اشکال‌زدایی جزئی‌تر است.برای رفع این مشکلات، می‌توان از روش‌های تست و اشکال‌زدایی مناسب استفاده کرد. به عنوان مثال، می‌توان از تست واحد، تست تکمیلی، تست عملکردی و... استفاده کرد. همچنین، می‌توان از ابزارهای تست و اشکال‌زدایی مانند JUnit،  Mockito  و... استفاده کرد. همچنین، رعایت اصول SOLID در طراحی شی‌ها و کد، بهبود قابلیت تست و اشکال‌زدایی برنامه‌ها را فراهم می‌کند. همچنین، می‌توان با استفاده از الگوهای طراحی مناسبی مانند الگوی تزریق وابستگی ، الگوی کارخانه و...، ساختار برنامه‌ها را بهبود بخشید و تست و اشکال‌زدایی آن‌ها را ساده‌تر کرد.سختی در پیاده‌سازییکی دیگر از چالش‌های تفکر شی گرا، سختی در پیاده‌سازی برنامه‌های شی گرا است. در برنامه‌نویسی شی گرا، پیاده‌سازی برخی از ویژگی‌ها و رفتارهای مرتبط با شی‌ها ممکن است سخت و پیچیده باشد.در برنامه‌نویسی شی گرا، برای پیاده‌سازی یک ویژگی خاص ممکن است نیاز به تعریف چندین شی و رابطه بین آن‌ها باشد. این مسئله ممکن است باعث پیچیدگی و سختی پیاده‌سازی شود. همچنین، در برخی موارد، برای پیاده‌سازی یک ویژگی خاص، نیاز به تغییر ساختار کلی برنامه و یا ایجاد شی‌های جدید باشد که باعث می‌شود پیاده‌سازی آن مشکل باشد.همچنین، در برنامه‌نویسی شی گرا، ارث‌بری و پلی‌مورفیسم ممکن است باعث پیچیدگی در پیاده‌سازی شود. ارث‌بری ممکن است باعث شود که تعداد زیادی از ویژگی‌ها و رفتارهای یک شی به شی‌های دیگر ارث برده شود که باعث پیچیدگی در پیاده‌سازی و تعامل با آن‌ها می‌شود. همچنین، پلی‌مورفیسم ممکن است باعث شود که برای پیاده‌سازی یک رفتار خاص، نیاز به تعریف چندین شی باشد که باعث می‌شود پیاده‌سازی آن سخت و پیچیده باشد.در برنامه‌های شی گرا، تغییر ساختار برنامه در طول زمان نیز ممکن است سختی در پیاده‌سازی را افزایش دهد. با تغییر در یک شی و یا رابطه بین شی‌ها، ممکن است نیاز به تغییر در دیگر شی‌ها و رابطه بین آن‌ها باشد که باعث سختی و پیچیدگی در پیاده‌سازی می‌شود.برای رفع این مشکلات، می‌توان از اصول طراحی شی گرا و الگوهای طراحی مناسب استفاده کرد. همچنین، بهتر است در طراحی شی‌ها و رابطه بین آن‌ها، از اصول SOLID و اصول DRY پیروی کرد تا باعث بهبود قابلیت خوانایی و قابلیت توسعه برنامه شویم. همچنین، می‌توان با استفاده از الگوهای طراحی مناسبمانند الگوی تزریق وابستگی، الگوی کارخانه، الگوی تکرار کننده و...، ساختار برنامه‌ها را بهبود بخشید و پیاده‌سازی آن‌ها را ساده‌تر کرد. همچنین، استفاده از ابزارهایی مانند ابزارهای خودکارسازی و ابزارهای تحلیل کد، می‌تواند در پیاده‌سازی و توسعه برنامه‌های شی گرا کمک کند. همچنین، اهمیت تست و اشکال‌زدایی در پیاده‌سازی برنامه‌های شی گرا نیز بسیار بالاست و باید از روش‌های تست و اشکال‌زدایی مناسب استفاده کرد.تداخلات وابستگیتداخلات وابستگی یا Dependency Inversion، یکی از اصول SOLID در برنامه‌نویسی شی گرا است که به معنای وابستگی بالا به خاطر تداخلات بین کلاس‌ها و ماژول‌ها است. برای فهم بهتر این اصل، باید ابتدا درمورد وابستگی‌های بین کلاس‌ها صحبت کنیم.وابستگی بین کلاس‌ها به این معنی است که یک کلاس برای انجام کار خود نیاز به همکاری با یک یا چند کلاس دیگر دارد. این وابستگی می‌تواند به دو صورت مستقیم و غیرمستقیم باشد. در وابستگی مستقیم، یک کلاس به طور مستقیم از ویژگی‌ها و روش‌های دیگر کلاس‌ها استفاده می‌کند. در وابستگی غیرمستقیم، یک کلاس از ویژگی‌ها و روش‌های یک کلاس دیگر از طریق یک سری کلاس‌های واسط استفاده می‌کند.تداخلات وابستگی به این معنی است که یک ماژول برای انجام کار خود وابستگی به یک ماژول دیگر دارد، اما به جای این که به طور مستقیم به آن وابستگی داشته باشد، از طریق یک واسط با آن تعامل داشته باشد. به این ترتیب، وابستگی به ماژول دیگر به صورت غیرمستقیم و از طریق یک واسط انجام می‌گیرد.با استفاده از تداخلات وابستگی، ما می‌توانیم وابستگی‌های بین کلاس‌ها را کاهش دهیم و به جای آن از واسط‌ها استفاده کنیم. با این کار، تغییرات در یک کلاس، تاثیری بر سایر کلاس‌ها نخواهد داشت و امکان توسعه و تغییرات سریع‌تر و آسان‌تر خواهد شد.برای پیاده‌سازی تداخلات وابستگی، می‌توانیم از الگوی تزریق وابستگی (Dependency Injection) استفاده کنیم. در این الگو، وابستگی‌های یک کلاس از طریق یک واسط در زمان اجرا به آن تزریق می‌شود. این روش باعث می‌شود کد شی گرا قابلیت توسعه بیشتری داشته باشد و در زمان تست و اشکال‌زدایی نیز بهبود قابل توجهی داشته باشیم.مشکلات انتقالمشکلات انتقال یا Object Relational Mapping (ORM)، یکی از چالش‌های مهم در برنامه‌نویسی شی گرا است. در برنامه‌نویسی شی گرا، شی‌ها برای نگهداری و پردازش داده‌ها استفاده می‌شوند. اما در برخی موارد، نیاز است که این داده‌ها در پایگاه داده‌ها نیز نگهداری شوند. به منظور اینکه این داده‌ها به صورت شی‌ها در برنامه‌نویسی شی گرا استفاده شوند، از مفهوم مشکلات انتقال استفاده می‌شود.مشکلات انتقال به این معنی است که برای نگهداری داده‌ها در پایگاه داده، باید این داده‌ها به صورت شی‌ها در برنامه‌نویسی شی گرا استفاده شوند. این کار ممکن است با چالش‌هایی همراه باشد که به عنوان مشکلات انتقال شناخته می‌شوند. برخی از این مشکلات عبارتند از:۱. عدم تطابق‌ مدل داده‌های شی گرا با مدل داده‌های پایگاه داده: در برنامه‌نویسی شی گرا، داده‌ها به صورت شی‌ها نگهداری می‌شوند. اما در پایگاه داده‌ها، داده‌ها به صورت رابطه‌ای ذخیره می‌شوند. برای اینکه بتوانیم از داده‌ها در برنامه‌نویسی شی گرا استفاده کنیم، باید مدل داده‌های شی گرا را به مدل داده‌های پایگاه داده تطبیق دهیم.۲. کارایی پایین: استفاده از شی‌ها به صورت مستقیم در برنامه‌نویسی شی گرا ممکن است باعث کاهش کارایی شود. این امر به دلیل این است که برای بارگذاری داده‌ها از پایگاه داده به صورت شی‌ها، باید هر بار یک کوئری به پایگاه داده فرستاده شود.۳. پیچیدگی: پیچیدگی در پیاده‌سازی مدل داده‌های شی گرا و تطبیق آن‌ها با مدل داده‌های پایگاه داده ممکن است باعث سختی پیاده‌سازی شود.برای حل این مشکلات، از ابزارهای ORM مانند Hibernate و Entity Framework استفاده می‌شود که به صورت خودکار تبدیل داده‌های پایگاه داده به شی‌های مدل و برعکس را انجام می‌دهند. همچنین، استفاده از الگوی Repository و DAO می‌تواننیز به بهبود تطابق مدل داده‌های شی گرا با مدل داده‌های پایگاه داده کمک کرد. در این الگوها، مسئولیت دسترسی به داده‌ها به یک ماژول جداگانه منتقل می‌شود که مسئولیت ارتباط با پایگاه داده را بر عهده دارد و به این ترتیب، مدل داده‌های شی گرا از مدل داده‌های پایگاه داده جدا شده و از هم جدا می‌شوند. همچنین، استفاده از شیوه‌های بهبود کارایی مانند استفاده از کش برای حافظه نهان کردن داده‌ها می‌تواند به بهبود کارایی کمک کند.در کل، مشکلات انتقال در برنامه‌نویسی شی گرا می‌تواند یک چالش بزرگ باشد، اما با استفاده از ابزارهای ORM و الگو‌های بهینه‌سازی، می‌توان این مشکلات را به حداقل رساند و به راحتی با آن‌ها برخورد کرد.مشکلات مصرف حافظهمشکلات مصرف حافظه در برنامه نویسی شی گرا ممکن است به دلیل تعداد زیاد شی‌ها و تعداد بالای رابطه‌های بین آن‌ها باشد. در اینجا به برخی از مشکلات مصرف حافظه در برنامه نویسی شی گرا اشاره می‌کنیم:۱. تولید زباله (Garbage): وقتی یک شی ایجاد می‌شود، حافظه برای ذخیره آن اختصاص داده می‌شود. در زمانی که شی دیگری ایجاد می‌شود و شی قبلی دیگر در دسترس قرار ندارد، آن شی به عنوان زباله شناخته می‌شود. برنامه‌های شی گرا ممکن است به طور نامحدود شی ایجاد کنند که این موضوع می‌تواند باعث تولید زباله بیش از اندازه و در نتیجه افزایش مصرف حافظه شود.۲. تعداد زیاد شی‌ها: استفاده از تعداد زیادی شی ممکن است باعث افزایش مصرف حافظه شود. به عنوان مثال، اگر یک برنامه با تعداد زیادی شی‌های کوچک روبرو باشد، ممکن است مصرف حافظه بیش از حدی را ایجاد کند.۳. تعداد بالای رابطه‌های بین شی‌ها: اگر شی‌ها در برنامه‌نویسی شی گرا با تعداد بالای رابطه‌های مرتبط باشند، می‌تواند باعث افزایش مصرف حافظه شود.۴. توابع بازگشتی: توابع بازگشتی می‌توانند باعث افزایش مصرف حافظه در برنامه‌نویسی شی گرا شوند. در برنامه‌نویسی شی گرا، توابع بازگشتی معمولاً برای پیمایش درخت شی‌ها استفاده می‌شوند.۵. استفاده از داده‌ساختارهای نامتعادل: استفاده از داده‌ساختارهای نامتعادل ممکن است باعث افزایش مصرف حافظه شود. به عنوان مثال، استفاده از لیست پیوندی به جای آرایه می‌تواند باعث افزایش مصرف حافظه در برنامه‌نویسی شی گرا شود.برای حل مشکلات مصرف حافظه در برنامه‌نویسی شی گرا، می‌توان از روش‌هایی مانند استفاده از طراحی الگوی Singleton، استفاده از داده‌ساختارهای متوازن، بهینه‌سازی استفاده از توابع بازگشتی و حذف شی‌هایی که دیگر مورد استفاده قرار نمی‌گیرند، استفاده کرد. همچنین، می‌توان از تکنیک‌هایی مانند دیباگ کردن کد و استفاده از ابزارهای پیشرفته برای مانیتورینگ مصرف حافظه استفاده کرد. در کل، برای حل مشکلات مصرف حافظه در برنامه‌نویسی شی گرا، باید به طور هوشمندانه با طراحی کد و استفاده از روش‌های بهینه مصرف حافظه، به مشکلات مصرف حافظه پیش از آنکه ایجاد شود، پیشگیری کرد.سختی در مدیریت تغییراتمدیریت تغییرات در برنامه نویسی شی گرا می‌تواند چالش‌هایی داشته باشد. یکی از این چالش‌ها، سختی در مدیریت تغییرات است. در برنامه‌نویسی شی گرا، تغییر در یک شی می‌تواند تأثیرات بسیاری بر شی‌های دیگر داشته باشد و این می‌تواند به ایجاد مشکلات و خطاهای بیشتر در برنامه منجر شود.برای مدیریت تغییرات در برنامه نویسی شی گرا، می‌توان از روش‌هایی مانند Encapsulation و Polymorphism استفاده کرد. Encapsulation به معنی محافظت از داده‌ها است و این روش به کاهش تأثیر تغییرات در یک شی بر شی‌های دیگر کمک می‌کند. با استفاده از Encapsulation، داده‌های یک شی در اختیار قابل دسترس نیستند و تنها با استفاده از توابعی که در شی تعریف شده‌اند، می‌توان به این داده‌ها دسترسی پیدا کرد.همچنین، استفاده از Polymorphism در برنامه‌نویسی شی گرا می‌تواند به کاهش تأثیر تغییرات بر شی‌های دیگر کمک کند. Polymorphism به معنی توانایی یک شی در انجام چندین عملیات مختلف است. با استفاده از Polymorphism، می‌توان تغییر در عملکرد یک شی را از تغییرات در برنامه جدا کرد و در شی دیگری پیاده کرد.علاوه بر این، استفاده از Test-Driven Development (TDD) و Continuous Integration (CI) می‌تواند کمک کند تا به سادگی تغییرات در برنامه اعمال شوند. با استفاده از TDD، می‌توان به عنوان بخشی از فرآیند توسعه، تست‌هایی را برای کد نوشته شده ایجاد کرد. با اعمال تغییرات در کد، می‌توان برای تأیید صحت کد، تست‌های ایجاد شده را اجرا کرد. همچنین، با استفاده از CI، از تغییرات کد بر روی بستری که برای اجرای تست‌ها و ارزیابی کد استفاده می‌شود، استفاده می‌شود، تا از صحت عملکرد کد اطمینان حاصل شود.در کل، برای مدیریت تغییرات در برنامه نویسی شی گرا، باید از روش‌هایی مانند Encapsulation و Polymorphism استفاده کرد و از TDD و CI به عنوان بخشی از فرآیند توسعه استفاده کرد تا به سادگی تغییرات در برنامامه‌ای که صورت گرفته است، اعمال شوند و به اشکالات در کد و برنامه جلوگیری شود. همچنین، برای کاهش تأثیر تغییرات در برنامه، باید از طراحی خوب و استفاده از الگوهای طراحی مانند Design Patterns و SOLID principles استفاده کرد.تصورات نادرست یا مشکلات رایج در تفکر شی گراتفکر شی گرا یکی از مهمترین روش‌های برنامه‌نویسی است که در سال‌های اخیر بسیار پرکاربرد شده است. با این حال، برخی تصورات نادرست و مشکلات رایج نیز می‌تواند در تفکر شی گرا وجود داشته باشد که در ادامه به آنها اشاره می‌کنیم:استفاده بیش از حد از ارث بریارث بری یکی از اصول اصلی تفکر شی گرا است که به ارث بردن ویژگی‌های یک کلاس توسط کلاس دیگر مربوط می‌شود. استفاده از این اصل می‌تواند به کاهش تکرار کد و افزایش بازدهی در کد برنامه کمک کند. با این حال، استفاده زیاد از Inheritance می‌تواند منجر به ایجاد کد پیچیده و سخت تر برای مدیریت شود. این اتفاق به خاطر این است که در صورتی که یک کلاس جدید با تغییرات از یک کلاس موجود ایجاد شود، تمامی ویژگی‌های کلاس اصلی به همراه تغییرات به کلاس جدید ارث‌بری می‌شود. این موضوع می‌تواند منجر به ایجاد کلاس‌های بی‌معنی و پیچیده شود که باعث کاهش قابلیت استفاده دوباره و توسعه بعدی شده و کد را سخت تر می‌کند.نقض کپسوله سازیکپسوله سازی از اصول اساسی تفکر شی گرا است که به معنی محافظت از داده ها است. در کپسوله سازی، داده های یک شی در اختیار قابل دسترس نیستند و تنها با استفاده از توابعی که در شی تعریف شده اند، می توان به این داده ها دسترسی پیدا کرد. این اصل به کاهش تاثیر تغییرات در یک شی بر شی های دیگر کمک می کند. با این حال، استفاده نادرست از کپسوله سازی می تواند منجر به افشای داده ها و از دست رفتن کنترل بر روی آنها شود. به طور مثال، اگر شی های دیگر به صورت مستقیم به داده های یک شی دسترسی داشته باشند، می تواند باعث ایجاد مشکلات امنیتی و بازدهی در کد شود.استفاده بیش از حد از پلی مورفیسمپلی مورفیسم یکی از اصول اساسی تفکر شی گرا است که به معنی توانایی یک شی در انجام چندین عملیات مختلف است. استفاده از این اصل می‌تواند به کاهش تأثیر تغییرات بر شی‌های دیگر کمک کند. با این حال، استفاده زیاد از این اصل می‌تواند باعث ایجاد پیچیدگی و تعارض‌های بیشتر در کد شود. برای مثال، اگر یک شی قابلیت انجام چندین عملیات مختلف را داشته باشد، ممکن است برای تغییر در یکی از این عملیات‌ها، تغییراتیدر سایر عملیات‌ها نیز نیاز باشد که می‌تواند باعث ایجاد مشکلات بیشتر در کد شود.عدم طراحی مناسبعدم طراحی مناسب یکی از مشکلات رایج در تفکر شی گرا است که می‌تواند منجر به ایجاد کد پیچیده و دشوار برای مدیریت شود. برای رفع این مشکل، باید از الگوهای طراحی مانند Design Patterns و SOLID principles استفاده کرد. برای مثال، استفاده از الگوهای طراحی مانند Factory و Singleton می‌تواند به کاهش پیچیدگی کد و افزایش قابلیت استفاده دوباره کد کمک کند.مشکلات تست کردنتست کردن کد یکی از موارد مهم در توسعه نرم‌افزار است. با این حال، تست کردن کد شی گرا می‌تواند دشوار باشد به دلیل پیچیدگی بالای کد. برای رفع این مشکل، باید از روش‌های تست شی گرا مانند Unit Testing و Integration Testing استفاده کرد. همچنین، باید در زمان طراحی کد، از اصول مانند SOLID principles استفاده کرد تا کد قابل تست باشد. به‌عنوان مثال، باید از Dependency Injection استفاده کرد تا بتوان کدها را به‌صورت مستقل از یکدیگر تست کرد.در کل، برای استفاده بهتر و موفقیت‌آمیز از تفکر شی گرا، باید به این مشکلات و تصورات نادرست توجه کرد و از اصول و الگوهای طراحی مناسب استفاده کرد.استراتژی هایی برای غلبه بر چالش ها و به حداکثر رساندن مزایای تفکر شی گراتفکر شی گرا یکی از روش‌های مهم برای طراحی و توسعه نرم‌افزارهاست. با این روش، برنامه‌نویسان می‌توانند با بهره‌گیری از اصولی مانند Inheritance، Encapsulation، Polymorphism و SOLID، ساختار کد را بهبود داده و کدهای قابل توسعه و بازدهی بالا بسازند. در ادامه به توضیحاتی درباره پیشنهاد استراتژی‌هایی برای غلبه بر چالش‌های تفکر شی گرا و به حداکثر رساندن مزایای آن می‌پردازیم:استفاده صحیح از ارث بری بهترین روش برای ارث‌بری، استفاده از Composition یا Aggregation است، به این صورت که به جای ارث‌بری، یک شی دیگر را به شی مورد نظر اضافه کنیم. همچنین، برای کاهش پیچیدگی کد و افزایش بازدهی، می‌توان از الگوهای طراحی مانند Template Method و Strategy Pattern استفاده کرد.رعایت کپسوله سازی کپسوله سازی به ما این امکان را می‌دهد که داده‌های یک شی را محافظت کنیم و تنها از طریق توابعی که در شی تعریف شده‌اند، به آن دسترسی داشته باشیم. این اصل به ما کمک می‌کند که از اطلاعات شی درخواستی برای داشته باشیم و کد را قابل خواندن تر کنیم. همچنین، برای مدیریت داده‌ها، می‌توان از الگوهای طراحی مانند Data Access Object (DAO) و Repository Pattern استفاده کرد.بهره‌گیری از چندریختی پلی مورفیسم به ما این امکان را می‌دهد که توابع با نام یکسان را در شی‌های مختلف با پارامترهای متفاوت، ایجاد کنیم. این اصل به ما کمک می‌کند که کد را به صورت خوانا و قابل فهم برای برنامه‌نویسان دیگری نوشته شود. برای بهره‌گیری بهینه از این اصل، باید از طراحی صحیح ساختار کلاس‌ها و توابع استفاده کرد. همچنین، برای تعامل بین شی‌ها، می‌توان از الگوهای طراحی مانند Strategy Pattern و State Pattern استفاده کرد.رعایت اصول SOLID SOLID شامل مجموعه اصول طراحی است که به کاهش پیچیدگی کد، افزایش بازدهی و قابلیت توسعه بعدی کدها کمک می‌کنند. برای استفاده بهینه از تفکر شی گرا، باید از این اصول استفاده کرد. SOLID شامل اصول  Single Responsibility، Open-Closed، Liskov Substitution، Interface Segregation و Dependency Inversion است. این اصول به ما کمک می‌کنند که ساختار کد را به صورت قابل توسعه و بازدهی بالا طراحی کنیم و کدهایی بسازیم که قابلیت توسعه بعدی داشته باشند.استفاده از روش‌های تست شئ گراتست شی گرا یکی از روش‌های مهم برای اطمینان از صحت و قابلیت اطمینان کد است. برای تست کردن کد شی گرا، باید از روش‌های تست شی گرا مانند Unit Testing و Integration Testing استفاده کرد. همچنین، باید در زمان طراحی کد، از اصول SOLID principles استفاده کرد تا کد قابل تست باشد.طراحی مناسب ساختار کد برای طراحی مناسب ساختار کد، باید از الگوهای طراحی مانند Design Patterns استفاده کرد. این الگوهای طراحی به ما کمک می‌کنند تا ساختار کد را به صورت یکپارچه و بهینه طراحی کنیم. همچنین، باید از اصول Object-Oriented Design استفاده کرد تا کد قابل توسعه و قابل استفاده دوباره باشد.در کل، برای به حداکثر رساندن مزایای تفکر شی گرا و غلبه بر چالش‌های آن، باید با رعایت اصول و الگوهای طراحیمناسب، ساختار کد بهینه‌ای را طراحی کرد و از روش‌های تست شی گرا برای تست کردن کد استفاده کرد. همچنین، باید از اصول SOLID و Design Patterns استفاده کرد و ساختار کد را به‌صورت مداوم بهبود داد تا بهترین نتیجه را به‌دست آورد.زبان های برنامه نویسی شئ گرازبان‌های برنامه‌نویسی شی‌گرا، زبان‌هایی هستند که برای پیاده‌سازی تفکر شی‌گرا به‌کار می‌روند. در تفکر شی‌گرا، برنامه‌نویسی به‌صورت مفهومی و انتزاعی انجام می‌شود و اشیاء به‌عنوان واحدهای اصلی در نظر گرفته می‌شوند. در این روش، هر شیء دارای ویژگی‌هایی است که به‌عنوان ویژگی‌های عضو معرفی می‌شوند و همچنین می‌تواند رفتارهای خودش را با استفاده از روش‌های عملیاتی مانند متد‌ها پیاده‌سازی کند. برخی از محبوب‌ترین زبان‌های برنامه‌نویسی شی‌گرا عبارتند از:جاواجاوا یکی از محبوب‌ترین زبان‌های برنامه‌نویسی شی‌گرا است. این زبان دارای اصولی مانند Inheritance، Encapsulation و Polymorphism است که برای تفکر شی‌گرا اساسی هستند. همچنین، Java دارای کتابخانه‌هایی است که برای پیاده‌سازی الگوهای طراحی مختلف مانند Singleton و Factory Method استفاده می‌شوند. Java همچنین دارای ابزارهایی برای تست شی‌گرا مانند JUnit است.سی پلاس پلاس (++C)سی پلاس پلاس یک زبان برنامه‌نویسی شی‌گرا و پایه‌ای است که برای توسعه نرم‌افزارهای مختلف استفاده می‌شود. این زبان اصولی مانند Inheritance، Encapsulation و Polymorphism را پشتیبانی می‌کند و دارای ابزارهایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Observer و Decorator است. C++ همچنین دارای ابزارهایی برای تست شی‌گرا مانند Google Test است.پایتون پایتون یک زبان برنامه‌نویسی شی‌گرا و سطح بالا است که برای توسعه نرم‌افزارهای مختلف استفاده می‌شود. این زبان اصولی مانند Inheritance، Encapsulation و Polymorphism را پشتیبانی می‌کند و دارای کتابخانه‌هایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Singleton و Factory Method است. Python همچنین دارای ابزارهایی برای تست شی‌گرا مانند unittest است.رابی (Ruby) رابی یک زبان برنامه‌نویسی شی‌گرا و سطح بالا است که برای توسعه نرم‌افزارهای مختلف استفاده می‌شود. این زبان اصولی مانند Inheritance، Encapsulation و Polymorphism را پشتیبانی می‌کند و دارای کتابخانه‌هایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Observer و Strategy Pattern است. Ruby همچنین دارای ابزارهایی برای تست شی‌گرا مانند RSpec است.سی شارپ (#C)سی شارپ  یک زبان برنامه‌نویسی شی‌گرا و سطح بالا است که توسط شرکت Microsoft توسعه داده شده است. این زبان اصولی مانند Inheritance، Encapsulation و Polymorphism را پشتیبانی می‌‌کند و دارای کتابخانه‌هایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Observer و Decorator است. C# همچنین دارای ابزارهایی برای تست شی‌گرا مانند NUnit و xUnit.net است.سوئیفت (Swift) سوئیفت یک زبان برنامه‌نویسی شی‌گرا و سطح بالا است که توسط شرکت Apple توسعه داده شده است. این زبان اصولی مانند Inheritance، Encapsulation و Polymorphism را پشتیبانی می‌کند و دارای کتابخانه‌هایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Singleton و Factory Method است. Swift همچنین دارای ابزارهایی برای تست شی‌گرا مانند XCTest است.کاتلین (Kotiln) کاتلین یک زبان برنامه‌نویسی شی‌گرا و سطح بالا است که توسط شرکت JetBrains  توسعه داده شده است. این زبان اصولی مانند  Inheritance Encapsulation  و Polymorphism را پشتیبانی می‌کند و دارای کتابخانه‌هایی برای پیاده‌سازی الگوهای طراحی مختلف مانند Observer و Decorator است.  Kotlin  همچنین دارای ابزارهایی برای تست شی‌گرا مانند JUnit  و Spek  است.به‌طور کلی، زبان‌های برنامه‌نویسی شی‌گرا در پیاده‌سازی برنامه‌های قابل گسترش و قابل نگهداری بسیار موثر هستند و پشتیبانی از اصول شی‌گرایی، الگوهای طراحی و ابزارهای تست شی‌گرا، به برنامه‌نویسان کمک می‌کند تا کدی قابل نگهداری و توسعه‌پذیر بسازند.نمونه هایی از مفاهیم برنامه نویسی شی گرا در عملهمانطور که در بخش های قبل نیز به آن اشاره کردیم، برنامه‌نویسی شی‌گرا در عمل با استفاده از مفاهیمی مانند انتزاع، ارث‌بری، چندشکلی، مجزا سازی و... پیاده‌سازی می‌شود. در زیر، چند مثال از این مفاهیم در عمل آورده شده است: انتزاع: در برنامه‌نویسی شی‌گرا، انتزاع به‌عنوان یکی از مفاهیم اصلی به کار می‌رود که به کاربر اجازه می‌دهد تا با استفاده از یک شیء، فقط با خصوصیات مهم و با اهمیت آن شیء در ارتباط باشد و از جزئیات پیاده‌سازی آن خبر نداشته باشد. به‌عنوان مثال، فرض کنید برنامه‌نویسی می‌خواهد یک سرویس مشتری برای یک بانک برنامه‌ریزی کند. سرویس مشتری نباید به جزئیات پیاده‌سازی و دیتابیس بانک دسترسی داشته باشد. به جای آن، این سرویس باید از یک شیء مشتری با استفاده از متدهایی مانند &#34;واریز&#34; و &#34;برداشت&#34; استفاده کند. در اینجا، شیء مشتری یک نماینده از کلیت مفهوم مشتری بوده و از جزئیات پیاده‌سازی آن مستقل است.ارث‌بری: ارث‌بری به یک کلاس (یا شیء) اجازه می‌دهد که ویژگی‌ها و رفتارهای یک کلاس دیگر را به ارث ببرد. به‌عنوان مثال، می‌توانیم یک کلاس پایه به نام &#34;شخص&#34; تعریف کنیم که شامل ویژگی‌هایی مانند نام، نام خانوادگی و سن است. سپس می‌توانیم یک کلاس دیگر به نام &#34;کارمند&#34; تعریف کنیم که از کلاس &#34;شخص&#34; ارث‌بری می‌کند و بعلاوه ویژگی‌هایی دیگری مانند شماره پرسنلی و حقوق دارد. به‌این ترتیب، کلاس &#34;کارمند&#34; تمام ویژگی‌های کلاس &#34;شخص&#34; را به ارث می‌برد و در عین حال ویژگی‌های خود را دارد.چندشکلی: چندشکلی به اشیاء اجازه می‌دهد تا در شرایط مختلف، رفتارهای مختلفی را اجرا کنند. به‌عنوان مثال، فرض کنید برنامه‌نویسی یک بازی کامپیوتری در حال توسعه است. در بازی، چند نوع شخصیت وجود دارد، مانند شخصیت اصلی، دشمنان و غیره. هر شخصیت ممکن است رفتارهای مختلفی در شرایط مختلف داشته باشد. به‌عنوان مثال، شخصیت اصلی ممکن است در حالت دویدن، پرش کردن و حمله کردن با سلاح باشد، درحالی که دشمنان ممکن است در حالت حمله، دویدن و تلافی باشند. با استفاده از چندشکلی، برنامه‌نویسان می‌توانند برای هر شخصیت یک کلاس جداگانه تعریف کنند که شامل رفتارهای مختلف در شرایط مختلف است. در اینجا، هر شخصیت یک شیء است که از کلاس خود به عنوان نماینده استفاده می‌کند.مجزا سازی: مجزا سازی به اشیاء اجازه می‌دهد که در محدوده محدودی از کد قابل دسترسی باشند. به‌عنوان مثال، فرض کنید برنامه‌نویسی یک سیستم مدیریت پرونده‌ها را برنامه‌ریزی می‌کند. در این سیستم، اشیاء مختلفی مانند پرونده، کارمندان و غیره وجود دارند. برای اطمینان از اینکه هر شیء فقط به بخش مجاز خود دسترسی دارد، برنامه‌نویسان می‌توانند از مجزا سازی استفاده کنند. به‌عنوان مثال، اشیاء کارمندان فقط به اطلاعات مربوط به کارمندان دسترسی دارند و نمی‌توانند به اطلاعات پرونده‌ها دسترسی پیدا کنند. به‌این ترتیب، مجزا سازی به برنامه‌نویسان امکان می‌دهد که برای هر شیء محدوده دسترسی را مشخص کنند و برای اطمینان از امنیت برنامه از آن استفاده کنند.منابعکتاب Dive into design patterns</description><category>پیمان حاجی محمد</category><author>پیمان حاجی محمد</author><pubDate>Thu, 06 Jul 2023 16:01:27 +0330</pubDate></item><item><title>نگاهی به ساخت بازی اندرویدی</title><link>https://virgool.ir/@peyman.eb15/نگاهی-به-ساخت-بازی-اندرویدی-iktyhdbj3vmi</link><description>مقدمهاز سالیان پیش، توسعه بازی، از جمله حرفه‌های محبوب بوده است؛ گردش مالی این صنعت که در سال 2012 مبلغ 70.6 میلیارد دلار بوده، در سال 2020 به میزان 159.3 میلیارد دلار رسیده و همچنین پیش‌بینی می‌شود در سال 2023 به رقمی نزدیک به 200 میلیارد دلار برسد. در سال 2020 مبلغی در حدود 77.2 میلیارد دلار از گردش مالی‌ها مختص بازی‌های موبایلی بوده است، یعنی حدود 48 درصد از کل! تعداد بازیکنان با موبایل در سال 2020 نسبت به سال 2019، 12 درصد رشد داشته و به عدد 2.5 میلیارد نفر در جهان رسیده است.در دسترس بودن و قابل حمل بودن در همه مکان‎ها را می‌توان مزیت رقابتی پلتفرم موبایل نسبت به سایر پلتفرم‌های با قابلیت بازی کردن در نظر گرفت؛ آمار 1.3 میلیاردی بازیکنان کامپیوتر‎های شخصی و 729 میلیونی بازیکنان کنسولی نیز این مزیت رقابتی را به خوبی اثبات می‌کند؛ با همه این اوصاف بهینه‌سازی و طراحی مناسب بازی برای قشر گسترده و متنوع سیستم‎های سخت افزاری این پلتفرم همواره از جمله چالش‌ها و مشکلات توسعه دهندگان بوده، همچنین بالا بودن تعداد بازی‌های اندرویدی رقابت را برای توسعه دهندگان بر سر برترین بودن به شدت بالا برده و نیازمند آن کرده که از حداکثر توانایی خود جهت ایجاد رابط کاربری زیبا و آسان، گیم پلی خوب، تبلیغات موثر و... برای جذب مخاطب بکار بگیرند (در حال حاضر حدود 2.7 میلیون اپلیکیشن و بازی در گوگل پلی موجود می‌باشد).پر دانلودترین بازی‌های گوگل پلیهر اپلیکیشنی بازی نیست!می‌توان گفت بازی ویژگی‌های یک اپلیکیشن را به ارث می‌برد اما ویژگی‌های بیشتری نسبت به یک اپلیکیشن بایستی دارا باشد تا یک بازی نام بگیرد؛ از جمله بزرگترین تفاوت‌های یک بازی با یک اپلیکیشن، هدف ایجاد سرگرمی و نشاط است، اپلیکیشن برای ارائه یک تکنولوژی یا خدمات ساخته می‌شود، اما یک بازی با هدف ایجاد سرگرمی برای مخاطب، همین یک مورد، خود باعث افزایش پیچیدگی طراحی یک بازی شده است، سرگرمی یک احساس است و احساسات خیلی قابل اندازه‌گیری نیستند و پارامتری وجود ندارد که ما بتوانیم بگوییم که آیا الان یک نفر سرگرم شده است یا خیر و توسعه دهنده بازی هرگز نمی‌تواند با اطمینان خاطر میزان سرگرم شدن مخاطبش را اعلام کند؛ در مقابل یک توسعه دهنده اپلیکیشن به سادگی می‌تواند بفهمد که اپ خدمات لازم را انجام می‌دهد و به اهدافی که برای آن طراحی شده است می‌رسد یا نه.یک نمونه تفاوت دیگر، نیاز به استفاده از ریاضیات برای پیاده سازی فیزیک و گرافیک و همچنین برای وجود هوش مصنوعی در بازی است، در صورتی که یک اپلیکیشن عمدتا تنها مبتنی بر فناوری هستند و البته با استفاده کمی از گرافیک. یک توسعه دهنده اپلیکیشن نیاز زیادی به بهینه سازی ندارد اما برای یک بازی در بسیاری از زمینه‌ها برای عملکرد یکسان بین دستگاه‌های با سخت افزار ضعیف و قوی بایستی بهینه سازی‌های گوناگونی صورت بگیرد.طراحی بازی یا Game Designنقش‌هایی مانند برنامه‌نویس، آرتیست و نویسنده را همه ما می‌شناسیم و به میزان قابل قبولی وظیفه هر نقش در روند ساخت بازی را می‌دانیم، اما اسم &#34;طراح بازی&#34; یا همان &#34;game designer&#34; کمتر به گوشمان خورده یا به طور دقیق وظیفه و نقش آن را در فرآیند ساخت یک بازی نمی‌دانیم. طراح بازی نیازمند دانش به حد کافی در اکثر زمینه‌های ساخت یک بازی مانند برنامه نویسی، آرت، روایت داستان و... است، زیرا نیاز به ارتباط برقرار کردن با همه این افراد برای پیاده سازی ایده‌ها، قوانین، چالش‌ها، کاراکترها و موارد بسیار دیگری را دارد؛ اما تنها نیاز آن نیست که توانایی پیاده سازی ایده‌هایش را در بازی داشته باشد، بلکه باید چگونه طراحی کردن، چه چیزی را طراحی کردن، هر ویژگی را چه زمانی پیاده کردن و چرایی چیزی که قصد طراحی‌اش را دارد بطور کامل بداند و بر آن مسلط باشد.در فرآیند طراحی بازی مسائلی تعیین و طراحی می‌شوند که در واقع هسته اصلی بازی را تشکیل می‌دهند و سایر موارد در بازی بر پایه آنها پیاده سازی می‌شوند. چند مورد از این موارد در ادامه به صورت مختصر به آنها پرداخته شده است:تشریح جزییات گیم‌پلیدر این بخش نوع گیم پلی بازی، نوع تعامل بازیکن با بازی، کنترل ها، رابط کاربری و موارد نظیر آنها نسبت به پلتفرم هدف تعیین می‌شوند. وجود یک گیم پلی خوب است که می‌تواند تجربه‌ای خوب و بدون خسته و یا تکراری شدن در طی دقایق و یا حتی ساعات طولانی‌ای از بازی را به همراه داشته باشد.پیشرفت در روند بازیبازی یک سیستم سرگرمی پویا هست، بنابراین بازیکن نباید در روند یک بازی خسته و کسل شود. مواردی همچون وجود &#34;core loop&#34; در بازی، فرآیندهای پاداش و جایزه دهی به بازیکن طی فعل و انفعالات مختلف در بازی و... از جمله کارهایی هستند که در جهت بهبود و افزایش درگیر شدن بازیکن با بازی یا به اصطلاح &#34;engagement&#34; مورد استفاده قرار می‌گیرند.Clash royal core loopداستان و المان‌های بازیدر این بخش از طراحی بازی، پشت زمینه‌ای از داستان و عناصر اصلی موجود در بازی مشخص می‌شوند، توجه داشته باشید که منظور از داستان لزوما یک روایت کامل از یک بازی داستان محور نیست، برای مثال در یک بازی در سبک پلترفمر  (سکویی) معمولا المان‌های ما یک شخصیت اصلی بازی، تعدادی دشمن، تعدادی سکو و موانع دیگر می‌باشد که هدف و داستان کلی بازی نجات یک شاهزاده و یا مواردی نظیر آن می‌باشد. به عنوان نمونه‌ای دیگر، بازی دوز یا همان Tic Tac Toe را در نظر بگیرید؛ وجود داستان در این بازی ضرورتی ندارد، هرچند که ما المان های ضربدر، دایره و زمین 3*3 را در بازی داریم و همگی در این بازی طراحی و پیاده‌سازی شده‌اند.اسلحه‌ها، تروریست‌ها، ضدتروریست‌ها، بمب، گروگان‌ها اصلی ترین المان های بازی کانترطراحی مرحلهمراحل در بازی، پیشرونده فرآیندها، روایت بازی و چالش‌های آن است؛ یک طراح مرحله برای هر مرحله هدف‌ها، چالش‌های پیشرو برای رسیدن به آن هدف و المان‌های مختلف را با دید فنی و هنری تعیین می‌کند.گرافیکدر بازی‌ها، زیبایی و جذاب بودن گرافیک جزو ویژگی‌های مهم و جذب کننده مخاطب می‌باشد، همواره توسعه‌دهندگان در تلاشند که با استفاده از ابزارهای مختلف و با پیشرفت‌های نرم افزاری و سخت‌افزاری گرافیک بازی‌ها را به واقعیت نزدیکتر کنند و تجربه جذاب تری را برای مخاطب به ارمغان بیاورند. در ادامه به تشریح گرافیک سه بعدی و دو بعدی در اندروید می‌پردازیم:گرافیک سه بعدیبه طور کلی اندروید توانایی پشتیبانی از گرافیک 3 بعدی را ندارد اما می‌توان با استفاده از android NDK و یا کتابخانه openGl این مشکل را برطرف کرد. برای فهم گرافیک سه بعدی در اندروید، باید ابتدا نحوه شناسایی یک جسم سه بعدی برای اندروید را بدانیم.نقطه و مثلث (vertix and traingle)در اندروید از اصطلاح vertex برای نقاط در فضای سه بعدی استفاده می‌شود که می‌توان انها را با vector3 ساخت. مثلث از ترکیب نقاط در صفحه بدست می‌آید که اصلی‌ترین عامل در تعیین میزان هزینه پردازش پردازنده است. اشکال مختلف در اندروید ساخته شده از تعدادی از این مثلث‌ها هستند، برای مثال یک مربع را با 2 مثلث و یک مکعب را با 12 مثلث (6                    2) می‌توان ساخت.چند ضلعی یا Polygonدر اندروید به هر سطحی در فضای سه بعدی چندضلعی (polygon) گفته می‌شود که تشکیل شده از مثلث‌های پایه است.polygonشکل بالا مثالی از یک چندضلعی است؛ همانطور که می‌بینید این شش‌ضلعی دارای 4 مثلث و 6 راس است. نکته مهمی که باید به آن اشاره کرد این است که شما همواره باید سعی کنید تعداد چندضلعی‌ها (در واقع مثلث‌ها و راس‌ها) را کاهش دهید چرا که هزینه پردازشی زیادی صرف پردازش نقاط و مثلث‌ها در اندروید در گرافیک سه بعدی می‌شود و از سوی دیگر برخلاف کامپیوترهای شخصی یا کنسول‌ها در دستگاه‌های اندرویدی همواره محدودیت پردازنده داریم.رندرینگ سه بعدی (Rendering 3d)کتابخانه openGL مسئول ساخت اشیا سه بعدی در صفحه است و این کار را با کمک GLSurfaceView و GLSurfaceView.Renderer انجام می‌دهد. همچنین شکل فضا را مانند تصویر زیر در نظر می‌گیرد و از قاعده دست راست در بردارها نیز برای تعیین جهات استفاده می‌کند:بردارهای سه‌بعدیمش سه بعدی (3D Mesh)شبکه (mesh) ساختار اصلی یک شکل است که تشکیل شده از چندضلعی‌ها و مثلث‌ها و نقاط و حتی شبکه‌های دیگر است. برای مثال شبکه برای یک دلفین چیزی شبیه به شکل زیر است:یکی از سخت‌ترین قسمت‌های طراحی گرافیک بازی، طراحی شبکه برای اشیا داخل بازی است. مراحل ساخت یک شبکه در دیاگرام زیر آورده شده است:مراحل ساخت meshبافت یا Texturesبافت (texture) در واقع یک تصویر دو بعدی برای شبکه هاست (در مثال دلفین رنگ خاکستری روی شبکه) که روی آن قرار میگیرد تا بتواند واقعی‌تر بنظر برسند و شکل سه بعدی به خود بگیرند.سایه‌بان یا Shadersسایه‌بان‌ها (shader) برای تغییر دادن رنگ، شدت رنگ، کیفیت تصویر و خصوصیات از این دست در texture هستند تا عنصر مورد نظر واقعی تر بنظر برسد.متریال (Materials)متریال در واقع یک نگه دارنده برای بافت و shader است و می‌توان آن را به یک شبکه مقدار دهی کرد تا آن شبکه بافت و shader مورد نظر را به خود بگیرد.حال به محیط بازی در حالت سه بعدی می‌پردازیم:جهان سه بعدی (3D world)جهان بازی در اندروید یک شبیه سازی از دنیای واقعی است که با توجه به مکان، چرخش، زاویه و دوری و نزدیکی دوربین‌ها محدوده جهان ما هم مشخص می‌شود. جهان‌های مختلف عناصر مختفی را به نمایش می‌گذارند ولی همگی آنان در 3 موضوع اشتراک دارند: محدودیت منبع نور دوربین(ها)منبع نور (light source)بازی ها باید یک یا چند منبع نور داشته باشند. منبع نور بیشتر دو معنی می‌دهد: زیبایی و تاثیر بهتر بر بازی از لحاظ زیبایی شناختی و دیگری فشار بیشتر روی پردازنده. از این رو همزمان با اضافه کردن منابع نور مختلف برای افزایش زیبایی بازی باید حواسمان به بار پردازشی حاصل از ان هم باشد. منبع نور حالات مختلفی دارد (معمولا این حالات در اکثر موتورهای بازی یکسان‌اند) نور منطقه‌ای (Area light) نور مخروطی (Spot light) نور نقطه‌ای (Point liight) نور جهتی (Directional light) نور محیطی (Ambient light)نور حجمی (Volume light)ما در ادامه دو مورد اول را بررسی خواهیم کرد:نور محیطیبرای روشن کردن یک محیط مستطیلی یا دایروی استفاده می‌شود. این نور از یک جهت خاص و با شدت ثابت و برابر تابیده می‌شود.Area Lightنور مخروطیاین نور بسیار شبیه چراغ مطالعه‌ها با سری مخروطی است که نور را به صورت مخروطی (با تصویر بیضی روی سطح صاف) روی یک منطقه خاص می‌تاباند.Spot Lightدوربیندوربین یکی از مهم‌ترین عناصر بازی است که تایید کننده این است که چه فضایی از جهان و چه عناصری باید در حال حاضر رندر شوند. به طور کلی دو نوع دوربین داریم: دوربین با عمق (perspective) و دوربین عمود بر صفحه (orthographic):دوربین Perspectiveدر این نوع دوربین عمق و اندازه اجسام به خوبی قابل مشاهده است. این دوربین مخصوصا برای طراحی سه‌بعدی استفاده می‌شود.Perspective دوربیندوربین Orthographicاین دوربین برای طراحی دو بعدی ساخته شده اما می‌توانیم با ترفندهایی اشکال نیمه سه بعدی(2.5 بعدی) نیز با آن بسازیم. خاصیت این دوربین بی اثر کردن عمق اجسام در تصاویر است.دوربین Orthographicسیستم رندرینگ سه بعدیاندروید از pipeline کتابخانه openGL استفاده میکند تا برنامه را رندر کند.فرآیند رندریگ سه بعدی1. ابتدا vertex shader هر راس را با اطلاعات vertexمربوط به ان پردازش می‌کند.2. Control shader مسئول کنترل داده‌های vertex برای ساختن ابتدایی مثلث‌ها و موزاییک‌کاری است.3. این مرحله ضلع‌ها را می‎سازد. به عبارتی تقاطع چندضلعی‌های مختلف را شناسایی می‌کند بدون تکرار راس‌ها.4. Tessellation در واقع فرآیند کاشی کاری چندضلعی هاست به گونه ای روی هم نیفتند و یا فاصله بینشان نباشد.5. در این مرحله مثلث‌ها شکل می‌گیرند.6. حال شکل اصلی تکه تکه می‌شود (برای بهینه سازی).7. در این مرحله داده‌های اضافی vertexها حذف می‌شوند.8. حال شبکه را به قطعات کوچک تر (بطور تصادفی) تقسیم بندی می‌کنیم.9. حال fragment shaderقطعات حاصل از مرحله قبل را تحلیل می‌کند.10. حال همه ی پیکسل‌ها به مکان خود در صفحه map می‌روند.11. در آخر شبکه اماده شده و برای رندر نهایی وارد frame buffer می‌شود.گرافیک دوبعدیگرافیک دوبعدی از پیچیدگی بسیار کمتری نسبت به حالت سه بعدی برخوردار است، همین موضوع باعث شده برخی توسعه دهندگان تمرکز خود را برای تولید یک بازی اندرویدی روی گرافیک دو بعدی بگذارند.فیزیک در بازیدر توسعه بازی ها، برای شبیه سازی واقع‌گرایانه تر رفتار مواد تحت شرایط مختلف، از قوانین فیزیکی استفاده می‌کنیم که توسط موتورهای فیزیکی (Physics Engine) پیاده سازی و اجرا می‌شوند. با وجود این در اکثر موارد، فیزیک شبیه سازی شده در بازی‌ها تنها تقریبی از قوانین فیزیکی در دنیای واقعی است که این موضوع را می‌توان به تاثیر منفی محاسبات سنگین بر Performance بازی و نیز گاهی ایجاد جنبه‌های Gameplay غیر واقعی اعم از قابلیت Double jump در برخی بازی‌ها ربط داد.تشخیص برخورد (Collision Detection)شناسایی برخورد در محیط دو بعدیدر اکثر بازی‌ها برای شناسایی اکثر برخوردها از سیستم box-colliding استفاده می‌کنند. جعبه‌ای که در این روش استفاده می‌شود می‌تواند در دقت و نیز Performance تاثیر بسیار بگذارد. کم هزینه‌ترین روش برای شناسایی برخورد استفاده از مستطیل است که کمترین دقت را نیز دارد. البته در برخی موارد می‌توان از جعبه‌های مثلثی یا دایروی نیز استفاده کرد که به مراتب Performance کمتری دارند. حال برای شناسایی برخورد دو دایره رایج ترین روش‌ها را بررسی میکنیم.شناسایی برخورد دو مربعدر این روش هر دو دایره را مربع درنظر می‌گیریم. این روش از بین این روش‌ها کم هزینه ترین است اما دقت آن به مراتب کمتر است.محاسبات روش برخورد دو مربعشرط برخورد در این روش به صورت زیر می‌باشد:if (x1Max &lt; x2Min) {&#xA;// Not Collide&#xA;} else if (y1Max &lt; y2Min) {&#xA;// Not Collide&#xA;} else if (x2Max &lt; x1Min) {&#xA;// Not Collide&#xA;} else if (y2Max &lt; y1Min) {&#xA;// Not Collide&#xA;} else {&#xA;// Collide&#xA;}شناسایی برخورد یک دایره و یک مربعدر این روش تنها یکی از دایره‌ها را مربع در نظر می‌گیریم. این روش از بین این روش‌ها کمترین کاربرد را دارد.محاسبات روش برخورد دایره و مربعشرط برخورد در این حالت به صورت زیر می‌باشد:if (Ox1 + R1 &lt; Px1) {&#xA;// Not Collide&#xA;} else if (Ox1 &gt; Px4) {&#xA;// Not Collide&#xA;} else if (Oy1 + R1 &lt; Py1) {&#xA;// Not Collide&#xA;} else if (Oy1 &gt; Py2) {&#xA;// Not Collide&#xA;} else {&#xA;if (dP1 &lt;= R1) {&#xA;// Collide&#xA;} else if (dP2 &lt;= R1) {&#xA;// Collide&#xA;} else if (dP3 &lt;= R1) {&#xA;// Collide&#xA;} else if (dP4 &lt;= R1) {&#xA;// Collide&#xA;} else if (Px1 &lt;= Ox1 &amp;&amp; Ox1 &lt;= Px3 &amp;&amp; Oy1 + R1 &gt;= Py1 &amp;&amp; Oy1 &lt;= Py2) {&#xA;// Collide&#xA;} else if (Py1 &lt;= Oy1 &amp;&amp; Oy1 &lt;= Py2 &amp;&amp; Ox1 + R1 &gt;= Px1 &amp;&amp; Ox1 &lt;= Px3) {&#xA;// Collide&#xA;} else {&#xA;// Not Collide&#xA;}&#xA;}شناسایی برخورد دو دایرهاین روش نسبت به دو روش قبلی دقت بیشتری دارد و به همین دلیل پرهزینه ترین است.محاسبات روش برخورد دو دایرهشرط برخورد این حالت به صورت زیر می‌باشد:if (originDistance &lt;= R1 + R2) {&#xA;// Collide&#xA;} else {&#xA;// Not Collide&#xA;}شناسایی برخورد در محیط سه بعدیاستفاده از Mesh Collidersاین Colliderها می‌توانند برخورد واقعی اجسام را تشخیص دهند که محاسبات آن بسیار سنگین بوده و با هیچ الگوریتمی (اعم از Quadtree، kd-tree و AABB tree) نمی‌توان بصورت چشمگیری هزینه آنرا کاهش داد. قدیمی ترین و دقیق ترین روش، مثلث-به-مثلث بر روی هر سطح است به این صورت که هر تکه مش را به تعدادی جعبه تقسیم کرده و با اعمال یک AABB tree و حتی یک octree تعداد گوشه‌های آنرا کاهش می‌دهیم و اینگونه performance الگوریتم را افزایش می‌دهیم و سپس بر هم نهی مختصات گوشه‌های مختلف را بررسی می‌کنیم.Mesh colliderاستفاده از Primitive Collidersدر این روش تنها با جایگزین کردن اشکال هندسی سه بعدی مختلف، performance شناسایی برخوردمان را به مراتب افزایش می‌دهیم. با این وجود این روش دقت به مراتب کمتری نسبت به استفاده از Mesh Collider دارد.Premitive colliderتست بازیهمانطور که در بخش‌های قبلی نیز به آن اشاره شد، فرآیند ایجاد سرگرمی و به اصطلاح &#34;fun&#34; از جمله تفاوت‌های اصلی بین بازی و اپ می‌باشد که همین امر باعث افزایش پیچیدگی فرایند تولید یک بازی شده است، از این جهت که معیار مشخصی برای ارزیابی میزان احساسات همچون شادابی و سرگرمی و هیجان برای مخاطب وجود ندارد، با این وجود توسعه دهندگان بازی از روش هایی برای بهبود کیفیت و رفع مشکلات موجود در بازی‌ها از دید مخاطب استفاده می‌کنند؛ یکی از همین روش ها &#34;تست بازی توسط تسترها&#34; می‌باشد. یکی از مهمترین تفاوت های تست بازی با تست دیگر نرم افزارها، در تکراری بودن روند آن است، یک بازی بعد هر build که گرفته می‌شود ممکن است باگ‌هایی به بازی اضافه کرده باشد و باید حتما تست شود. در ادامه چند نوع از تست‌های رایج را به صورت مختصر بررسی می‌کنیم:تست فانکشنال: در این تست دنبال مشکلات کلی در بازی می‌گردیم، در واقع بررسی می‌کنیم که هر بخش از بازی وظایف که برای آن طراحی شده را به درستی انجام می‌دهد یا خیر، برای مثال در رابط کاربری، گرافیک، مکانیک‌های بازی، صداها و...تست سازگاری: در این تست میزان سازگار بودن بازی را با نرم افزار و سخت افزارهای مختلف دستگاه‎‌های هدف بررسی می‌کنیم، برای مثال با نصب و حذف کردن بازی روی سیستم عامل با نسخه‎‌های مختلف اندروید و همچنین با سخت افزارهای متفاوت.تست عملکرد: بررسی میزان فعالیت‌های در پشت بازی و به ویژه در سخت افزار. برای مثال میزان مصرف باتری و انرژی، میزان استفاده از RAM و CPU، میزان ترافیک مصرفی اینترنت و بهینه بودن فرایند رد و بدل کردن اطلاعات با سرور و سایر کاربران.تست استقامت: در این تست هدف به اجرا گذاشتن بسیار طولانی مدت بازی در حالات مختلف بازی است، برای مثال کاراکتر در حالت ایستاده به مدت 24 ساعت در محیط بازی بماند؛ از این روش برای پیدا کردن کرش کردن های از روی نشت حافظه و یا خطای رند کردن استفاده می‌شود.تست ریکاوری: توانایی بازیابی اطلاعات بعد از کرش کردن یا توقف ناگهانی بازی را با استفاده از این تست می‌سنجند، برای نمونه وقتی بازی در حال اجرا است دستگاه مربوطه را ریستارت می‌کنند تا بعد ببینند که بازی چگونه اطلاعات و شرایط قبلی را بازیابی می‌کند.مدل‌های درآمد زایی در بازی‌های موبایلیصنعت بازی سازی با وجود کم سابقه تر بودن نسبت به دیگر صنعت‌های سرگرمی همچون فیلم و سریال، در برخی سال های اخیر میزان گردش مالی بیشتری نسبت به بقیه داشته است. گردش مالی صنعت جهانی فیلم در سال 2019 برای اولین بار به بالای 100 میلیارد دلار رسید، این در حالیست که در سالیان پیش از آن گردش مالی صنعت بازی به بالای این مبلغ رسیده بود. نکته قابل توجه‌ی که وجود دارد امکان هزینه کردن تقریبا نامحدود برای نوع خاصی از بازی هاست که چنین امکانی برای فیلم و سریال وجود ندارد.مدل‌های مختلفی از درآمد زایی در بازی‌های ویدیویی وجود دارد:بازی‌های غیر رایگان: این دسته از بازی‌ها در ازای استفاده و سرگرم شدن با آن، یک مبلغ مشخص اولیه پرداخت می‌شود، همانند خیلی از موارد فروشی موجود در بازار.بازی‌های رایگان (F2P: Free to play): این دسته از بازی ها برای نصب و اجرای بازی هیچ مبلغی از شما نمی‌گیرند و به راحتی با دانلود کردن آنها به نصب و اجرای آن می‌پردازید. شیوه درآمد زایی از این نوع بازی‌ها متفاوت با دیگر صنعت‌ها می‌باشد. به صورت عمده دو شیوه &#34;پرداخت درون برنامه‌ای&#34; و &#34;دیدن تبلیغات&#34; برای درآمد زایی برای توسعه دهنده در این مدل بازی‌ها مورد استفاده قرار می‌گیرند.پرداخت درون برنامه‌ایدر بازی‌های F2P امکان بازی به صورت رایگان برای همه کاربران وجود دارد، اما توسعه دهندگان درون اینگونه بازی‌ها امکاناتی قرار داده‌اند که با داشتن آن امکانات و تجهیزات، سرعت پیشرفت در بازی چند برابر شده و به دنبال آن لذت و سرگرمی کاربر بیشتر از قبل می‌گردد، این امکانات یا به صورت مستقیم قابل خرید با پول واقعی هستند و یا با یک واحد پول مجازی در بازی قابل خریداند که خود آن پول مجازی را می‌توان به صورت مستقیم خریداری نمود. در اینجا لازم است که با دو مفهوم &#34;soft currency&#34; و &#34;hard currency&#34; آشنا بشویم؛ soft currency به مجموعه دارایی‌هایی در بازی گفته می‌شود که در طی گذراندن مراحل، ماموریت‎‌ها و به ثمره کارهای مختلف دیگر در بازی به عنوان پاداش دریافت می‌شود و نیز به کمک آنها می‌توان در بازی پیشرفت داشت و رشد کرد، این پیشرفت می‌تواند به واسطه استفاده مستقیم از خود دارایی در بازی باشد (مثل کیت‌های سلامتی و قدرت‌های ویژه یکبار مصرف) و یا مانند یک ارز مجازی برای خرید دیگر ویژگی‌های درون بازی استفاده شود (مانند سکه یا پول رایج در بازی‌ها). نکته‌ای که درباره soft currency وجود دارد این است که دراکثر بازی‌ها، این منابع به صورت مستقیم توسط پول واقعی، قابل خرید نیستند، بلکه توسط منابعی دیگر به نام hard currency ها قابل خرید هستند (می‌توان این عمل را تبدیل کردن ارزها نیز نام گذاری کرد). Hard currency ها منابع محدودتر و با ارزشتری نسبت به soft currency ها هستند و در بازی کمیاب تر بوده و به عنوان پاداش در جاهای خیلی محدود در بازی و به میزان کمتری به بازیکن داده می‌شود. این مدل ارز به هدف خرید بازیکن با پول مستقیم ایجاد شده و این امکان را به او می‌دهد که با هزینه کردن سرعت رشد و پیشرفت خودش را در بازی افزایش دهد.بازی Clash royalدر برخی بازی‌ها یک المانی با نام های &#34;انرژی&#34; یا &#34;قلب&#34; وجود دارد؛ این عنصر در واقع مجوز ادامه دادن به بازی است، با داشتن این دارایی است که می‌توانید به بازی کردن خود ادامه دهید و اگر در مرحله‌ای از بازی بازنده شوید، تعدادی از این دارایی شما کم می‌شود و وقتی به صفر برسد شما بایستی مدت زمانی را منتظر بمانید تا قلب یا انرژی شما ترمیم و بازگردد، همچنین امکان پرداخت مستقیم یا استفاده از hard currency برای پر شدن کامل انرژی یا نامحدود کردن آن برای مدت معینی (مثلا 24 ساعت) نیز در این بازی‌ها وجود دارد تا بازیکن بتواند بدون اتلاف وقت به پیشرفت در بازی بپردازد.بازی Score! Heroدر برخی از بازی‌ها از &#34;battle pass&#34; استفاده شده است، در این شیوه از بازیکن‌ها خواسته می‌شود که چالش‌هایی را انجام دهند و در ازای آن بر طبق یک الگوی مشخص، پاداشی را بازی به آنان می‌دهد؛ معمولا ارزش این پاداش‌ها در سطح معمولی بوده ولی در battle pass ها دو مسیر پاداش وجود دارد، یکی با ارزش معمولی و دیگری با ارزش پاداش‌هایی بالا، اما نکته‌ای که وجود دارد این است که به صورت پیشفرض مسیر پاداش‌های باارزش قفل است و برای باز کردن آن بایستی مبلغی را پرداخت کنید. معمولا جوری این مبلغ توسط توسعه دهندگان تعیین می‌شود که بازیکن پاداش‌های موجود در مسیر طلایی را با ارزش واقعی‌شان در فروشگاه بازی مقایسه کند و خرید بتل پس را به صرفه تر بداند و دست به خرید آن بزند.بتل پس در بازی soccer starsشیوه‌های درآمدزایی دیگر از طریق پرداخت درون برنامه‌ای نیز مانند گردانه شانس، bundle ها، اشتراک ویژه و... وجود دارند که ما در این نوشته به آنها نمی‌پردازیم.تبلیغات درون برنامهاز جمله دیگر شیوه‌های کسب درآمد، نمایش تبلیغات دیگران در بازی خود می‌باشد. ارائه‌دهندگان تبلیغ در شرایط گوناگونی مبلغی را به توسعه دهنده پرداخت می‌کنند، چند شاخص در این مورد وجود دارد که ابتدا کمی با آنها آشنا شویم:شاخص CPC: یا cost per click، ارائه دهنده تبلیغ در ازای هر کلیک بر روی تبلیغش مبلغ مشخصی را به توسعه دهنده پرداخت می‌کند.شاخص CPA: یا cost per action، در ازای انجام یک عملیات خاص توسط کاربر بعد از دیدن ویدیو مبلغی پرداخت می‌شود، مانند ثبت نام در سامانه پیامکی، سابسکرایب کردن و...شاخص CPI: یا cost per install، در ازای هر نصب بعد از مشاهده ویدیو توسط کاربر، مبلغی به توسعه دهنده پرداخت می‎شود.تبلیغات در بازی موبایلی نیز بر چندین نوع هستند برخی از آنها را در ادامه بررسی می‌نماییم :تبلیغات بنریاین تبلیغات معمولا توسط کاربر غیر قابل بسته شدن یا پنهان شدن می‌باشند، این نوع از تبلیغات یک مکان ثابتی از صفحه نمایشگر را در موقعیت‌های مختلف (بالا وسط، پایین وسط و..) و اندازه آنها نیز کوچک بوده و فضای زیادی از صفحه را اشغال نمی‌کنند، با این حال اکثرا توسعه دهندگان از این شیوه تبلیغاتی بخاطر تغییر در رابط کاربری و محدود کردن بخشی از صفحه نمایش‌شان استفاده نمی‌کنند.تبلیغات بینابینیاین مدل تبلیغات عکس‌های قابل کلیک تمام صفحه بوده که در زمان نمایش در بازی تمامی تصاویر و رابط کاربری بازی به پشت این عکس منتقل می‌شوند و یک دکمه ضربدر نیز دارد که با لمس محل مربوطه تبلیغ بسته شده و به بازی برمی‌گردد. بسته به نوع انتخاب توسعه دهنده، این نوع تبلیغ در هر جایی از بازی می‌تواند نمایش داده شود.تبلیغات ویدیوییاین مدل از تبلیغات بر دو نوع ویدیو کوتاه و بلند هستند؛ ویدیوهای بلند مدت معمولا بعد از مدتی دکمه skip یا رد کردن تبلیغ آن به کاربر نمایش داده می‌شود تا بعد آن بتواند تبلیغ را رد کند، اما تبلیغات کوتاه مدت قابل رد کردن نیستند و کاربر مجبور است تا اتمام کامل ویدیو منتظر بماند؛ معمولا اینگونه تبلیغات را در ازای پاداش مشخصی در بازی به کاربر نمایش می‌دهند تا بدون پرداخت مبلغی به صورت مستقیم و از طریق کیف پول، بتواند منابع مورد نظر خودش را بدست آورد.بازی Tilres Hopسخن پایانیفرآیند ساخت بازی ترکیبی از هنر، بخش فنی، برنامه‌نویسی و مهندسی است، فرآیندی سخت و طولانی، اما در عین حال لذت بخش. در صنعت بازی سازی بقدری حوزه‌های تخصصی و متنوعی وجود دارد که به هر میزانی که شما مطالعه در این زمینه داشته باشید، باز هم مطالب بسیار زیادی وجود دارد که حتی اسمشان هم به گوش‌تان نخورده است! بازی‌ها سرگرمی‌هایی هستند که می‌توانند باعث رشد خلاقیت، مهارت‌های فکری و واکنش سریع و بسیاری موارد دیگر بشوند، البته که هر تکنولوژی معایب خودش را نیز دارد و بایستی حواسمان به آنها نیز باشد.در آخر امیدواریم که این مطلب برای شما کاربردی بوده باشد و به دانسته‌هایتان افزوده باشد.سپاس فراوان از مطالعه و وقتی که برای این نوشته گذاشتید.نوشته پیمان حاجی محمد، یاسین موسوی، درین ستودهمنابع Roy, A., 2016. The Android Game Developer&#39;s Handbook. Packt Publishing. Guru99.com. 2021. Meet Guru99 - Free Training Tutorials &amp; Video for IT Courses. [online] Available at: &lt;https://www.guru99.com/&gt;</description><category>پیمان حاجی محمد</category><author>پیمان حاجی محمد</author><pubDate>Mon, 17 May 2021 00:51:13 +0430</pubDate></item></channel></rss>