چرا باید از دیزاین پترنها استفاده کنیم؟
دیزاین پترنها در اصل راهحلهای حسابشدهای برای مشکلات خاصی در پروسهٔ توسعهٔ نرمافزار هستند که پیش از این بسیاری از دولوپرها با چنین مشکلاتی دست و پنجه نرم کردهاند و یکسری سولوشنهای بهینهای را برای علاج کار خود برگزیدهاند. اگر به این مشکلات حلشده برخورد کنید، منطق حکم میکند که به استفاده از راهحلهای موجود بپردازید تا اینکه به دنبال اثبات راهحل جدیدی بوده و زمان ارزشمند توسعهٔ نرمافزار را هدر دهید!
۱- سینگلتون – Singletone
همنوطور که بالاتر گفتم الگوی سینگلتون جایی استفاده میشه که فقط به یک نمونه از کلاس احتیاج داریم و برای کارهایی مثل هماهنگی بخشهای مختلف سیستم، دسترسی به اطلاعات کاربر سیستم و غیره ازش استفاده میشه. یک نمونه ساده از سینگلتون در جاوا رو در زیر آوردم که از ویکیپدیا برداشتم.
۲- الگوی سازنده یا Builder Pattern
بسیاری اوقات پیش میاد که لازمه ما از کلاسی استفاده کنیم که ورودیهای متعددی داره و ممکنه تعدادیاز اونها هم مقادیر پیشفرضی داشته باشن و استفاده ازشون اجباری نباشه. یا مجبوریم همه این موارد رو داخل متود سازنده (Constructor) به عنوان ورودی بگیریم و مقدار دهی کنیم یا اینکه اول آبجکت رو بسازی و بعدش خط به خط با استفاده از متودهای setter مقداردهیشون کنیم. بنظر من که اصلا قشنگ نیست و کدمون رو خیلی شلوغ میکنه.
اینجاست که میتونیم از الگوی سازنده یا Builder Pattern استفاده کنیم که با استفاده از یک کلاس جانبی (و حتی بهتر یک inner class) با استفاده متودهای زنجیروار (chaining methods) اون مقادیر که میخوایم رو مشخص کنیم و اونایی هم که لازم نیست کلا بیخیال بشیم. کد زیر یک نمونه از استفاده از Builderها رو در اندروید نشون میده.
۳- تزریق وابستگی یا Dependency Injection
الگوی Dependency Injection که از این به بعد به اختصار DI صداش میکنم مثل این میمونه که شما وارد یک خونه مبله بشید. دیگه لازم نیست که از ابتدا مبل سفارش بدید یا اینکه خودتون چوب بخرید و از اول یک مبل بسازید.
برای مثال ما ممکنه کلاسهای مختلفی رو داشته باشیم که در جاهای متفاوت برنامهمون میخوایم ازشون استفاده کنیم. کلاسهایی مثل SharedPreferences یا کلاسهای مربوط به Retrofit و لود تصاویر و … که هر کدوم نیاز به یه سری ورودیهای اولیه برای شروع به کار دارن. تصور کنید چقدر سخته توی هر اکتیویتی یا فرگمنت مجبور بشید هر دفعه آبجکت Retrofit رو بسازید(دقیقا مثل اینجا).
استفاده از DI به ما اجازه میده که یکبار و فقط یکبار نحوه ساختن این کلاسها رو تعریف کنیم و بقیه جاها فقط اونها رو Inject و بدون دردسر استفاده کنیم. معروفترین ابزاری که برای DI وجود داره کتابخانه Daggerهستش.
نتیجهگیری
دیزاین پترنهای بسیار زیادی برای مطالعه باقی مانده و این در حالی است که در این مقاله تنها به برخی از مهمترینها اشاره کردیم ولی اگر در مورد دیزاین پترنها کنجکاو شدهاید، صفحهٔ ویکیپدیای دیزاین پترنها اطلاعات خوبی را در اختیارتان قرار میدهد و همچنین برای کسب اطلاعات بیشتر میتوانید کتاب Design Patterns: Elements of Reusable Object-Oriented Software را تهیه کنید که به عنوان یکی از بهترین کتابها در زمینهٔ دیزاین پترنها شناخته شده است.
نکتهٔ پایانی هم اینکه وقتی میخواهید از دیزاین پترنی استفاده کنید، همیشه ابتدا مطمئن شوید که قصد دارید مسألهٔ مناسب آن را حل کنید. در حقیقت، همانطور که در ابتدای مقاله بیان شد، این دیزاین پترنها مانند شمشیر دولبهای هستند که اگر در جای نامناسب خود به کار گرفته شوند، ۱۰۰٪ کارتان را خرابتر خواهند کرد اما اگر بتوانید آنها را به طور صحیح پیادهسازی کنید، دیگر چشمپوشی از آنها کار آسانی نخواهد بود و تسلط به آنها چیزی است که میتواند یک دولوپر عادی را به یک دولوپر تراز اول و حرفهای مبدل سازد.