استفاده از Static class یا Singleton ؟ یا میتوان بهتر عمل کرد؟ 🤔
وقتی میخواستم به شخصی در مورد این سؤال مشاوره بدهم، احساس دوگانگی عجیبی داشتم.
دو گزینهای که او مطرح کرده بود اینها بودند:
1️⃣ استفاده از یک کلاس استاتیک برای اتصال به پایگاه داده
2️⃣ استفاده از یک سینگلتون برای اتصال به پایگاه داده
واقعیت این است که من هیچکدام از این دو گزینه را واقعاً دوست ندارم... اما میخواستم شرایط مطرحشده را در نظر بگیرم. به نظر میرسید این پروژه، از آن دسته اپلیکیشنهایی نبود که نیاز به مقیاسپذیری داشته باشد؛ بیشتر شبیه یک پروژه سرگرمی یا چیزی با چرخه توسعه کوتاهمدت بود.
این موضوع برای من همیشه کمی سخت است که با آن کنار بیایم، چون معمولاً سعی میکنم سیستمها را طوری طراحی کنم که قابل توسعه و ماندگار باشند. اما این محدودیتها وجود داشت و این هم تنها گزینههای مطرحشده بودند.
در این شرایط، من سینگلتون را انتخاب میکنم — و حتی نوشتن این جمله هم برایم کمی ناخوشایند است 😅
حقیقت این است که استفاده از یک کلاس استاتیک برای چیزی که حالت (State) دارد، میتواند خیلی راحت منجر به بروز باگ شود؛ چون عملاً هیچ کنترلی بر اینکه چه کسی میتواند به آن کلاس دسترسی داشته باشد، ندارید.
در مورد سینگلتون هم میتوان همین استدلال را مطرح کرد، اما نکتهای که میخواهم اضافه کنم این است که سینگلتون ذاتاً نیازی ندارد که از همهجا قابل دسترسی باشد… فقط اغلب به این شکل پیادهسازی میشود.
هدف از سینگلتون این است که اطمینان حاصل کنیم بیش از یک نمونه از یک شئ ساخته نمیشود. اما برای رسیدن به این هدف معمولاً به این معنی است که آن شئ از همهجا «قابل دیدن» خواهد بود… معمولاً همینطور است.
به نظر من، شروع با سینگلتون به شما یک نمونه (Instance) میدهد که میتوانید دسترسی به آن را بهتدریج محدود کنید. میتوانید شروع کنید به ارسال آن از طریق سازندهها (Constructors). میتوانید کمکم از تکیه به ویژگی سراسری (Global Instance Property) فاصله بگیرید.
در واقع، این کار یک قدم شما را به سمت طراحی بهتر نزدیکتر میکند؛ یعنی جایی که در ابتدای برنامه، یک نمونه از شئ میسازید و آن را به قسمتهای مختلف پاس میدهید. خوشبختانه بسیاری از فریمورکهای تزریق وابستگی (Dependency Injection) این روند را برای ما بسیار خوب مدیریت میکنند.
پس در نهایت، هیچکدام از این دو گزینه انتخاب مورد علاقه من نیستند، اما سینگلتون بهنظر من «شرّ کمتر» است (هرچند خیلی جزئی!) و ما را کمی به سمت الگوهای طراحیای که ترجیح میدهم، پیش میبرد.
Post #366
282